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.
Desafío
IntermedioEl 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.Movea una velocidad despeedunidades 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
fallSpeedunidades 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
}
}
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
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco8Controlador de personaje
CharacterController.MoveGravedad manualSaltarEmpujar objetosMuévete hacia donde mirasRepaso: doble salto3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: corredor infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada