Menu
CoddyTech

CharacterController.Move

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 37 di 56.

Un CharacterController è il componente di Unity per un personaggio che cammina: una capsula che si muove solo quando il tuo 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 i muri invece di attraversarli, le fa salire pendenze fino al suo Slope Limit (45 gradi) e le fa superare gradini fino al suo Step Offset (0.3 unità). Non è un Rigidbody: niente forze, niente gravità, niente rimbalzi e niente lo spinge. Va esattamente dove la manda Move, come serve per controlli di gioco precisi.

La gravità devi aggiungerla tu, così come devi trovare il pavimento. isGrounded è true quando l'ultima Move ha toccato qualcosa sotto, quindi un movimento senza componente verso il basso non trova mai il pavimento. Una Move più breve della Min Move Distance del controller (0.001) non fa assolutamente nulla, quindi un controller mosso 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 distanza pari alla sua Skin Width (0.08) 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 Move successiva: per teletrasportarlo, imposta controller.enabled = false, spostalo e riattivalo.

challenge icon

Sfida

Medio

L'esploratore si trova su una piattaforma di pietra, con un muro sul retro e un precipizio a sinistra. Scrivi Explorer.cs sul Player, che ha un CharacterController. Nell'Inspector imposta speed (4) e fallSpeed (3), e Start() trova già il controller e il Renderer dell'esploratore.

  • Le frecce (o WASD), lette con gli assi grezzi, lo fanno camminare con controller.Move a speed unità al secondo: a sinistra e a destra lungo x, in alto e in basso lungo z. Il muro deve fermarlo.
  • Ogni movimento va anche verso il basso a fallSpeed unità al secondo, così l'esploratore resta sulla piattaforma e ne precipita dal bordo.
  • Quando il controller è a terra, l'esploratore è Color.green; quando non lo è, Color.red.

Premi Play, cammina contro il muro e oltre il bordo, poi Check.

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
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi