Unity CharacterController の移動メソッド比較

以下は、Unity の CharacterController コンポーネントにおける移動メソッド MoveSimpleMove の特徴、使い分け、そしてそれぞれのサンプルコードです。


1. CharacterController.Move

概要

  • 入力パラメータ:
    • 移動量(Vector3 型)を直接指定します。
    • 移動速度に Time.deltaTime を掛けるなど、フレームレートに依存しない計算は自前で行う必要があります。
  • 重力の扱い:
    • 自動では適用されないため、重力やジャンプ処理は自分で計算し、移動ベクトルに含める必要があります。
  • 衝突検知:
    • 衝突後の情報(CollisionFlags)が返され、詳細な衝突判定が可能です。
  • 用途:
    • ジャンプやカスタムな重力処理、精密な衝突判定が必要な場合に適しています。

サンプルコード

using UnityEngine;

public class MoveSample : MonoBehaviour
{
    public float speed = 5.0f;         // 移動速度
    public float gravity = 9.81f;      // 重力の大きさ
    private CharacterController characterController;
    private Vector3 velocity;          // 重力やジャンプのための速度ベクトル

    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        // 入力を取得
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        // 移動方向を計算(ローカル座標に合わせる)
        Vector3 move = transform.right * x + transform.forward * z;

        // 水平移動を実行(Time.deltaTime を掛ける必要がある)
        characterController.Move(move * speed * Time.deltaTime);

        // 接地している場合は速度をリセット
        if (characterController.isGrounded && velocity.y < 0)
        {
            velocity.y = -2f; // わずかな下方向の力で接地を維持
        }

        // 重力を加算
        velocity.y -= gravity * Time.deltaTime;
        characterController.Move(velocity * Time.deltaTime);
    }
}

このサンプルでは、入力に基づく水平移動と、自前で計算する重力処理(および、接地時の補正)を実装しています。ジャンプなどの処理を追加する場合は、velocity.y に適切な値を設定して対応します。


2. CharacterController.SimpleMove

概要

  • 入力パラメータ:
    • 速度(Vector3 型、単位は「単位/秒」)を指定します。
    • 内部で Time.deltaTime を掛けた移動が行われるため、毎フレームの移動計算を自分で行う必要がありません。
  • 重力の扱い:
    • 自動的に重力が適用されます。
    • 垂直方向(ジャンプなど)の移動は自前で制御できず、主に水平移動専用です。
  • 衝突検知:
    • 衝突フラグは返されないため、詳細な衝突状態の把握はできません。
  • 用途:
    • シンプルな地上移動など、基本的なキャラクター移動に向いています。

サンプルコード

using UnityEngine;

public class SimpleMoveSample : MonoBehaviour
{
    public float speed = 5.0f;         // 移動速度
    private CharacterController characterController;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        // 入力を取得
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        // 移動方向を計算(ローカル座標に合わせる)
        Vector3 move = transform.right * x + transform.forward * z;

        // SimpleMove は内部で Time.deltaTime を掛け、重力も自動適用する
        characterController.SimpleMove(move * speed);
    }
}

このサンプルでは、SimpleMove を使用してシンプルな水平移動を実現しています。内部で重力が自動適用されるため、重力処理用のコードは不要です。ただし、ジャンプなどの垂直移動の制御はできません。


まとめ

  • Move:
    • 細かい制御が必要な場合に使用。
    • 重力、ジャンプ、衝突判定を自前で実装できるため、複雑な動作を実現可能です。
  • SimpleMove:
    • シンプルな移動処理が目的の場合に使用。
    • 重力が自動適用され、コードが簡潔になるため、基本的な地上移動に適しています。

プロジェクトの要件に合わせて、どちらのメソッドを採用するか選択してください。

Unity

Posted by hidepon