Menu
CoddyTech

CharacterController.Move

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 37 de 56.

Un CharacterController es el componente de Unity para un personaje que camina: una cápsula que solo se mueve cuando tu script llama a controller.Move(motion). motion es la distancia que se debe recorrer en este fotograma, por lo que es una velocidad multiplicada por Time.deltaTime. Move desliza la cápsula por las paredes en lugar de atravesarlas, sube pendientes de hasta su límite de pendiente (45 grados) y sube a salientes de hasta su desplazamiento de paso (0.3 unidades). No es un Rigidbody: no hay fuerzas, gravedad ni rebotes, y nada lo empuja. Va exactamente adonde lo envía Move, lo que necesitan los controles precisos de un juego.

La gravedad te toca añadirla a ti, y también encontrar el suelo. isGrounded es true cuando el último Move tocó algo por debajo, así que un movimiento sin componente descendente nunca encuentra el suelo. Un Move más corto que la distancia mínima de movimiento del controlador (0.001) no hace absolutamente nada, así que un controlador que solo se mueve lateralmente indica que no está en el suelo en cuanto se queda quieto. Este mensajero camina con las flechas y presiona un poco hacia abajo en cada movimiento:

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;   // presiona siempre hacia abajo para detectar el suelo
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

La cápsula mantiene una distancia de ancho de piel (0.08) respecto a lo que toca, así que un controlador de 2 unidades de altura en un suelo en y = 0 queda en y = 1.08, no en 1. Además, Move parte de donde la física vio por última vez al controlador, así que un valor de transform.position asignado puede deshacerse con su siguiente Move: para teletransportarlo, establece controller.enabled = false, muévelo y vuelve a activarlo.

challenge icon

Desafío

Intermedio

El explorador está sobre una plataforma de piedra, con una pared detrás y un desnivel a la izquierda. Escribe Explorer.cs en el Player, que tiene un CharacterController. En el Inspector se establecen speed (4) y fallSpeed (3), y Start() ya encuentra el controlador y el Renderer del explorador.

  • Las flechas (o WASD), leídas con los ejes sin procesar, lo desplazan usando controller.Move a una velocidad de speed unidades por segundo: izquierda y derecha a lo largo de x, arriba y abajo a lo largo de z. La pared debe detenerlo.
  • Cada movimiento también lo desplaza hacia abajo a una velocidad de fallSpeed unidades por segundo, para que el explorador permanezca en la plataforma y caiga por el borde.
  • Mientras el controlador está en el suelo, el explorador es Color.green; cuando no lo está, Color.red.

Pulsa Play, camina hasta la pared y luego sal por el borde; después, pulsa Check.

Pruébalo tú mismo

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()
    {
        // Camina con controller.Move y luego colorea al explorador según isGrounded
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Creación de juegos reales