バッテラのハローワールド研究室

エンジニア、プログラミングに関する情報を掲載中!

【Unity】InputSystemで8方向の入力を検知する方法

Unity

はじめに

今日はUnityの勉強していきます。

あまり使いたくないInputSystemのTIPSをやろうかと思います。

docs.unity3d.com

InputSystemで押してる方向を検知するという方法について共有したいと思います。

使い所としてはキャラの移動などで押してる方向に移動するという部分で活躍してくれます。

「WASD」を使った8方向とゲームパッドのスティック部分を押しこんでる8方向を検知する内容であります。

環境

この記事の情報は次のバージョンで動作確認しています。

* MacOS Monterey (12.1)
* Unity (2021.2.9f1)

InputSystemとは

過去記事で導入方法と基本思想をまとめてるので参考にしてください。

www.m2game.net

InputActionを作る

手順レシピみたいな感じですが以下の通り進めます。

  • InputActionファイルを新規作成する
  • テンプレートは全て削除する
  • ActionMapを1個追加する
  • 名称は「Player」とする
  • Playerに新しいActionを追加します
  • 名称は「Move」とします
  • ActionType は 「Value
  • ControlType は 「Vector2」
  • Interactionはそのままにしておく

残りはBindingまでというところまでやりました。

キーボード用のBindingを作る

これからキーボードのWASDキーを入力検知して8方向するBindingを作ります

  • +ボタンで Add 2D VectorComposite をクリック
  • 名称を「WASD」とします Compositeの項目はそのままでいいです
  • 自動で4つのBindingが追加されているので、それぞれ適切にキー割り当てします

なぜ4つのキーで8方向かというとキー同時押しで左上や右上、左下、右下が検知できるからです。なので4つ検知できればOKなんでうs。

例) W + A 押しだと左上が押されたという判定になります。

ゲームパッド用のBindingを定義

+ボタンで 「Add Binding」をクリック

「Use in control scheme」の GamePad にチェックする

Path に GamePad → LeftStick とします。

スクリプト実装していく

実装の流れ
  • PlayerInputからActionMapを取得
  • ActionMapの連想配列からActionを取り出す
  • ActionをUpdateで常に値監視する

  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.InputSystem; // これいる
    
    public class Sample : MonoBehaviour
    {
        private InputAction moveAction;
    
        void Start()
        {
            var input = this.GetComponent<PlayerInput>();
            var actionMap = input.currentActionMap;
            moveAction = actionMap["Move"];
        }
    
        void Update()
        {
            var value = moveAction.ReadValue<Vector2>();
    
            if (value != Vector2.zero)
            {
                Debug.Log(value);
            }
        }
    
    }