Menu
CoddyTech

CharacterController.Move

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 38 di 60.

Un CharacterController è il componente di Unity per un personaggio che cammina: una capsula che si muove solo quando lo script chiama controller.Move(motion). motion è la distanza da percorrere in questo frame, quindi è una velocità moltiplicata per Time.deltaTime. Move fa scivolare la capsula lungo le pareti invece di attraversarle, le fa salire su pendenze fino al suo Slope Limit (45 gradi) e superare gradini fino al suo Step Offset (0.3 unità). Non è un Rigidbody: niente forze, niente gravità, niente rimbalzi e niente può spingerlo. Va esattamente dove lo porta Move, come richiesto da controlli di gioco precisi.

La gravità devi aggiungerla tu, e devi anche trovare il pavimento. isGrounded è true quando l'ultima chiamata a Move ha toccato qualcosa sottostante, quindi un movimento senza una componente verso il basso non trova mai il pavimento. Un Move più corto della Min Move Distance del controller (0.001) non fa assolutamente nulla, quindi un controller spostato solo lateralmente segnala di non essere a terra non appena si ferma. Questo corriere cammina con le frecce e preme leggermente verso il basso a ogni movimento:

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;   // spingi sempre verso il basso, così viene rilevato il pavimento
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

La capsula mantiene una Skin Width (0.08) di distanza da ciò che tocca, quindi un controller alto 2 unità su un pavimento a y = 0 si trova a y = 1.08, non a 1. E Move parte dal punto in cui la fisica ha rilevato il controller l'ultima volta, quindi un transform.position impostato su di esso può essere annullato dalla chiamata successiva a Move: per teletrasportarlo, imposta controller.enabled = false, spostalo e poi riattivalo.

challenge icon

Sfida

Medio

Fai camminare l'esploratore con il suo CharacterController, così il muro lo ferma.

  1. In Update(), crea Vector3 move da Input.GetAxisRaw("Horizontal") sull'asse x e Input.GetAxisRaw("Vertical") sull'asse z, moltiplicati per speed.
  2. Imposta move.y = -fallSpeed; e chiama controller.Move(move * Time.deltaTime);.
  3. Quindi imposta rend.material.color su Color.green quando controller.isGrounded è vero, altrimenti su Color.red.

Premi «Gioca», cammina contro il muro e oltre il bordo sinistro: l'esploratore diventa rosso mentre cade e atterra verde. Poi premi «Verifica».

Provalo tu

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()
    {
        // Muovi l'esploratore con controller.Move, poi coloralo in base a isGrounded
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity