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.
}