Menu
CoddyTech

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にしてから移動させ、再び有効にします。

challenge icon

チャレンジ

中級

CharacterControllerを使って探検者を歩かせ、壁で止まるようにします。

  1. Update()で、xにはInput.GetAxisRaw("Horizontal")、zにはInput.GetAxisRaw("Vertical")を使い、それらにspeedを掛けてVector3 moveを作ります。
  2. move.y = -fallSpeed;を設定し、controller.Move(move * Time.deltaTime);を呼び出します。
  3. 次に、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プレイグラウンド