Unity6 環境における PlayerControler スクリプト実行手順

はじめに

本資料では、Unity6 で Input System がインストールされ、デフォルトの Input Actions アセットが設定済みの状態において、
PlayerControler スクリプトを利用してシーン内のオブジェクト(Cube)をプレイヤーとして移動させる手順を説明します。


必要な環境と前提条件

  • Unity6 環境
  • Input System パッケージのインストール済み(Unity6ではインストール済み)
  • デフォルトの Input Actions アセットの設定済み(Unity6ではインストール済み)

手順 1: 新規 Unity プロジェクトの作成

  1. Unity Hub の起動
    Unity Hub を開き、「New Project(新規プロジェクト作成)」をクリックします。
  2. テンプレートの選択
    「Universal 3D」テンプレートを選択し、プロジェクト名(例: PlayerMovementTutorial)を入力します。
  3. プロジェクトの作成
    「プロジェクトを作成」をクリックしてプロジェクトを作成します。

手順 2: PlayerControler スクリプトの作成

  1. スクリプト作成
    • 「Project」ウィンドウ内の Assets フォルダを右クリックし、
    • 「Create > MonoBehaviour Script」 を選択します。
    • スクリプト名を PlayerControler に変更します。
  2. スクリプトの編集
    作成した PlayerControler.cs をダブルクリックしてエディタ(例: Visual Studio)で開き、以下のコードに置き換えます:
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerControler : MonoBehaviour
{
    // プレイヤーの移動入力値を保存する変数(x: 横方向、y: 前後方向)
    private Vector2 moveInput;
    
    // プレイヤーの移動速度(1秒あたりの移動距離)
    public float moveSpeed = 5f;

    // Unity の毎フレーム更新メソッド
    void Update()
    {
        // 入力に基づく移動処理を実行
        Move();
    }

    // Input System により、移動入力が発生した際に自動的に呼び出されるコールバックメソッド
    // InputValue の内容を Vector2 型に変換し、moveInput に保存する
    void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    // プレイヤーの移動処理を実装するメソッド
    void Move()
    {
        // 入力値から移動ベクトルを計算
        // - moveInput.x が左右の移動、moveInput.y が前後の移動に対応
        // - y 軸は水平移動のため常に 0(上下の移動は行わない)
        // - moveSpeed を掛けることで速度を調整
        // - Time.deltaTime を掛けることでフレームレートに依存しない移動を実現
        Vector3 move = new Vector3(moveInput.x, 0, moveInput.y) * moveSpeed * Time.deltaTime;
        
        // 計算された移動ベクトル分、プレイヤーオブジェクトをワールド空間内で移動する
        transform.Translate(move, Space.World);
    }
}

このコードは、Unity の新しい Input System を利用して、プレイヤーオブジェクトを入力に応じて移動させる基本的な仕組みを実装しています。以下に主要な部分ごとに解説します。


1. 名前空間のインポート

using UnityEngine;
using UnityEngine.InputSystem;
  • UnityEngine
    Unity の基本的な機能やクラス(GameObject、Transform、MonoBehaviour など)を使用するために必要です。
  • UnityEngine.InputSystem
    新しい Input System を使用するための名前空間です。これにより、入力に関するコールバックや設定が可能になります。

2. クラスの定義と変数

public class PlayerControler : MonoBehaviour
{
    // プレイヤーの移動入力値を保存する変数(x: 横方向、y: 前後方向)
    private Vector2 moveInput;

    // プレイヤーの移動速度(1秒あたりの移動距離)
    public float moveSpeed = 5f;
    ...
}
  • PlayerControler クラス
    MonoBehaviour を継承しているため、Unity のコンポーネントとして機能し、ゲームオブジェクトにアタッチできます。
  • moveInput (Vector2)
    プレイヤーからの移動入力の情報を保存します。x 値が左右の移動、y 値が前後の移動に対応しています。
  • moveSpeed (float)
    プレイヤーの移動速度を設定します。public なので、Unity のインスペクターから値を調整可能です。

3. Update メソッド

void Update()
{
    // 入力に基づく移動処理を実行
    Move();
}
  • Update メソッド
    Unity のライフサイクルメソッドで、フレームごとに呼ばれます。この中で、毎フレームごとにプレイヤーの移動処理(Move())を実行しています。

4. 入力コールバック OnMove

// Input System により呼び出されるコールバック
void OnMove(InputValue value)
{
    moveInput = value.Get<Vector2>();
}
  • OnMove メソッド
    新しい Input System の仕組みにより、プレイヤーの移動入力があると自動的に呼ばれるコールバックです。
  • InputValue 型のパラメータ
    ユーザーからの入力値が渡され、value.Get<Vector2>() によって、入力されたベクトル(左右・前後の入力)が取得され、moveInput に保存されます。

コールバックとは、ある処理が完了したり、特定のイベントが発生した際に自動的に呼び出される関数やメソッドのことを指します。つまり、事前に「あとでこれを実行してね」という処理を登録しておく仕組みです。

主なポイント

  • 登録と呼び出し:
    コールバックは、他の処理に引数として渡され、特定のタイミングでその引数として渡された関数が実行されます。例えば、ユーザーがボタンをクリックしたときに実行される関数などです。
  • イベント駆動:
    ゲーム開発やGUIアプリケーションなどでは、ユーザーの操作(クリック、入力、キー押下など)やシステムイベント(タイマー、通信完了など)に応じて動作させるために、コールバックが頻繁に使用されます。
  • Unity における例:
    上記のコードでは、OnMove メソッドがコールバック関数として使われています。新しい Input System は、移動入力があったときに自動的にこの OnMove 関数を呼び出し、入力値を処理します。つまり、入力イベントが発生した際の「呼び出し先」として登録されているのです。

このように、コールバックは非同期処理やイベント駆動型のプログラム設計で、処理のタイミングを柔軟に管理するために非常に重要な役割を果たします。


5. Move メソッド

void Move()
{
    // 入力値から移動ベクトルを計算
    // - moveInput.x が左右の移動、moveInput.y が前後の移動に対応
    // - y 軸は水平移動のため常に 0(上下の移動は行わない)
    // - moveSpeed を掛けることで速度を調整
    // - Time.deltaTime を掛けることでフレームレートに依存しない移動を実現
    Vector3 move = new Vector3(moveInput.x, 0, moveInput.y) * moveSpeed * Time.deltaTime;

    // 計算された移動ベクトル分、プレイヤーオブジェクトをワールド空間内で移動する
    transform.Translate(move, Space.World);
}
  • 移動ベクトルの計算
    • new Vector3(moveInput.x, 0, moveInput.y)
      入力値から新しい 3D ベクトルを作成しています。ここで y 軸(垂直方向)の値は 0 とし、水平移動のみを行います。
    • * moveSpeed
      移動速度を乗算することで、どれだけの速さで移動するかを決定します。
    • * Time.deltaTime
      フレームレートに依存しない動作を実現するために、前のフレームからの経過時間を乗算します。これにより、動作が滑らかになります。
  • transform.Translate() の使用
    • transform.Translate(move, Space.World)
      計算された移動ベクトルを使って、ゲームオブジェクトの位置をワールド座標系で移動させます。これにより、オブジェクトのローカル座標ではなく、グローバルな位置が変更されます。

transform.Translate(move, Space.World); は、計算された移動ベクトルを ワールド空間(グローバル座標系)においてオブジェクトに適用して移動させるメソッドです。これを理解するために、ワールド空間とローカル空間の違いについて詳しく説明します。


ワールド空間(グローバル座標系)

  • 定義:
    ワールド空間は、シーン全体で共通の座標系です。すべてのオブジェクトがこの座標系を共有します。たとえば、X軸が右、Y軸が上、Z軸が前という風に、固定された方向が常に同じ意味を持ちます。
  • 動作:
    Space.World を指定すると、移動ベクトルはワールド座標に基づいて解釈されます。つまり、オブジェクトがどんな向きに回転していても、移動は常にワールドの固定された方向に沿って行われます。
    例:
    • move.x > 0 の場合、常にワールドの右方向に移動します。
    • move.z > 0 の場合、常にワールドの前方向に移動します。

ローカル空間(オブジェクトの座標系)

  • 定義:
    ローカル空間は、個々のオブジェクトが持つ独自の座標系です。オブジェクトの回転やスケールに依存し、例えばオブジェクトの前方向がローカルのZ軸、右方向がローカルのX軸、上方向がローカルのY軸となります。
  • 動作:
    Space.Self(または引数を省略した場合のデフォルト設定)を使用すると、移動はオブジェクト自身のローカル座標系に対して行われます。
    例:
    • オブジェクトが回転している場合、そのローカルの前方向に沿って移動します。
    • オブジェクトがどのような向きでも、常に自分の前に向かって移動するような動きを実現できます。

まとめ

  • ワールド空間での移動 (Space.World)
    オブジェクトの回転に関係なく、常にシーン全体で固定された方向に沿って移動する場合に使用します。
    → 例: シーンの全体的な方向に沿った移動や、カメラに関係なく一定方向への移動など。
  • ローカル空間での移動 (Space.Self)
    オブジェクト自身の向きに合わせた移動が必要な場合に使用します。
    → 例: オブジェクトが回転しても、自身の前方向に沿って移動するキャラクターや車両の移動など。

このコードでは、Space.World を使用しているため、プレイヤーがどのように回転していても、計算された move ベクトルに従ってワールド座標系で移動することになります。


全体の流れ

  1. 入力取得
    ユーザーからの移動入力があれば、OnMove コールバックが呼ばれ、moveInput に入力の方向(左右・前後)が保存されます。
  2. フレームごとの更新
    毎フレーム Update() が呼ばれ、そこから Move() が実行されます。
  3. 移動処理
    Move() で、moveInput に基づいた移動ベクトルが計算され、moveSpeedTime.deltaTime を掛け合わせることで滑らかで一定速度の移動が実現されます。最終的に transform.Translate() によってオブジェクトが移動します。

このコードは、基本的なプレイヤーキャラクターの動きを実装する際のシンプルかつ効果的なアプローチを示しており、特に新しい Input System を利用した入力の取得方法や、フレームレートに依存しない動作の実現方法などがポイントとなっています。

  1. 保存
    VisualStudioエディタ上でスクリプトを保存します(Ctrl+S または Command+S)。

手順 3: プレイヤーオブジェクトの作成とスクリプトのアタッチ

  1. プレイヤーオブジェクトの追加
    メニューから 「GameObject > 3D Object > Cube」 を選択して、シーンに Cube を配置します。
    ※ Cube をプレイヤーオブジェクトとして使用します。
  2. スクリプトのアタッチ
    Cube を選択し、Inspector ウィンドウで「Add Component」をクリック。
    「PlayerControler」を検索し、スクリプトをアタッチします。
    作成したスクリプトをインスペクターにドラッグ&ドロップでもアタッチできます

手順 4: Player Input コンポーネントの設定

  1. Player Input の追加
    Cube の Inspector で「Add Component」をクリックし、「Player Input」 を検索して追加します。
  2. 送信メッセージの設定
    Player Input コンポーネント内の Behavior を「Send Messages」に設定します。(Unity6ではデフォルトです)
    ※ この設定により、デフォルトで設定済みの Input Actions アセットに基づき、入力が発生すると自動で OnMove メソッドが呼び出されます。
  3. Input Actions アセットの確認
    ※ 既にデフォルトの Input Actions アセットが設定されているため、追加の作業は不要です。
    ※ Inspector 上で、アクション「Move」に対応するバインディング(WASD、矢印キー、ゲームパッドなど)が正しく割り当てられているか確認してください。

Player Inputコンポーネント

Input Action Assetファイル


手順 5: シーンの保存と実行

  1. シーンの保存
    メニューの 「File > Save Scene」 からシーンを保存します。
    ※ シーン名は Main など任意の名前で保存してください。
  2. 実行
    エディタ上部の「Play」ボタンをクリックしてシーンを実行します。
  3. 動作確認
    実行中にキーボードの WASD または矢印キーを操作し、Cube(プレイヤーオブジェクト)が設定した移動速度で動くか確認してください。
    ※ 必要に応じて、Inspector 内の moveSpeed の値を調整しながらテストしてください。

まとめ

以上の手順に従って、Unity6 環境で Input System がインストールされた状態で、PlayerControler スクリプトによるプレイヤー移動機能を実装できます。
Cube が正しく入力に反応して動作することを確認したら、さらにシーンのカスタマイズや新たな機能の追加に挑戦してください。

Input System,Unity

Posted by hidepon