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
:- 毎フレーム呼ばれるメソッドです。
moveValue
がVector2.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" アクションが定義されていることを確認してください。これにより、入力がイベントベースで処理され、移動のレスポンスが改善されます。
ディスカッション
コメント一覧
まだ、コメントがありません