Saltar al contenido
ReadySpawn

Cómo hacer un controlador de personaje de plataformas 2D en Unity

Por Imersa Studios · Actualizado el

Mueve un Rigidbody2D en horizontal, comprueba el suelo con un círculo de solapamiento y añade tres recursos de sensación: altura de salto variable (soltar pronto salta menos), coyote time (saltar justo después de dejar la repisa) y jump buffering (saltar justo antes de aterrizar). El script de abajo hace todo eso.

1. Prepara la escena

  • Añade un Rigidbody2D (una Gravity Scale de 3 a 4 da respuesta ágil) y un collider al jugador.
  • Añade un hijo vacío en los pies llamado GroundCheck.
  • Pon los colliders del suelo en una capa Ground.

2. El controlador

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class PlatformerController : MonoBehaviour
{
    public float moveSpeed = 7f;
    public float jumpForce = 12f;
    public float coyoteTime = 0.1f;
    public float jumpBuffer = 0.1f;
    public Transform groundCheck;
    public float groundRadius = 0.15f;
    public LayerMask groundMask;

    Rigidbody2D rb;
    float coyoteCounter, bufferCounter, input;

    void Awake() => rb = GetComponent<Rigidbody2D>();

    void Update()
    {
        input = Input.GetAxisRaw("Horizontal");
        bool grounded = Physics2D.OverlapCircle(groundCheck.position, groundRadius, groundMask);

        coyoteCounter = grounded ? coyoteTime : coyoteCounter - Time.deltaTime;
        bufferCounter = Input.GetButtonDown("Jump") ? jumpBuffer : bufferCounter - Time.deltaTime;

        if (bufferCounter > 0f && coyoteCounter > 0f)
        {
            rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);
            bufferCounter = 0f;
            coyoteCounter = 0f;
        }

        // Variable jump height: releasing early cuts the jump short.
        if (Input.GetButtonUp("Jump") && rb.linearVelocity.y > 0f)
            rb.linearVelocity = new Vector2(rb.linearVelocity.x, rb.linearVelocity.y * 0.5f);
    }

    void FixedUpdate() => rb.linearVelocity = new Vector2(input * moveSpeed, rb.linearVelocity.y);
}

Usa linearVelocity de Unity 6; en versiones antiguas usa velocity. Lee el Input Manager clásico; con el paquete Input System, lee las mismas acciones de tu asset de input.

3. Por qué importan los tres recursos de sensación

RecursoLo que siente el jugador
Coyote timeLos saltos justo después de salir de una repisa aún funcionan, así que el juego se siente justo
Jump bufferUn salto pulsado justo antes de aterrizar aún ocurre, así que el juego se siente receptivo
Altura variableToca para un saltito, mantén para un salto alto, dando control

4. Ajústalo

Haz primero el salto un poco demasiado ágil y luego suavízalo. Sube la gravity scale para una caída más pesada. Añade un pequeño multiplicador de gravedad en la caída para que el descenso sea más rápido que el ascenso. Haz playtests con otras personas, porque la sensación es subjetiva.

5. Siguientes pasos

Añade un dash, deslizarse por la pared y animaciones, y luego diseña un mapa pequeño. Cómo hacer tu propio Hollow Knight es la hoja de ruta, y cómo animar un personaje en Blender cubre rigs de personajes 3D. Para el aspecto, mira Readable Pixels.

Preguntas frecuentes

Quién lo escribió

Imersa Studios crea los sistemas Unity, los packs low poly y las guías que se venden en itch.io. El código y las técnicas de aquí salen de publicar esos productos. Más sobre el estudio.