UNITY 18 Feb, 2026

Character Controller Unity | Aplicando Gravedad

Con el video de hoy aprenderemos a crear un sistema de gravedad para nuestro personaje.

Dándole peso a nuestro personaje: La Gravedad

¡Seguimos evolucionando nuestro sistema de movimiento! Un mundo 3D sin gravedad es como flotar en el espacio. Hasta ahora, con los scripts anteriores, si nuestro personaje caminaba por el borde de una rampa o un abismo, se quedaba caminando en línea recta por el aire como si fuera un fantasma. Hoy vamos a atarlo al suelo aplicando una fuerza gravitatoria realista y, sobre todo, controlable.

Entendiendo la gravedad en el Character Controller

Al no usar un Rigidbody, el Character Controller no cae por inercia propia; nosotros tenemos que decirle matemáticamente cómo hacerlo. Así es como lo logramos en este script:

Copia el snippet que te dejo a continuación en tu clase PlayerController, asigna un valor a la variable Gravity en el Inspector de Unity (te recomiendo un valor fuerte, entre 9.8 y 20) y ¡observa cómo tu personaje por fin obedece a las leyes de la física!

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 - Aplicando gravedad

Actualización del Character Controller para aplicarle gravedad.

C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

    float horizontalMove;
    float verticalMove;

    private Vector3 playerInput;

    public CharacterController player;
    public float playerSpeed;
    public float gravity;  
    public float fallVelocity;

    public Camera mainCamera;
    private Vector3 camForward;
    private Vector3 camRight;
    private Vector3 movePlayer;


    // 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;

        movePlayer = movePlayer * playerSpeed; 

        player.transform.LookAt(player.transform.position + movePlayer);

        SetGravity();  

        player.Move(movePlayer * Time.deltaTime);  

        Debug.Log(player.isGrounded);

    }

    //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;
    }

    //Funcion para la gravedad.
    public void SetGravity()         
    {
        if (player.isGrounded) 
        {                       
            fallVelocity = -gravity * Time.deltaTime; 
            movePlayer.y = fallVelocity; 
        }
        else
        {
            fallVelocity -= gravity * Time.deltaTime; 
            movePlayer.y = fallVelocity; 
        }        
    }
}