Movimiento Relativo a la Cámara en Tercera Persona
¡Subimos el nivel de nuestro Character Controller! Si probaste el código de nuestro proyecto anterior, te habrás dado cuenta de un detalle: el personaje siempre se mueve en las mismas direcciones (Norte, Sur, Este, Oeste) independientemente de hacia dónde estemos mirando con la cámara. Para un juego moderno en tercera persona, ¡necesitamos que "hacia adelante" sea exactamente hacia donde apunta nuestra vista!
Claves de esta actualización
Este script trae mejoras cruciales que le darán a tu prototipo un "game feel" mucho más profesional y fluido:
- Vectores de la Cámara: Extraemos hacia dónde mira la cámara (
mainCamera.transform.forward) y su derecha (camRight). Luego, ponemos el eje Y a cero para que nuestro personaje no intente "volar" si miramos hacia el cielo, y por último normalizamos los vectores. ¡Magia matemática pura! - Arreglando el Bug de la Diagonal: En el movimiento básico, si pulsas "Arriba" y "Derecha" a la vez, el personaje se mueve más rápido que yendo solo en una dirección (debido a la hipotenusa del vector). Lo solucionamos de raíz aplicando
Vector3.ClampMagnitude(playerInput, 1), limitando la magnitud a 1 para que la velocidad máxima sea siempre constante. - Rotación Automática: Usamos la función
LookAt()del transform para que nuestro modelo 3D gire suavemente hacia la dirección exacta en la que estamos caminando.
Con este código en tu proyecto, tu personaje ya se siente conectado al mundo 3D. ¡Copia el snippet del final e intégralo en tu juego!
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 relativo a camara
Movimiento del personaje con respecto a la posición de la cámara en tercera persona.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float horizontalMove;
public float verticalMove;
private Vector3 playerInput;
public CharacterController player;
public float playerSpeed;
private Vector3 movePlayer;
public Camera mainCamera;
private Vector3 camForward;
private Vector3 camRight;
// 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");
playerInput = new Vector3(horizontalMove, 0, verticalMove);
playerInput = Vector3.ClampMagnitude(playerInput, 1);
CamDirection();
movePlayer = playerInput.x * camRight + playerInput.z * camForward;
player.transform.LookAt(player.transform.position + movePlayer);
player.Move(movePlayer * playerSpeed * Time.deltaTime);
Debug.Log(player.velocity.magnitude);
}
//Funcion para determinar la direccion a la que mira la camara.
public void CamDirection()
{
camForward = mainCamera.transform.forward;
camRight = mainCamera.transform.right;
camForward.y = 0;
camRight.y = 0;
camForward = camForward.normalized;
camRight = camRight.normalized;
}
}