MENU

【Unity 6】Input Systemで2Dプレイヤーを動かす方法【初心者向け】

Unityの記事用アイキャッチ

Input Systemを使い、プレイヤーキャラクターを上下左右に移動させる基本的な方法を解説します。

Input Systemは、キーボード、マウス、ゲームパッド、タッチ操作など、あらゆる入力を一つのしくみでスマートに管理できる、Unityの新世代の入力システムです。

Unity 6以降では、Input Systemが最初からプロジェクトに組み込まれているため、以前のようにパッケージマネージャから手動でインストールする必要がなくなりました。

Unity公式も推奨しているInput Systemの基本を、この機会にマスターしましょう!

・この記事はUnity 6/Visual Studio Code/Windows 11の環境を元に執筆しています。
・入力デバイスとしてキーボードとPS5のDualSenseコントローラーを使用しました。コントローラーはどの種類でも問題ありません。お持ちでない場合は、コントローラーに関する部分を読み飛ばしても大丈夫です。

もくじ

1. 準備:2Dプロジェクトを用意する

まずは、Playerゲームオブジェクトを動かすためのプロジェクトとオブジェクトを準備します。

STEP
2Dプロジェクトを作成する

Unity Hubより、2Dのテンプレートで新規プロジェクトを作成します。

今回は、Unity6(6000.1.15f1)/Universal 2Dテンプレートを利用しました。

Unity 6では、新規プロジェクトを作成すると、最初からAssetsフォルダー内にInputSystem_Actionsという名前のInput Actionアセットが用意されています。(下の画像)。

このファイルは、Input Systemの仕組みの一部であり、キーボードやゲームパッドなどの具体的な操作方法を定義するために使われます。

しかし、今回はInput Actionアセットを新規作成して基礎から学ぶため、この自動生成されたファイルは削除しても問題ありません。

STEP
ゲームオブジェクト『Player』を作成する

Input Systemで動かす対象となるPlayerゲームオブジェクトをシーンに用意します。

今回は、ヒエラルキーウィンドウで右クリックし、2D Object>Sprites>Capsule を選択し、ゲームオブジェクト名を「Player」に変更しました。

これで準備が整いました。次の章からInput Systemの具体的な設定作業に入ります。

2.『Input Actionアセット』の作成と設定

この章では、キーボードやコントローラーの具体的な操作を定義する「Input Actionアセット」を作成します。

STEP
『Input Actionアセット』を新規作成する

Projectウィンドウ上のAssetsフォルダー内で右クリックし、Create>Input Actions を選択してアセットを作成します。

ここではファイル名を「PlayerInputActions」としました。

PlayerInputActions.inputactionsファイル
STEP
『Input Actions Editor』を開く

作成したPlayerInputActionsファイルをダブルクリックすると、Input Action Editor ウィンドウが開き、編集できるようになります。

Input Actions Editor

最初は、まだ何も操作が登録されていない空の状態(List is empty)であることが確認できます。

STEP
『Action Map』を作成する

まず、関連するアクションをまとめるグループであるAction Mapを作成します。

一番左の「Action Maps」パネルにある+アイコンをクリックし、「Player」という名前のAction Mapを作成します。(名前は任意ですが、今回はゲームオブジェクトに合わせて「Player」としました)

STEP
「Move」Actionsを作成する

次に、Player Action Mapの中に、どのような入力かを定義するActionを作ります。

中央のActionsパネルにある「New action」の名前を「Move」に変更します。
作成したMove Actionを選択し、右端のAction Propertiesパネルを以下のように設定します。

  • Action Type:Value
  • Control Type:Vector2

Action Typeは「どんな種類の入力なのか」を決めます。Control Typeは「どんなデータ型で受け取るか」を決めます。

Action Type:
「入力の種類」を定義します。
Button:
「押されたか/離されたか」のON/OFFを扱います。

Value:
「どのくらいの強さで入力されたか」という連続的な値を扱います。ゲームパッドのスティックの傾き具合や、キーが押され続けている状態の検知に向いています。
Control Type:
「受け取るデータの型」を定義します。
Vector2:
XとYの2つの要素を持つベクトル(座標)です。Wキーで(0, 1)、Aキーで(-1, 0)、WとDの同時押しで(1, 1)のような値を取得でき、2Dの移動やマウスカーソルの座標を扱うのに最適です。

この設定により、「Move Actionは、連続した値を持ち、その値をXとYの2次元方向ベクトルとしてスクリプトに渡す」という意味になります。

STEP
キーボード入力の『Binding』を作成する

Move Actionに実際のキー入力を割り当て(Binding)ます。ここではキーボードのWASDキーを割り当てます。

Move Actionの右側にある + アイコンをクリックし、メニューからAdd Up/Down/Left/Right Compositeを選択します。

↓これにより、2D Vectorという名前のComposite(入力のまとまり)が追加されます。

Properties(右端のパネル)について
ActionActionがどのような種類のデータ(値か、ボタンか)を扱うかを定義します。
Composite複数の入力を1つにまとめる機能。
(例:W, A, S, Dキーを一つの移動操作にまとめる)
Interactions入力のパターンを判定する機能。
(例:長押し、ダブルクリックなど)
Processors入力装置から受け取っと生の入力値を加工する機能。
(例:スティックの感度調整、入力の反転など)

2D VectorのBinding Propertiesを見ると、Composite Typeが2D VectorModeがDigital Normalizedになっています。これはこのままにしておきます。

Composite Type:
composite(まとまり)がどのような種類のデータとして扱われるかを定義します。
2D Vector
Vector2型(XとYの2つの値を持つベクトル)のデータを生成します。
Up(0,1)、Left(-1,0)、UpとRight(1,1)のようになります。
Mode:
2D Vectorの値の計算方法を指定します。
Digital Normalized
「押されている(1)」か「押されていない(0)」を判定(=Digital)し、ベクトルの長さを常に1に保つ処理(=Normalized)をします。

※Digital Normalizedを設定している場合、スクリプト側で別途正規化(Normalize)する必要はありません。
正規化(Normalize)の目的は?

もし正規化しない場合、Wキー(Y=1)とDキー(X=1)を同時に押すと、移動ベクトルは(1, 1)となり、その長さ(速さ)は√2 ≒ 1.414 になります。

これでは斜め移動だけが速くなってしまうため、ベクトルの長さを1に揃えることで、どの方向にも同じ速度で移動できるようにするのが「正規化」の目的です。

Digital Normalizedを設定している場合、スクリプト側で別途正規化する必要はありません。

STEP
Up、Down、Left、RightのBindingにキー割り当てる

Up/Down/Left/Rightの各方向に、対応するキーを設定していきます。

まずUpの<No Binding>を選択します。右端のBinding PropertiesパネルにあるPathのプルダウンメニューをクリックし、入力待ちの状態でキーボードの「W」キーを押します。

リストに表示されるW[Keyboard]を選択すると、UpにWキーが登録されます。

↓同様に、Downに「S」、Leftに「A」、Rightに「D」キーを割り当てます。以下の画像のようになります。

これで、キーボードのWASDキーの割り当てが完了しました。

STEP
ゲームコントローラーの左スティック入力をBindingする

今回は、Playerゲームオブジェクトがキーボードから操作したときと同じ動き方になるように左スティックの操作を設定していきます。

Move Actionの+アイコンから、もう一つAdd Up/Down/Left/Right Compositeを追加し、今度は各方向にコントローラーの左スティックを傾けて設定します。

<No Binding>は右クリック>Deleteで削除できます
STEP
「Fire」Actionsを作成する

次に、攻撃などに使う「Fire」アクションを作成します。Actionsパネルの+アイコンをクリックして新しいActionを作成し、名前を「Fire」に変更します。

※ 今回はDebug.LogによるConsoleの表示のみです。

Fire Actionを選択し、Propertiesを以下のように設定します。

作成したFireアクションを選択し、右のパネル(Properties)で以下のように設定します。

  • Action Type:Button
  • Initial State Check:チェック無し
Action TypeButton:
を選ぶと「押されたか」「離したか」のON/OFFの2択になります。
Initial State Check:
アクションが有効になった瞬間に、割り当てられたボタンがすでに押されているかどうかをチェックするかどうかを決めるオプションです。
チェックなし(推奨):
アクションが有効になってから、改めて入力があった時だけ反応させたい場合。(例:ポーズ解除後の攻撃など)

チェックあり:
アクションが有効になった時に、すでに入力されっぱなしでも即座に反応させたい場合。(例:シーン遷移をまたぐ入力など)
STEP
Fire ActionにキーとボタンをBindingする

Fire Actionに、キーボードの「M」キーを割り当てます。

  1. Fireアクションの何も設定していない<No Binding>を選択します。
    (<No Binding>が無ければFireの右横の『+』アイコン>Add Bindingで追加し選択します)
  2. Binding PropertiesのPathの枠内をクリックする。Listenというボタンが現れ、クリックしたら入力待ちの状態になるので、キーボードの「M」キーを押します。

↓Mキーの設定ができました。

STEP
Fire ActionにゲームコントローラーのボタンをBindingする

キーボードのBindingと同じ方法(STEP9)で、キー入力をコントローラーのボタン入力に置き換えるだけです。

今回はDualSenceコントローラーの『✕』ボタンを押してButton South[Gamepad]を選択しました。

STEP
『Save Asset』ボタンで保存する

最後に、エディタ右上のSave Assetボタンを押して、ここまでの設定を保存します。

これで、キーボードとコントローラーの両方の入力を、MoveとFireという2つのアクションで管理できるようになりました。これがInput Systemの強みの一つです。

保存したら、ウインドウ右上の✕ボタンでInput Actions Editorを閉じます。

ここまで結構時間がかかりましたが、慣れれば早く終わります。

Input Action AssetのInspector

Input Action Asset(ここではPlayerInputActionsファイル)のInspectorを見ると、『Generate C# Class』というチェック項目があります。

これは、Input SystemをC#スクリプトコードですべて管理したい中~上級者向けの機能です。

今回のようにInput SystemのEventを利用するときは使いません。

3.「PlayerController」スクリプトの作成

プレイヤーを実際に動かすためのC#スクリプトを作成します。

STEP
PlayerControllerスクリプトを作成し、アタッチする

Projectウィンドウで右クリックし、Create>Monobehaviour Scriptを選択します。

スクリプト名を「PlayerController」とします。

作成したPlayerControllerスクリプトを、Playerオブジェクトにドラッグ&ドロップしてアタッチします。

STEP
PlayerControllerスクリプトのコードを作成する

作成したPlayerControllerスクリプトをダブルクリックして開き、以下のコードを記述します。

using UnityEngine;
using UnityEngine.InputSystem; // Unityの新しいInput Systemを使うために必要

// Playerオブジェクトの操作を担当するクラス
public class PlayerController : MonoBehaviour
{
    // === 変数の定義 ===

    // publicや[SerializeField]を付けるとInspectorウィンドウから値を調整できる
    [SerializeField]
    private float moveSpeed = 5f; // プレイヤーの移動速度

    // スクリプト内部でのみ使用する変数
    private Vector2 moveInput; // 移動のための入力値(Vector2)を保持する変数

    // === Unityのライフサイクルメソッド ===

    // 毎フレーム呼び出されるメソッド
    void Update()
    {
        // Moveメソッドを呼び出して、移動処理を実行する
        Move();
    }

    // === プライベートメソッド ===

    // 移動処理をまとめたメソッド
    private void Move()
    {
        // moveInput変数に格納された方向、moveSpeed、そしてフレーム間の時間(Time.deltaTime)を元に
        // transform.Translateを使ってオブジェクトを移動させる
        // Time.deltaTimeを掛けることで、フレームレートに依存しないスムーズな移動になる
        transform.Translate(moveInput * moveSpeed * Time.deltaTime);
    }


    // === Player Inputコンポーネントから呼び出されるパブリックメソッド ===
    // ※メソッド名はInput Action Editorで設定したアクション名と合わせる必要がある (例: "On" + "Move")

    /// <summary>
    /// Moveアクションが実行されたときにPlayer Inputコンポーネントから呼び出される
    /// </summary>
    /// <param name="context">入力アクションのコンテキスト(状態や値)が渡される</param>
    public void OnMove(InputAction.CallbackContext context)
    {
        // contextからVector2型の値を読み取り、moveInput変数に代入する
        // このメソッドはキーが押されている間、毎フレームのように呼び出され、入力値を更新し続ける
        moveInput = context.ReadValue<Vector2>();
        Debug.Log($"Moving: {moveInput}"); // 現在の移動入力をConsoleに表示
    }

    /// <summary>
    /// Fireアクションが実行されたときにPlayer Inputコンポーネントから呼び出される
    /// </summary>
    /// <param name="context">入力アクションのコンテキスト(状態や値)が渡される</param>
    public void OnFire(InputAction.CallbackContext context)
    {
        // context.performedは、アクションが実行された(ボタンが押された)瞬間を判定する
        // これにより、ボタンを押しっぱなしの時に何度も実行されたり、離した時に実行されるのを防ぐ
        if (context.performed)
        {
            // Consoleウィンドウに「Fire!」と表示する
            Debug.Log("Fire!");
        }
    }
}

このスクリプトのポイントは、OnMoveとOnFireメソッドです。

これらのメソッドは、後ほど設定するPlayer Inputコンポーネントから、対応する入力があった時に自動的に呼び出されます。

4. Player Inputとスクリプトの連携

最後に、作成したInput ActionアセットとC#スクリプトを、Player Inputコンポーネントを使って結びつけます。

STEP
Player Inputコンポーネントを追加する

ヒエラルキーウィンドウでPlayerゲームオブジェクトを選択し、InspectorでAdd Component>Input>Player Inputを選択して追加します。

STEP
ActionsにInput Action Assetをアサインする

Player InputコンポーネントActionsプロパティに、先ほど作成したPlayerInputActionsファイルをドラッグ&ドロップします。

STEP
BehaviorをInvoke Unity Eventsに変更する

Player InputコンポーネントのBehaviorプロパティをInvoke Unity Eventsに変更します。

するとEventsという項目が表示されるので、その中のPlayerを展開します。ここには、Action Mapで定義したMoveとFireのアクションが表示されています。

STEP
各イベントにメソッドを割り当てる

Moveイベントの+ボタンを押し、オブジェクトを割り当てる欄にPlayerオブジェクト自身をドラッグ&ドロップします。そして、右のプルダウンメニューから PlayerController>OnMoveを選択します。

同様に、FireイベントにもPlayerController>OnFireを割り当てます。

これで全ての設定が完了しました!Ctrl+Sでシーンを保存しておきましょう。

5. 動作確認

Unityエディタの再生ボタンを押してゲームを実行してみましょう。

左端が再生ボタン(▶)

キーボードの W, A, S, Dキー、または接続したゲームパッドの左スティックを操作すると、Playerオブジェクトがスムーズに動くはずです。

また、Mキーやコントローラーの✕ボタンを押すと、Consoleウィンドウに「Fire!」と表示されます。

まとめ

今回は、UnityのInput Systemの基本的な使い方として、Player InputコンポーネントのUnity Eventsを利用する方法を紹介しました。

この方法のメリットは、入力処理のロジック(Player Input)と、それに応じてキャラクターを動かすロジック(PlayerController)を分離できる点にあります。

Player Inputが入力の受付を担当し、PlayerControllerは受け取った値を使ってキャラクターを動かすことに専念できます。

これにより、コードの見通しが良くなり、管理がしやすくなります。

ここからさらに新しいアクションを追加していくことで、より複雑なキャラクター操作を実装していくことができます。ぜひ、色々と試してみてください!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
もくじ