Unity Input Systemは、マウス、キーボード、ゲームパッド、タッチスクリーン等のデバイスそれぞれの操作についてActionに纏め一括管理することが出来るPackageです。
また、すべてのデバイス、プラットフォームで使い勝手の良い入力管理システムを実現する為の新しいシステムとのこと。
Input Managerの廃止?
現段階では、現行の Input Manager の廃止時期は決定していません
新しい Input System のご紹介
(旧) Input Managerは廃止されるようですので、早めに勉強しておきたいところです。
Input Systemの導入
プロジェクトにInput Systemを追加する
導入手順
- 「Window」メニュー「Package Manager」を開きます。
- 「Input System」を選択し追加します。
Input Systemの設定
入力を有効にする
Input Systemを有効にする手順
- 「Edit」メニューから「Project Settings」>「Player」を開きます。
- 「Active Input Handling」を「Input System Package」もしくは「Both」にします。
- エディタを再起動します。
設定画面を開く
Edit>Project Settings
からInput System Package の設定を行います。
Create settings asset
Input Systemを使用する
一連の流れ
下の図は使用する際の雰囲気まとめです。
左から順の流れですが、制作手順としては右からとなり、
- 何らかの実行したいComponentの動作「OnSomething()」を作ります
- 「Player Input」Componentを取り付けます
- 「Input Actions」のActionに「Something」という操作を作ります
- 「Something」に対応したデバイス操作「キーボードのキー」「マウスのボタン」等を紐付けます
- 「Player Input」を設定します
- 「Actions」に作成した「Input Action Asset」を取り付けます
- 「Behavior」を「Messages」「Invoke Unity Event」に設定してメソッドを実行できるようにします。
- 必要ならば画面上のUI(EventSystems等)から特定の操作に紐付けます
- Event Systems(ゲームオブジェクト)の「Standalone Input Module」を「Input System UI Input Module」に換装します
- 「Input System UI Input Module」の「Pointer Behavior」を「All Pointer As Is」に変更します
※1→2の手順で「On」が抜けています。
これは「Input Action Asset」の「Actions」で作った「Action」の名前の先頭に「On」を付けたMessageを発行するためです。Unity Eventから実行等する場合は関数名は何でも大丈夫ですが、自動生成のメッセージは固定されるため二度手間ポイントでした。
Player Inputコンポーネント
「Player Input」Componentを取り付け、新たにアクションを作成するか、既存の「Input Action Asset」を取り付けます。Player Inputを取り付けたオブジェクトから、そのオブジェクトや子階層にメッセージ発行、イベント起動を行います。
Input Action Asset(インプットアクションの管理画面)
Input Action Assetは以下の要素で構成されます。
- Schemes
- Action Maps/Action Map
- Actions/Action
- Interactions
- Processors
- Binding (+ Vector 2 Composite)
- Interactions
- Processors
Schemes
ここでのSchemeは、マウスやキーボード、ゲームパット等のセットのことです。使用するデバイスを追加します。
Schemesの役割は2種類あり、
「Schemeの追加、編集」と「Actionsに表示するデバイスの絞り込み」を行います。
項目 | 機能 |
All Control Schemes | 全てのSchemeをActionsに表示 |
各Scheme (Game Pad, Mouse, etc) | Actionsの表示を選択したSchemeに絞る |
Add Control Scheme | Schemeの追加 |
Edit Control Scheme | 選択しているSchemeの編集 |
Duplicate Control Scheme | 選択しているSchemeの複製 |
Delete Control Scheme | 選択しているSchemeの削除 |
Action Maps
新しいAction Map を作成するには、Action Maps右の「+」アイコンをクリックします。
Action Mapは操作する対象となる に分けて作成します。(UI操作、Player操作等。)
Actions / Action
新しいActionを作成するには、Actions右の「+」アイコンをクリックします。
ActionはそのAction Mapに属する動作毎に分けて作成します。(Playerの方向入力Move等。)
Property/ Action
実装の例
実装する入力 | Action Type | Control Type |
アナログパット、方向キー | Value | Vector 2 |
マウス、ペンポインター座標 | Pass Through | Vector 2 |
キー、ボタン | Button | – |
Property/ Interactions
ダブルクリックや押しっぱなしへ対応する場合に使用します。
Property/ Processors
受ける値を加工する場合に使用します。
作ってみたもの
Eventを起動する
「UnityEvent」画面全体でクリックイベントを受け、表示を切り替えます。
メッセージを発行する
「Message」:マウス座標を取得し、TextMeshProに表示します。
UIから入力を受け付ける
UI操作をデバイスに紐付けます。
その他
反応しない場合の確認項目メモ(更新中)
Messagesが受け取れているか確認します。
using UnityEngine;
public class InputTester : MonoBehaviour
{
public void OnDeviceLost() => Debug.Log("OnDeviceLost");
public void OnDeviceRegained() => Debug.Log("OnDeviceRegained");
public void OnControlsChanged() => Debug.Log("OnControlsChanged");
public void OnNavigate() => Debug.Log("OnNavigate");
public void OnSubmit() => Debug.Log("OnSubmit");
public void OnCancel() => Debug.Log("OnCancel");
public void OnPoint() => Debug.Log("OnPoint");
public void OnClick() => Debug.Log("OnClick");
public void OnScrollWheel() => Debug.Log("OnScroolWheel");
public void OnMiddleClick() => Debug.Log("OnMiddleClick");
public void OnRightClick() => Debug.Log("OnRightClick");
}
何も表示されない場合
Project Settings>Input System Package内Update ModeをManuallyからDynamic、Fixed Updateに変更
表示される場合(Input System外で発生)
手前に表示されているUI等によってレイキャストがブロックされている。(関係のないRaycast Targetのチェックを外す)
コードの引数が間違っていてパラメータを受け取れていない。
Event System等
Input System UI Input Moduleがシーン内に存在するか、Actions Assetが設定されているか確認します。
入力デバッガ
Window>Analysis>InputDebugger
デバイスをダブルクリックするとデバイスの詳細情報画面が開きます。
サポートしていないもの
旧入力、OnMouseEnter,OnMouseDrag等は新InputSystemからは呼び出されない。
デバイス
Windowsでのペン入力は「Windowsインク」がオフになっているとWacomデバイスで機能しない。
使用しているタブがWacomではないので要検証。
その他の制限
感想
他のブロガーさんと大体同じですが、出来る事(入力の受け方)が多いので複雑&混乱要素が多いと感じました。
コールバック
Input Action Assetに直接コールバックを登録する形に関しては、仕様をしっかり決めている状態からでないと辛いと感じました。(著者が場当たり的過ぎる問題)
Input Actionsを変更すると、後ろの処理も変更する必要があるためです。
これは、作成順序として「Input Actionsで特定の動作を作成」それに対して「対応する処理を作成」という流れが効いています。
(一応全てPlayer InputからMessagesで受ける事で切り離し、回避は可能です)
コードの混乱
Input Action Assetに付けた名前を使用する場面が多く競合はしないものの、同じ内容を書き直す場面も…。(Ctrl+Shft+LはVSCodeの最強魔法)
今後やりたい事メモ
ブログに使用しているテーマ(CSS)をUnityに移植。→UXML、USSにInput Systemが対応した後。
メモ時のバージョン
Unity 2019.3.8f1
Unity 2019.4.1f1
Unity 2020.1.17f1
Input System Version 1.0.0
Input System Version 1.0.1
コメント