UNITY 18 Feb, 2026

Character Controller Unity | Movimiento Relativo a Cámara

Cómo mover nuestro personaje en un entorno 3D tomando como referencia la cámara en tercera persona.

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:

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.

C#
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;
    }
}