Unity2DのチュートリアルをInputSystemに書き換える(1)


最終的にはスマホから入力したい

先日のUnityで2Dチュートリアルは終わったものの、PC用インターフェースだけだった。
ドキュメント
にモバイルインプットの項目があるけど、入力マネージャーという便利なものがあるのに、果たしてスマホは直接扱うのが正しいのか。
その謎を確かめるため、私はネットの奥地へと向かった・・・

新入力システム

まず、チュートリアルをやっている途中でかすかな影だけを見た新入力システムについてunity3d.jpの説明を発見。
この記事を書いている半年前に出た記事なので新しいと言って良さそう。
最も大きな変化はスマートフォンやタブレットの登場、すなわちタッチデバイスの登場でしょう。これまでの入力システムではタッチ入力がカバーされておらず
つまり、従来の入力マネージャーはタッチデバイスには対応していない。
それに対応させるため、ネットには様々なタッチ対応の記事が(おそらく)存在していると思われるが、
最新Unityとしてのベストは新入力システムであらゆる入力デバイスを統一的に扱う事、だと解釈すれば良さそう。奥地まで行く必要はなかった。

Input Systemを扱う

  • Input Systemのインストール
  • Input Systemを扱う

InputSystemはチュートリアル中にインストールして、よく分からなかったので「両方」を選択して従来方法でやった。

そこで、チュートリアルのRubyのなんてろで新入力システムを試してみる。

ゲームパッドはusing UnityEngine.InputSystemした上で

 // ゲームパッドが接続されていないとnullになる。
if (Gamepad.current == null) return;
    if (Gamepad.current.buttonNorth.wasPressedThisFrame){
        Debug.Log("Button Northが押された!");
    }

とか

 GUILayout.Label($"leftStick: {Gamepad.current.leftStick.ReadValue()}");
 GUILayout.Label($"buttonNorth: {Gamepad.current.buttonNorth.isPressed}");

のようにGamepad.で取得。
キーボードはKeyboard.current、マウスはMouse.current、特殊ジョイスティックはJoystick.current

  • Actionを使う

ここからがやや高度な使い方らしい。

空オブジェクトを作成、CreateActionsを行うと
NullReferenceException UnityEditor.SerializedObject ...
のエラーが出る。
検索してここ
を見ると
when I restarted Unity the problem disappeared
らしいので、Unityを再起動したら確かにException出なくなった。

少し下にいくと
入力処理がC#コードのみで完結し、コードの静的解析が行われて存在しないActionを参照したとき等にエラーが発生するため、最もC#プログラマー好みの方法ではないでしょうか
とあるので、とりあえず自動生成させた。
とりあえずRubyでこのイベントを拾って動かしたい。

こんな感じで

PlayerInput inputAction;
void Awake(){
    inputAction = new PlayerInput();
    inputAction.Enable();
}

void Update(){
    Vector2 move = inputAction.Player.Move.ReadValue<Vector2>();
    horizontal = move.x;
    vertical = move.y;
    ...     

書き換えると動かせた。
多分この辺りのドキュメントの参照も必要そう。
とりあえず十字キーは出来たので今日は満足。

試している方々の記事を見ると他のやり方もある模様だが、とりあえず今回はここまでで、次回は続きのスマホパターンまで見てみたい所。