Input Systemの勉強(v1.0.1)【Unityメモ】

Unity Input Systemは、マウス、キーボード、ゲームパッド、タッチスクリーン等のデバイスそれぞれの操作についてActionに纏め一括管理することが出来るPackageです。

また、すべてのデバイス、プラットフォームで使い勝手の良い入力管理システムを実現する為の新しいシステムとのこと。

Input Managerの廃止?

現段階では、現行の Input Manager の廃止時期は決定していません

新しい Input System のご紹介

(旧) Input Managerは廃止されるようですので、早めに勉強しておきたいところです。

Input Systemの導入

プロジェクトにInput Systemを追加する

PackageManager

導入手順

  1. 「Window」メニュー「Package Manager」を開きます。
  2. 「Input System」を選択し追加します。

Input Systemの設定

入力を有効にする

Input Systemを有効にする手順

  1. 「Edit」メニューから「Project Settings」>「Player」を開きます。
  2. 「Active Input Handling」を「Input System Package」もしくは「Both」にします。
  3. エディタを再起動します。

設定画面を開く

Edit>Project Settings

からInput System Package の設定を行います。

Create settings asset

Input Systemを使用する

一連の流れ

下の図は使用する際の雰囲気まとめです。

InputAction

左から順の流れですが、制作手順としては右からとなり、

  1. 何らかの実行したいComponentの動作「OnSomething()」を作ります
  2. 「Player Input」Componentを取り付けます
  3. 「Input Actions」のActionに「Something」という操作を作ります
  4. 「Something」に対応したデバイス操作「キーボードのキー」「マウスのボタン」等を紐付けます
  5. Player Input」を設定します
    1. 「Actions」に作成した「Input Action Asset」を取り付けます
    2. 「Behavior」を「Messages」「Invoke Unity Event」に設定してメソッドを実行できるようにします。
  6. 必要ならば画面上のUI(EventSystems等)から特定の操作に紐付けます
    1. Event Systems(ゲームオブジェクト)の「Standalone Input Module」を「Input System UI Input Module」に換装します
    2. 「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を取り付けたオブジェクトから、そのオブジェクトや子階層にメッセージ発行、イベント起動を行います。

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 SchemeSchemeの追加
Edit Control Scheme選択しているSchemeの編集
Duplicate Control Scheme選択しているSchemeの複製
Delete Control Scheme選択しているSchemeの削除

Action Maps

新しいAction Map を作成する

新しいAction Map を作成するには、Action Maps右の「+」アイコンをクリックします。

Action Mapは操作する対象となる に分けて作成します。(UI操作、Player操作等。)

Actions / Action

新しいActionを作成する

新しいActionを作成するには、Actions右の「+」アイコンをクリックします。

ActionはそのAction Mapに属する動作毎に分けて作成します。(Playerの方向入力Move等。)

Property/ Action

実装の例

実装する入力Action TypeControl Type
アナログパット、方向キーValueVector 2
マウス、ペンポインター座標Pass ThroughVector 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ではないので要検証。

Windows Ink ワークスペースを使う

その他の制限

Known Limitations

感想

他のブロガーさんと大体同じですが、出来る事(入力の受け方)が多いので複雑&混乱要素が多いと感じました。

コールバック

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

参考

Quick start guide | InputSystem

新しい Input System のご紹介

コメント

タイトルとURLをコピーしました