Unity CharacterController の移動メソッド比較
以下は、Unity の CharacterController コンポーネントにおける移動メソッド Move と SimpleMove の特徴、使い分け、そしてそれぞれのサンプルコードです。
目次
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:
- シンプルな移動処理が目的の場合に使用。
 - 重力が自動適用され、コードが簡潔になるため、基本的な地上移動に適しています。
 
 
プロジェクトの要件に合わせて、どちらのメソッドを採用するか選択してください。
訪問数 54 回, 今日の訪問数 2回





ディスカッション
コメント一覧
まだ、コメントがありません