CharacterController.Move
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 38/60。
CharacterControllerは、歩行キャラクターのためのUnityのコンポーネントです。スクリプトがcontroller.Move(motion)を呼び出したときだけ移動するカプセルです。motionはこのフレームで移動する距離なので、速度にTime.deltaTimeを掛けた値です。Moveはカプセルを壁の中ではなく壁に沿って滑らせ、Slope Limit(45度)までの坂を上り、Step Offset(0.3単位)までの段差に上がります。これはRigidbodyではありません。力も重力も跳ね返りもなく、何かに押されることもありません。Moveが指示した場所に正確に移動するため、精密なゲーム操作に適しています。
重力を加えるのも、床を見つけるのも自分で行います。isGroundedは、直前のMoveで下にある何かに触れた場合にtrueになります。そのため、下向きの成分がない移動では床を見つけられません。コントローラーのMin Move Distance(0.001)より短いMoveは何もしないため、横方向にしか移動しないコントローラーは、静止するとすぐに接地していないと報告します。この配達員は矢印キーで歩き、すべての移動で少し下向きに力を加えます。
public class Courier : MonoBehaviour
{
public float speed = 6f;
CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = -2f; // 床を検出できるように、常に下向きの力をかける
controller.Move(move * Time.deltaTime);
if (!controller.isGrounded)
{
Debug.Log("Off the ground");
}
}
}カプセルは接触するものからSkin Width(0.08)だけ離れているため、y = 0の床に立つ高さ2単位のコントローラーは、y = 1ではなくy = 1.08に位置します。また、Moveは物理演算が最後にコントローラーを認識した位置から移動するため、コントローラーのtransform.positionを設定しても、次のMoveで元に戻されることがあります。テレポートさせるには、controller.enabled = falseにしてから移動させ、再び有効にします。
チャレンジ
中級CharacterControllerを使って探検者を歩かせ、壁で止まるようにします。
Update()で、xにはInput.GetAxisRaw("Horizontal")、zにはInput.GetAxisRaw("Vertical")を使い、それらにspeedを掛けてVector3 moveを作ります。move.y = -fallSpeed;を設定し、controller.Move(move * Time.deltaTime);を呼び出します。- 次に、
controller.isGroundedがtrueならrend.material.colorをColor.greenに設定し、そうでなければColor.redに設定します。
「プレイ」を押して、壁に向かって歩き、左端から落ちます。探検者は赤くなって落下し、着地すると緑になります。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Explorer : MonoBehaviour
{
public float speed = 4f;
public float fallSpeed = 3f;
CharacterController controller;
Renderer rend;
void Start()
{
controller = GetComponent<CharacterController>();
rend = GetComponent<Renderer>();
}
void Update()
{
// controller.Moveで移動し、その後isGroundedに応じて探索者の色を変える
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド