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:
- シンプルな移動処理が目的の場合に使用。
- 重力が自動適用され、コードが簡潔になるため、基本的な地上移動に適しています。
プロジェクトの要件に合わせて、どちらのメソッドを採用するか選択してください。
ディスカッション
コメント一覧
まだ、コメントがありません