tomo_manaのブログ

Unityで一からゲームを作る方法を紹介しています。

Unity学習#11 (Unity 2019.4.1f1) 操作の観察

今回から、ステータスとコマンドの表示に挑戦しようと思ったのですが、よく考えたらステータスとコマンドって、RPGの操作の肝というか、そう簡単にこれと一つに決められないなと今更ながら気づきました。そこで、今回は操作に関するデザインの観察とキー配置について考えました。参考にしたRPGのタイトルが古いですが、古いゲームの方が単純なインターフェースなので、まず古いゲームから考えていきます。最近のインタフェースにも興味があるので、そちらはそのうちに調べたいと思います。

スケーラビリティについてもざっくりと検討したかったので、キー配置について、ゲーム機(OS)間のインタフェースの違いを少しだけ掲載しています。androidiOSPlayStation系、Xbox系について触れています。

ステータスとコマンド

ステータス

そもそも論になりますが、RPGは「ロールプレイングゲーム」の略ですが、もともとは戦争をモチーフにした駆け引き(ボードゲーム)が起源と言われています。自分の殻を破る探索・冒険の先にある敵(障害となる相手)との駆け引き(衝突や葛藤)が描かれます。「ゲーム」そのものも、「試合(死合)」の意味で、やはり何か/誰かとの駆け引きになります。壮大な外の世界への探索・冒険だけでなく、心の内面への探索などにも同じモデルが適用されることがありますが、同じく駆け引きがあります。葛藤や摩擦があって、命の削り合いがあります。駆け引きに必要なものは「体力」「削る力」「削る速さ」の3要素です。

  • 体力(消費の対象)
  • 削る力(消費の単位)
  • 削る速さ(消費行動の優先度)

コマンド(端末への入力)

RPGでは、冒険・探索の中や自分の外にある何か/誰かとの接触があります。その一部は謎解きを含みます。謎解きには、「調べる」が生じます。また、調べるには、必ず「中断」があります。あらゆるコマンド(命令、指示)は、進む/深める要素と戻る要素があると考えると、2つの異なる入力が必要になります。それと移動手段=十字キーが必要です。

  • 調べるボタン
  • 中断するボタン
  • 選択するボタン(十字キー

コマンド(ゲームへの指示)

ゲームへの指示は、「自分の状態を知る」ことと、「対象に何かをする」があります。「持ち物を使って」物事を解決することもあります。この持ち物は時代を超えて、「アイテム」や「武器」「呪文」など、様々な要素があります。しかし「使う」ことは共通しています。「装備する」は「使う」ものを毎回選択することを省略しています。

  • 状態を知る
  • 持っているものを選ぶ
  • 持っているものを使う

ステータス表示のタイミング

ステータス表示のタイミングは、少なくとも3つあります。「常時」「ボタンを押した時」「待っている時」です。「待つ」のは、時間を意識させない初期のRPGにおいて、狭い画面をできるだけ広く使うために工夫したものです。

  • 常時
  • ボタンを押す
  • 待つ

過去のタイトルの比較

ここからは、過去のタイトルについて比較します。過去のタイトルが、「常時」「ボタンを押した時」「待っている時」に、どのように「状態」や「コマンド」を表示したかを比較します。比較すると、各タイトルの情報の仕方だけでなく、ゲームプレイヤーを飽きさせない工夫が随所に隠れていることに気づかされます。ユーザーインタフェースは、ベストプラクティスはあっても、絶対解のない世界かもしれません。実装だけでなく、画面の向こう側にいるプレイヤーとの対話の形を模索する、製品開発の本来の目的に、開発者を立ち戻らせてくれます。

RPG

ここでは、昔のターン制のゲームを考えます。Nethack/ローグは、知らない人も多いですが、「トルネコの不思議なダンジョン」などの基になったゲームと言われています。

ゲームタイトル 常時 待ち ボタン押下
ドラゴンクエスト (初代:1986) -- 状態 コマンド
ファイナルファンタジー (初代:1987) -- -- コマンド+状態
Nethack (ローグ系:1987) 状態 ヒント コマンド

アクションRPG

ここでは、昔のリアルタイムバトルのゲームを考えます。マインクラフトは最近ですね。

タイトル 常時 待ち ボタン押下
ゼルダの伝説 (初代:1986) 状態 アイテム選択
聖剣伝説2 (初代:1993) 状態 コマンド(円形)
マインクラフト (2011~) 状態 コマンド+アイテム

敵が止まってくれないアクションRPGは「常時」状態を表示するのに対し、自分が動かなければ敵も動かない初期のRPGは、ゲームプレイヤーが「待つ」というタイミングを非常に重視したと考えられます。

PCゲームでのキー配置

先ほどの話から、初期のファミコン十字キー+AB2つのボタンでできていたのが本当に洗練されたミニマルなデザインと感じました。最近は6~8ボタン、PCゲームになると特定のアイテムやキー操作のショートカットまで含めると、キーボードの1/3~1/4は使用しているようです。各メーカーのキー配置はそれぞれ異なりますが、PCゲームについていうと、少なくとも「WASD」か「ESDF」に分かれるようです。それぞれの名前は十字キーに使用する4つのボタンを指しており、これは右手でマウス(カーソル+クリック)、左手で補助的にキーボードを使うことを想定しているようです。

WASD

f:id:tomo_mana:20200731070604p:plain
WASD

ESDF

f:id:tomo_mana:20200731070622p:plain
ESDF

昔の両手式PCゲーム(記憶)

f:id:tomo_mana:20200731073722p:plain

媒体ごとのキーの取得

以下は汎用的なキー配置の検討のためにざっくり調べたもので、自分で確かめていない部分が多いです。しかしながら、複数のゲーム機に対応したい時に、どんな操作感を検討したらを検討するのに役立つと思い、以下にまとめました。

PC

Unityでは、PCで操作/デバッグするためのデフォルト設定があります。これはInput Managerと呼ばれるもので設定します(最近はInput Managerの後継的な仕組みがあり、次回とり上げます)。UnityではWASDがデフォルトです。また、以下の通り、十字キー、Ctrlなど文字以外のキーが積極的に使われており、文字キーに対しては、自由に割り当てられる状態であることが分かります。また、マウスクリックにCtrl、Alt、Shiftと同じ機能を持たせていることが分かります。(どのキーにどんな機能を持たせるかは、先ほどのInput Managerで変えられます)

f:id:tomo_mana:20200801001841p:plain
Unityデフォルト(Keyboard)
f:id:tomo_mana:20200801233235p:plain
Unityデフォルト(Mouse)

Unityでは、キーイベントを2種類で定義しています。どの端子が押されたかをキーコード(KeyCode)と呼び、その端子がどういう意味で通知されるかをバーチャル軸(Axis)またはボタン(Button)と呼んでいます。

入力端子 キーイベント名 バーチャル軸名/ボタン名
インタフェース Input.GetKeyDown(key/name) Input.GetButtonDown(buttonName)
引数 (KeyCode/String) (String)
KeyCode.LeftArrow "Horizontal"
KeyCode.RightArrow "Horizontal"
KeyCode.UpArrow "Vertical"
KeyCode.DownArrow "Vertical"
W KeyCode.W "Vertical"
A KeyCode.A "Horizontal"
S KeyCode.S "Horizontal"
D KeyCode.D "Vertical"
Ctrl KeyCode.LeftControl "Fire1"
Alt KeyCode.LeftAlt "Fire2"
Shift KeyCode.LeftShift "Fire2"
Space KeyCode.Space "Jump" & "Submit"
Enter KeyCode.Return "Submit"
Esc KeyCode.Escape "Cancel"
左クリック KeyCode.Mouse0 "Fire1"
右クリック KeyCode.Mouse1 "Fire2"
中央ホイールクリック KeyCode.Mouse2 "Fire3"

キーの入力は、パソコンキーボードにあるボタンの他に、特定のメーカーのコントローラにしかついていない入力素子(JoyStick/3rd Axis以降)があります。どのキーがどのイベントで通知されるかはWindowsなど開発に使用するOS、各ゲーム機用のコントローラの仕様の両方で規定されています。各端末のキー配置は、実際にゲーム機用の端末を接続して確認することになります。しかし、先述のInput Managerを使うことで、複数のゲーム機で共通のコードを組むことが可能です。今後、Unityがバージョンアップを重ねることで、各ゲーム機の入力はもっと調べやすくなるのではと期待します。
先ほどのInput Managerと関係して、Unityでは、複数のゲーム機に対応するために、物理的なキーの名前(KeyCode)よりも、どんな意味合いを持ったキー(Axis/Button)が押されたか、という視点で作り込むことが奨励されています。後者の場合、押されたかどうかの確認にはGetButtonDown()を使用し、押された量の確認にはGetAxis()を使用します。GetButtonDown()に使われているのがボタン名で、GetAxis()に使われているのがバーチャル軸名ですが、どちらもInput Managerでは"name"という名前で定義されています。

(参考:Unityリファレンス)
KeyCode - Unity スクリプトリファレンス

この記事に一通りまとめた後で、Input Manager が新しくなったことを知りました。次回のキー配置を考える時に、一緒に確認したいと思います。
tsubakit1.hateblo.jp

iPhone

iPhoneは、基本的に画面のタッチイベントを使用します。
一つだけあるボタン(ホームボタン)について、有力な情報が得られていません。KeyCode.Homeでしょうか?

後述するandroidと共通ですが、タッチイベントについては、入力端末が無い場合、指1本の動作に限って、マウスで代用ができるようです。

Input.touchCount : 触れている指の数
Input.touches[] : それぞれの指が触れている場所(1本指の場合、touches[0])
.position : 押した瞬間、離した瞬間の場所を記憶します。
.mousePosition : 押し付けている間、現在の場所を記憶します。
TouchPhase.Begin, Moved, Ended : 押し始めか、押し中か、離した瞬間か

deve-cat.com

android

android端末も、iPhoneと同じく基本的には画面のタッチイベントを使用します。
物理的な端子は2つ、または3つのキーがあります(全くないものもあります)。現物が無いので、既存のサイトの記事を参考にするしかありませんが、KeyCode.Escape, KeyCode.Home, KeyCode.Menu と思われます。(キー配置は端末によって異なるようです)

matudozer.blog.fc2.com

以下はゲーム機毎のキーマップをまとめていただいている方がいらっしゃるので、紹介だけです。かっこ内の数字は、備忘のためいつ頃発売されたゲーム機かを示しています。

PS Vita (2011-)

qiita.com

Xbox One (2013-)

hakonebox.hatenablog.com

尚、今回のキーボードとマウスのイラストは以下のサイトからお借りしました。ありがとうございます。
キーボードのイラスト・無料イラスト素材倉庫/人体図イラスト・フリーダウンロード

次回やること

キー配置の決定、ステータス、コマンド画面設計