UnityのInputSystemを使った入力情報の利用方法
UnityのInputSystemを使用して入力情報を利用する場合、次の3つの方法があります。
-
PlayerInputからInputActionを取得する -
PlayerInputのコールバックを受け取る - 独自に
InputActionMapを定義する -
InputActionAssetからC#コードを生成し使用する
これらの方法はそれぞれのメリットがありますが、PlayerInputを使用する場合、同じオブジェクトで実行するため、誰がPlayerInputを持つのかを決める必要があり、少し面倒に感じることがあります。
InputSystem.actions API
最近?のバージョン(おそらくInput System 1.8.0)から、新しいAPIとしてInputSystem.actionsが追加されました。このAPIを使用することで、Project Settings内の"Project-Wide Actions"に指定されたInput Action Assetをゲーム実行中に有効化し、コード側から直接取得できるようになります。
また、Unity6のプロジェクトでは、最初から InputActionAsset が用意されるようになりました。このアセットは最初から "project wide actions"に登録されており、MoveやInteractなどの基本的なコマンドが最初から利用できるようになっています。
利用方法
"Project-Wide Actions"に設定されたInput Actionは、ゲーム実行中に有効化され、以下のようにInputSystem.actions.FindActionを使用して取得できます。
例えば、キャラクターの移動情報を取得する場合は、以下のように記述します。
public class Player : MonoBehaviour
{
private InputAction _inputMove;
private CharacterController _controller;
private float _speed = 5;
private void Awake()
{
TryGetComponent(out _controller);
_inputMove = InputSystem.actions.FindAction("Move");
}
private void Update()
{
var inputValue = _inputMove.ReadValue<Vector2>();
var direction = new Vector3(inputValue.x, 0, inputValue.y).normalized;
var velocity = direction * (Time.deltaTime * _speed);
_controller.SimpleMove(velocity);
}
}
もしくはイベントを登録します。
private void Awake()
{
_interactInput = InputSystem.actions.FindAction("Interact");
_interactInput.started += OnInteract;
}
private void OnDestroy()
{
_interactInput.started -= OnInteract;
}
private void OnInteract(InputAction.CallbackContext obj)
{
// do something.
}

