Unityゲームエンジンの入力システム「 Input System」で使用するInput Actionアセットの編集方法を解説します。旧InputのInput Managerに該当する機能です。
Input Actionアセットの構成
Input ActionアセットはInput Systemの核となる入力デバイスからの入力信号をどのようにまとめて最終的な出力をするかを決めるアセットです。
主に、場面ごとに切り替えるマップ(Action Maps)、各入力デバイスの入力結果を1つの結果にまとめるアクション(Actions)、各入力デバイスから新たな仮想デバイスを作る(Composite)、各入力デバイスの出力結果をc#で読み取れる形にするコントロール(Control)の4項目からなります。
アクションやComposite、コントロールは、入力デバイスからの出力タイミングを加工して別の出力タイミングに変更するInterractions、入力デバイスからの出力値を加工するProcessorsが存在します。
また、コントロールやCompositeにコントロールスキーマ(Control Schemes)を付与することで、そのスキーマの挙動のみに対応するようなことが可能です。
イメージは次の通りです。
マップ(Action Maps) | マップ画面・メニュー画面・ミニゲームなどの場面ごとにアクションを切り替えます。 |
アクション(Actions) | 決定、キャンセル、キャラ移動などそのボタンで作用する動作 |
Composite | 複数のコントロールを1つにまとめて、新たな仮想的な1つのコントロールに見立てます。4つのコントロールを合わせてVector2にする(移動)、2つのコントロールを合わせて(-1~1)の値を取得するなど |
デバイス(Control) | デバイスの値、マウスの右クリック、Keybordのスペースなど1つ1つの項目を取得します。厳密にはデバイスではなく、コントロールですが、認識的にはデバイスの値と思って問題ありません。 |
コントロールスキーマ(Control Schemes) | 各デバイスをプロジェクト用にグループ分けする機能。主にマルチプレイのための機能で、スキーマを指定すると、それ以外のスキーマの操作を無効化することができます。 |
Interaction | ダブルクリック、ホールドなどの判別をし、新たに出力タイミングを変更する機能。 |
Processor | 拡大、ノーマライズ化、端数処理など数値を加工する機能 |
マップはゲーム中で操作方法を全く異なるようにしたいぶん増やします。例えば通常時、ミニゲーム時、UI操作で操作方法が切り替わるなど。各マップについて、操作方法分だけActionsを作成します。例えばマップが通常時の時は画面移動、メニュー遷移ボタン、攻撃ボタンの3種類が考えられる場合は3つ用意します。それぞれのアクションの下はアクションとコントローラーを結び付ける設定を行います。
では、それを踏まえた上で空のInput Actionアセットを使って処理を増やしていきます
Input Actionアセットの作成
空のInput Actionアセットの作成
Projectを右クリックしてCreate > Input Actionsを選択します。
予め軽い処理が書かれているInput Actionアセットの作成
何らかのGameObjectにPlayerInputコンポーネントを追加します。InspectorにCreate Actionボタンがあるので押すと作成できます。
マップ(Action Maps)
Action Mapsは使いたい場面ごとに分ける機能です。RPGで言えば、通常移動時、戦闘時、ミニゲーム時、UI操作などで切り替えます。
すると、「戦闘時と通常移動時で同じアクションを使用していたけど、戦闘時だけ変えたい」などの場合、コードを一切変更することなく、戦闘時のアクションのコントローラを変更するだけで、簡単に対応できます。
ActionMaps右の+ボタンを押すと追加、タイトル名をダブルクリックで名称変更、タイトル名を右クリックでコピー、カットなど一通りのメニュー機能があります。
アクション(Actions)
1つの動作に対する行動。RPGの通常移動時で言えば、キャラ移動、ダッシュ、メニュー、決定・調べるなど。旧Input ManagerのAxisに該当する機能です。
それぞれのアクションに対して複数のコントローラを指定でき各コントローラの1つでも入力があった場合に値を出力するため、使用側はマップとアクションを指定すれば、問題なく入力値を取得できます。
Actions右の+ボタン、タイトル名をダブルクリックで名称変更、タイトル名を右クリックでコピー、カットなど一通りのメニュー機能があります。
今回はMove,Deside,Menu,Dashを作成し、MoveのAction TypeをValue、Cntrol TypeをVector2、他3つのAction TypeをButtonにします。
Action Type
紐づいている複数のデバイスから入力状態があった場合の挙動を決める項目です。
シングルプレイヤーの場合は、1回押したら何か反応する処理はButton、それ以外はValueで問題ありません。
Value
コントロールの状態を常に監視する必要がある場合に選択するアクション型。値が変更するたびにStarted、Performed、Cancelledなどアクションのフェーズが変化し、コールバックが返されます。
複数のデバイスから入力があった場合、フェーズを維持しつつ新たな入力状態を取り入れます。
つまり、複数のデバイスから入力があった場合でも、1つのデバイスから入力があるかのように振る舞います。
Button
Buttonコントロールのみに適用できるアクション型。基本的にはValueと同様の挙動ですが、バインドしている複数のデバイスから同時に入力があった場合に再度Startedを発生させます。1回のみのトリガーを取得することを想定しています。
つまり、どのデバイスでもボタンが押された瞬間にTriggerが発生します。
Pass-Through
紐づいているデバイス全てについて個別にコールバックを返します。それぞれの入力デバイスを独立して扱う場合を想定しています。
つまり、状態がPerformedの時にでも、Startedが呼ばれるなど、一つ一つのデバイスで状態の遷移が起こります。
Control Type
アクションの型や挙動を決める項目。入力値から最終的な出力型を決定します。なお、Action TypeがButtonの時は自動的にButton型です。
詳細は省略しますが、最終的に使う側に渡したい型になる項目にすればよいので、通常はButton(出力はfloat)、Vector2,3型、たまにKey(出力はKeyCode)になるかと思います。他の型はどちらかと言えばこの場面での使用では無く、もっと深い箇所、デバイスをC#で使える形に変換するところで使用している型です。
コントロールのバインド
アクションはバインドによって各デバイスを紐づけることができます。各アクション項目の右の+ボタンでAdd Bindingを選択します。PropertiesのPathから入力デバイスとボタンを選択します。
選択できるPathは選択したControl Typeにより使えない項目もあります。
これで、キーボードのEnterキーか、マウスの右クリックを押したらアクション「Deside」が入力を検知することが可能になりました。
Composite
さらにInput SystemにはCompositeという概念があります。これは複数のコントロールを組み合わせて仮想的な1つのコントロールを作り上げる機能です。
例えば、2D Vector Compositeは4つのAction TypeがButton型のコントロールをバインドし、それぞれをX軸の正、X軸の負、Y軸の正、Y軸の負に置き換えます。トップダウンのキャラクター移動などに利用できます。
アクションの+ボタンをクリックすると、そのControl Typeに対応するCompositeが表示されます。一番上のAdd Bindingは上記のコントロール1つに対応したバインドであるCompositeではありません。その下以降が利用できるCompositeになります。
では、キャラクターの移動を実現してみます。Move横の+ボタンを押してAdd 2D Vector Compositeを選択します。2D Vectorには紐づく形でUp,Down,Left,Rightの4つの名称のバインディング設定項目が作られます。
UpにキーボードのW、DownにキーボードのS、LeftにキーボードのA、RightにキーボードのDをバインドします。
一応、2D Vector Compositeは完成です。ですが、ついでにMoveにもう一つ、普通のバインディングもしましょう。Moveの+ボタンを押してAdd Binding、そしてGamepadのLeft Stickを選択します。
これでWASDキーとゲームパッドの左スティックで移動を行えるようになりました。
どうして、1つの同じアクションの中に、Compositeと1つのバインディングがに共存できるか、それは出力が共にVector2のためです。アクションは2つのVector2の値を監視しつつ、Action Typeに合った適切な方法でフェーズを変更しつつVector2を出力します。
逆にControl TypeがVector2の場合、マウスのクリックやゲームパッドのボタンのような単一のButton型は選択ができないようになっています。
デフォルトのComposite一覧
以下、簡単にデフォルトで用意されているCompositeを紹介します。
Add Binding | 一つのボタン押下反応。Compositeとは無関係の通常のコントロールのバインディング |
Add 1D Axis Composite | 左右のみなど1次元に絞った移動。値をfloat値で取得。 |
Add 2D Vector Composite | 上下左右など2次元の移動。値をVector2で取得。 |
Add Button With One Modifer Composite | ボタン2つ同時押しでfloat型の値を取得 |
Add Button With Two Modifer Composites | ボタン3つ同時押しでfloat型の値を取得 |
その他、詳しくは以下のページで解説しています。
Control Schemes
スキーム(Control Schemes)は、各コントロールをグループ別に分ける機能です。グループとは、いわゆる複数プレイに対するコントロールの振り分けです。なので各スキーム=1P、2Pのようなイメージで考えてください。厳密には異なるのですが、最初はこの理解で大丈夫です。
左上、Action Mapsの上のSchemes名(最初はNo Control Schemes)右の下矢印をクリックし、Add Control Schemeを選択、スキーム名と担当するデバイスを決めて決定します。
例では、名称「Key&Mouse」、使うデバイスはキーボードとマウス、キーボードはRequirementsをRequired、MouseはOptionalにしています。これはキーボードが存在してスキーマのアクションが機能することを意味します。マウスはあっても無くてもかまわない認識です。
加えて、名称「Gamepad」でデバイスGamepad、requirements=Requiredを作ります。
すると各コントロールのPropertyにUse in Control Schemesが追加されます。それぞれ、どのスキーマが使用するかチェックを入れます。
左上でスキーマを選択していると、それ以外のスキーマにしたコントロールは全て画面上から見えなくなります。All Control Schemesを選択すると全てのコントロールが見えるようになります。
以上で、基本的なInput Actionアセットの設定は完了です。でも、Input Systemには出力する値やタイミングを変更する強力な機能があります。それが次に紹介するInteractionsとProcessorsです。
InteractionsとProcessors
Interactions
Interactionsは、コントロールから値や値を受け取るタイミングを元に新たなタイミングを提供する機能です。コールバック等で受け取るStarted、Performed、Canceledのタイミングを任意に変更できます。
具体的には、通常はボタンを押したら・離したらの単純なタイミングですが、タップしたら、ダブルクリックしたら等の新たなタイミングでコールバックを設定します。
詳しくは以下のページで解説しています。
Processors
Processorsは、コントロールから受け取った値を元に新たな値を設定する機能です。
具体的には反転する、小さい値を捨てる(RedZone)、ノーマライズ化等の数値変化を行います。
詳しくは以下のページで解説しています。
Composite・Interaction・Processorの違い
ちょっとこの3つが分かりにくいので、以下表にまとめてみます。
Composite | 複数の入力キーをまとめる |
Interaction | 入力キーのタイミングを変更 |
Processor | 入力キーの値を変更 |