Ir para o conteúdo
ReadySpawn

Como fazer um controlador de personagem de plataforma 2D no Unity

Por Imersa Studios · Atualizado em

Mova um Rigidbody2D na horizontal, verifique o chão com um círculo de sobreposição e adicione três recursos de sensação: altura de pulo variável (soltar cedo pula menos), coyote time (pular logo depois de sair da borda) e jump buffering (pular logo antes de aterrissar). O script abaixo faz tudo isso.

1. Monte a cena

  • Adicione um Rigidbody2D (Gravity Scale de 3 a 4 dá resposta rápida) e um collider ao jogador.
  • Adicione um objeto filho vazio nos pés chamado GroundCheck.
  • Coloque os colliders do chão numa layer Ground.

2. O 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 do Unity 6; em versões antigas use velocity. Lê o Input Manager clássico; com o pacote Input System, leia as mesmas ações do seu asset de input.

3. Por que os três recursos de sensação importam

RecursoO que o jogador sente
Coyote timePulos logo depois de sair de uma borda ainda funcionam, então o jogo parece justo
Jump bufferUm pulo apertado logo antes de aterrissar ainda acontece, então o jogo parece responsivo
Altura variávelToque para um pulinho, segure para um pulo alto, dando controle

4. Ajuste

Deixe o pulo um pouco rápido demais primeiro e depois suavize. Aumente a gravity scale para uma queda mais pesada. Adicione um pequeno multiplicador de gravidade na queda para a descida ser mais rápida que a subida. Faça playtest com outras pessoas, porque a sensação é subjetiva.

5. Próximos passos

Adicione dash, deslizar na parede e animações, e depois desenhe um mapa pequeno. Como fazer o seu próprio Hollow Knight é o roteiro, e como animar um personagem no Blender cobre rigs de personagens 3D. Para o visual, veja Readable Pixels.

Perguntas frequentes

Quem escreveu

Imersa Studios cria os sistemas Unity, packs low poly e guias vendidos no itch.io. O código e as técnicas daqui vêm de lançar esses produtos. Saiba mais sobre o estúdio.