Unityの新しい入力システムを使った移動処理の基本例3選

新しいInput Systemを従来のInputManagerのように使用する方法を学ぶことで、既存のコードを簡単に移行しつつ、新しいシステムの利点を活用することができます。このガイドでは、旧InputManagerに慣れている開発者向けに、新しいInput Systemを活用した3つの異なる実装方法を紹介します。それぞれの方法で、移行時の利便性と柔軟性を提供しながら、基本的なアクションの登録や入力の読み取りを効率的に行うことが可能です。

これまでのInputManagerのような使い方

このサンプルでは、旧InputManagerに慣れ親しんでいる開発者向けに、新しいInput Systemをどのように活用するかを簡単に理解できるコード例を紹介します。特に、これまでの操作に近い形で、基本的なアクションの登録と入力の読み取り方法を見ていきます。

このスクリプトは、Unityの新しい入力システム(UnityEngine.InputSystem)を使用してプレイヤーの移動入力を取得し、処理するシンプルな例です。以下に主要な部分を解説します。

using UnityEngine;

public class Example : MonoBehaviour
{
    void Update()
    {
        // 水平方向と垂直方向の入力を取得
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        // 入力値をベクトルとしてまとめる
        Vector2 moveValue = new Vector2(horizontal, vertical);
        
        // デバッグ用に入力値を出力
        Debug.Log(moveValue);

        // 例: 入力に基づいてオブジェクトを移動
        transform.Translate(moveValue * Time.deltaTime);
    }
}
using UnityEngine;
using UnityEngine.InputSystem;

public class Example : MonoBehaviour
{
    InputAction moveAction;

    private void Awake()
    {
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 moveValue = moveAction.ReadValue<Vector2>();
        Debug.Log(moveValue);
     // 例: transform.Translate(moveValue * Time.deltaTime);
    }
}

概要

  • クラスの宣言:
    •  Exampleクラスは、MonoBehaviourを継承しています。これは、Unityで作成されるスクリプトがオブジェクトの一部として使用されるため、よく使われます。
  • 変数定義
    • InputAction moveAction は、プレイヤーの移動操作を処理するための入力アクションを格納する変数です。

Awakeメソッド

  • Awakeメソッド
    • Awake は、スクリプトのインスタンスがロードされたときに一度だけ実行されるものです。
      • ここでは、moveAction 変数に入力システムから “Move" という名前のアクションを取得して割り当てています。
      • InputSystem.actions.FindAction("Move") を使って、事前に設定された “Move" アクションを取得します。

Updateメソッド

  • Updateメソッド:
    •  Update は、毎フレーム呼び出されるメソッドです。
      • ゲーム内のオブジェクトの動きをスムーズにするのに使用されます。
      • moveAction.ReadValue<Vector2>() を呼び出して、プレイヤーの移動入力(XとYの座標)を取得します。Vector2は2D空間での動きを表す構造体です。
      • Debug.Log(moveValue); は、取得した移動入力をコンソールに出力します。
      • transform.Translate(moveValue * Time.deltaTime); のコメント部分は、移動コードの例です。moveValue に基づいてオブジェクトを移動させるコードで、Time.deltaTime を掛けることでフレームレートに依存しないスムーズな動きを実現します。

入力システムの設定

  • このコードを動作させるためには、Unityの新しい入力システムがプロジェクトにインポートされている必要があります。
  • さらに、"Move" という名前のアクションが事前に設定されていなければなりません。これは、InputActionAsset(入力アクションアセット)で定義されるアクションマッピングの一部です。

Unity Eventによるイベントの登録による使い方

このサンプルでは、PlayerInputコンポーネントを利用して、入力アクションを効率的に設定および管理する方法を説明します。これにより、複雑なゲーム入力の実装がより直感的かつ柔軟になります。従来のInputManagerから移行する際にも役立つよう、基本的なイベント処理を通して新しいInput Systemの使い方を解説します

Player InputコンポーネントをAdd Componentボタンからアタッチします

BehaviorはInvoke Unity Eventsを選択します

このスクリプトは、Unityの新しい入力システムを活用してプレイヤーの移動を管理する例です。このバージョンでは、PlayerInput コンポーネントを使用して入力を処理し、イベントベースで移動の開始と停止を管理します。

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class Example : MonoBehaviour
{
    private InputAction moveAction;
    private Vector2 moveValue;
    private PlayerInput playerInput;

    private void Awake()
    {
        // PlayerInput コンポーネントを取得し、Move アクションを初期化
        playerInput = GetComponent<PlayerInput>();
        moveAction = playerInput?.actions["Move"];

        if (moveAction == null)
        {
            Debug.LogError("Move アクションが見つかりません。Input Actions の設定を確認してください。");
        }
    }

    private void OnEnable()
    {
        // moveAction が null でない場合にイベントを登録し、有効化
        if (moveAction == null) return;
        
        moveAction.performed += OnMovePerformed;
        moveAction.canceled += OnMoveCanceled;
        moveAction.Enable();
    }

    private void OnDisable()
    {
        // moveAction が null でない場合にイベントを解除し、無効化
        if (moveAction == null) return;
        
        moveAction.performed -= OnMovePerformed;
        moveAction.canceled -= OnMoveCanceled;
        moveAction.Disable();
    }

    private void OnMovePerformed(InputAction.CallbackContext context)
    {
        moveValue = context.ReadValue<Vector2>();
    }

    private void OnMoveCanceled(InputAction.CallbackContext context)
    {
        moveValue = Vector2.zero;
    }

    private void Update()
    {
        if (moveValue != Vector2.zero)
        {
            // moveValue に基づく移動処理を実装
            Debug.Log(moveValue);
            // 例: transform.Translate(moveValue * Time.deltaTime);
        }
    }
}

概要

  • クラスの宣言と属性:
    • Example クラスは MonoBehaviour を継承し、[RequireComponent(typeof(PlayerInput))] 属性が付いています。この属性により、このスクリプトがアタッチされているオブジェクトに PlayerInput コンポーネントが必須であることが示されています。もしオブジェクトに PlayerInput がない場合は、自動的に追加されます。
  • 変数定義:
    • InputAction moveAction: プレイヤーの移動操作を処理する入力アクションです。
    • Vector2 moveValue: プレイヤーの移動量を保持する2Dベクトルです。
    • PlayerInput playerInput: PlayerInput コンポーネントを参照する変数です。

Awake メソッド

  • Awake:
    • ゲームオブジェクトがアクティブになったときに最初に実行されるメソッドです。
      • PlayerInput コンポーネントを取得し、"Move" アクションを moveAction に割り当てます。
      • playerInput = GetComponent<PlayerInput>();PlayerInput コンポーネントを取得します。
      • moveAction = playerInput?.actions["Move"]; で “Move" アクションを取得し、null チェックを行います。
      • if (moveAction == null): moveAction が存在しない場合はエラーメッセージを出力します。

イベント登録と解除

  • OnEnable メソッド:
    • オブジェクトが有効になったときに呼ばれます。
      • moveAction.performed += OnMovePerformed;: 入力が行われたときに OnMovePerformed メソッドを呼び出すイベントを登録します。
      • moveAction.canceled += OnMoveCanceled;: 入力がキャンセルされたときに OnMoveCanceled メソッドを呼び出すイベントを登録します。
      • moveAction.Enable();: moveAction を有効にします。
  • OnDisable メソッド:
    • オブジェクトが無効になったときに呼ばれます。
      • moveAction.performed -= OnMovePerformed;: OnMovePerformed イベントを解除します。
      • moveAction.canceled -= OnMoveCanceled;: OnMoveCanceled イベントを解除します。
      • moveAction.Disable();: moveAction を無効にします。

イベントハンドラー

  • OnMovePerformed メソッド:
    • 入力が行われたときに呼び出されます。
      • context.ReadValue<Vector2>() で入力値を取得し、moveValue に保存します。
  • OnMoveCanceled メソッド:
    • 入力がキャンセルされたときに呼び出されます。
      • moveValue = Vector2.zero;moveValue をリセットします。

Update メソッド

  • Update:
    • 毎フレーム呼ばれるメソッドです。moveValueVector2.zero でない場合に、移動処理を行います。
      • Debug.Log(moveValue);: コンソールに moveValue を出力します。
      • transform.Translate(moveValue * Time.deltaTime);: コメント部分にはオブジェクトを移動させる例が記述されています。

入力システムの設定

  • PlayerInput コンポーネントは、Unityの新しい入力システムを使用して設定する必要があります。事前に入力アクションアセットを設定し、"Move" アクションを定義する必要があります。これにより、イベントベースで移動の処理ができ、スムーズなゲームプレイを実現します。

C# Eventによるイベントの登録による使い方

このサンプルでは、上記のUnityイベントと違い、C#のEventを使います。
インスペクターからの登録はできません。

Player InputコンポーネントをAdd Componentボタンからアタッチします

BehaviorはInvoke C sharp Eventsを選択します

このスクリプトは、Unityの新しい入力システムを使用してプレイヤーの移動を管理するためのサンプルコードです。PlayerInput コンポーネントを利用して、移動の入力を取得し、その情報を用いてオブジェクトを動かす準備を行います。

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class Example : MonoBehaviour
{
    private InputAction moveAction;
    private Vector2 moveValue;
    private PlayerInput playerInput;

    private void Awake()
    {
        // PlayerInput コンポーネントを取得
        playerInput = GetComponent<PlayerInput>();
        moveAction = playerInput.actions["Move"];

        if (moveAction == null)
        {
            Debug.LogError("Move アクションが見つかりません!");
        }
    }

    private void OnEnable()
    {
        if (moveAction != null)
        {
            moveAction.performed += OnMovePerformed;
            moveAction.canceled += OnMoveCanceled;
            moveAction.Enable();
        }
    }

    private void OnDisable()
    {
        if (moveAction != null)
        {
            moveAction.performed -= OnMovePerformed;
            moveAction.canceled -= OnMoveCanceled;
            moveAction.Disable();
        }
    }

    private void OnMovePerformed(InputAction.CallbackContext context)
    {
        moveValue = context.ReadValue<Vector2>();
    }

    private void OnMoveCanceled(InputAction.CallbackContext context)
    {
        moveValue = Vector2.zero;
    }

    private void Update()
    {
        Debug.Log(moveValue);
        // 必要に応じて、moveValue を使ってオブジェクトを動かす処理を追加
        // 例: transform.Translate(moveValue * Time.deltaTime);
    }
}

概要

  • クラスの宣言と属性:
    • Example クラスは MonoBehaviour を継承し、[RequireComponent(typeof(PlayerInput))] 属性が付いています。この属性により、このスクリプトをアタッチしたオブジェクトに PlayerInput コンポーネントが自動的に追加されます。PlayerInput コンポーネントは、新しい入力システムで入力を管理するために使用します。
  • 変数定義:
    • InputAction moveAction: プレイヤーの移動操作を管理する入力アクションです。
    • Vector2 moveValue: プレイヤーの移動入力を格納する2Dベクトルです。
    • PlayerInput playerInput: PlayerInput コンポーネントを参照するための変数です。

Awake メソッド

  • Awake:
    • ゲームオブジェクトが初期化された際に最初に実行されるメソッドです。
      • playerInput = GetComponent<PlayerInput>();: PlayerInput コンポーネントを取得します。
      • moveAction = playerInput.actions["Move"];: “Move" アクションを取得し、moveAction に割り当てます。
      • if (moveAction == null): “Move" アクションが見つからなかった場合、エラーメッセージを出力します。

イベント登録と解除

  • OnEnable メソッド:
    • オブジェクトが有効になったときに呼び出されます。
      • moveAction.performed += OnMovePerformed;: 入力が行われたときに OnMovePerformed メソッドを呼び出すイベントを登録します。
      • moveAction.canceled += OnMoveCanceled;: 入力がキャンセルされたときに OnMoveCanceled メソッドを呼び出すイベントを登録します。
      • moveAction.Enable();: moveAction を有効にします。
  • OnDisable メソッド:
    • オブジェクトが無効になったときに呼び出されます。
      • moveAction.performed -= OnMovePerformed;: OnMovePerformed イベントを解除します。
      • moveAction.canceled -= OnMoveCanceled;: OnMoveCanceled イベントを解除します。
      • moveAction.Disable();: moveAction を無効にします。

イベントハンドラー

  • OnMovePerformed メソッド:
    • 入力が行われたときに呼び出され、移動入力の値を取得します。
      • context.ReadValue<Vector2>(): 移動の入力値を取得し、moveValue に格納します。
  • OnMoveCanceled メソッド:
    • 入力がキャンセルされたときに呼び出されます。
      • moveValue = Vector2.zero;: moveValue をリセットし、移動を止めます。

Update メソッド

  • Update:
    • 毎フレーム呼び出されるメソッドです。moveValue を使用してオブジェクトを移動する処理を追加できます。
      • Debug.Log(moveValue);: moveValue をコンソールに出力します。デバッグ用途です。
      • transform.Translate(moveValue * Time.deltaTime);: コメントとして示されている移動処理の例です。これを使用して、moveValue に基づく移動を実装できます。Time.deltaTime を掛けることでフレームレートに依存しない移動が実現されます。

入力システムの設定

  • このスクリプトは PlayerInput コンポーネントと新しい入力システムを使用するため、事前に入力アクションアセットを設定する必要があります。アクションアセット内で “Move" アクションが定義されていることを確認してください。これにより、入力がイベントベースで処理され、移動のレスポンスが改善されます。

C#,Input System

Posted by hidepon