CharacterControllerは、キャラクターの移動や衝突判定を簡単に処理するための機能を提供してくれます。
Rigidbodyを使った物理演算による移動とは異なり、CharacterControllerはよりゲーム的な挙動を簡単に実装できるのが特徴です。
例えば、
・坂道で滑り落ちないようにする
・指定の高さの段差を乗り越えれるようにする
・壁にぶつかったときに跳ね返らないようにする
といった制御が簡単に行えます。
まずは、操作したいGameObjectにAdd Componentで
Character Controllerコンポーネントを追加します。
次に、CharacterControllerを操作するために下のコードのスクリプトを
操作したいGameObjectにアタッチします。
using UnityEngine;
public class SampleScript : MonoBehaviour
{
public float moveSpeed = 5.0f; // 移動速度
public float jumpHeight = 2.0f; // ジャンプの高さ
public float gravity = -9.81f; // 重力
private CharacterController controller; // CharacterControllerコンポーネント
private Vector3 velocity; // 速度
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// 地面との接触判定
bool isGrounded = controller.isGrounded;
// 水平方向の移動
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
// 移動ベクトルを計算 (右方向 * x + 前方向 * z)
Vector3 move = transform.right * x + transform.forward * z;
// CharacterControllerを使って移動
controller.Move(move * moveSpeed * Time.deltaTime);
// ジャンプ処理
if (isGrounded)
{
if (Input.GetButtonDown("Jump"))
{
// ジャンプ速度を計算
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
}
// 重力を適用
velocity.y += gravity * Time.deltaTime;
if (isGrounded && velocity.y < 0)
{
// 速度をリセット
velocity.y = -2f;
}
// CharacterControllerを使って移動 (重力による落下)
controller.Move(velocity * Time.deltaTime);
}
}
シーンを実行すると、WASDキーで移動、スペースキーでジャンプできます。
Slope Limit : コライダーが登ることのできる最大の勾配を設定できます。
Step Offset : キャラクターが自動的に登ることができる段差の高さを設定できます。
Skin Width : コライダー同士の食い込みの深さを設定できます。
Center : カプセルコライダーのワールド空間でのオフセットを設定できます。
Radius : カプセルコライダーの半径を設定できます。
Height : キャラクターのカプセルコライダーの高さを設定します。
※詳しくは、このページで解説しています。