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.
Sfida
MedioFai camminare l'esploratore con il suo CharacterController, così il muro lo ferma.
- In
Update(), creaVector3 movedaInput.GetAxisRaw("Horizontal")sull'asse x eInput.GetAxisRaw("Vertical")sull'asse z, moltiplicati perspeed. - Imposta
move.y = -fallSpeed;e chiamacontroller.Move(move * Time.deltaTime);. - Quindi imposta
rend.material.colorsuColor.greenquandocontroller.isGroundedè vero, altrimenti suColor.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
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity