Introducción al Character Controller
¡Bienvenidos al primer paso para dar vida a nuestro personaje en Unity 3D! En este proyecto, nos adentramos en las bases del movimiento utilizando el componente nativo Character Controller. A diferencia del Rigidbody, que se basa en físicas puras (fuerzas, masas y fricciones), el Character Controller nos permite mover a nuestro jugador de forma más precisa y "arcade", ideal para juegos de plataformas, aventuras o acción en tercera persona.
¿Qué hace exactamente este código?
El script que tienes en el snippet de abajo es la piedra angular de cualquier sistema de movimiento. Aquí te detallo las claves principales que hemos programado:
- Captura de Input: En la función
Update(), leemos constantemente lo que hace el jugador con el teclado o el mando a través deInput.GetAxis("Horizontal")y"Vertical". - El método Move(): Es el corazón del componente. Le pasamos un vector de dirección y él se encarga por debajo de calcular colisiones para que no atravesemos paredes o suelos.
- Independencia de los FPS: Al multiplicar nuestra velocidad por
Time.deltaTime, garantizamos que el personaje se mueva a la misma velocidad en todos los ordenadores, sin importar si el juego corre a 30 o a 144 FPS.
Este es solo el principio de una base muy sólida. ¡Copia el código de abajo, pruébalo en tu proyecto y prepárate para los siguientes niveles donde le añadiremos la orientación de la cámara y la gravedad!
Nota sobre versiones recientes de Unity
Este código utiliza el sistema de entrada clásico de Unity (Legacy Input Manager). Sigue siendo 100% funcional y excelente para aprender las bases en las versiones actuales de Unity. Solo asegúrate de ir a Edit > Project Settings > Player y comprobar que Active Input Handling está configurado en "Input Manager (Old)" o "Both".
Character Controller - Movimiento basico
Movimiento básico para controlar un personaje en un entorno 3D en Unity
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float horizontalMove;
public float verticalMove;
public CharacterController player;
public float playerSpeed;
// Use this for initialization
void Start () {
player = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update () {
horizontalMove = Input.GetAxis("Horizontal");
verticalMove = Input.GetAxis("Vertical");
}
private void FixedUpdate()
{
player.Move(new Vector3(horizontalMove, 0, verticalMove) * playerSpeed * Time.deltaTime);
}
}