O Segredo do Pulo Perfeito: Como Criar um Pulo Realista em C# e Unity

A gente sabe como é. Você está lá, todo animado, movendo o seu personagem e… a hora do pulo chega.

Você aperta a tecla, ele sobe. Mas a subida parece artificial, e a descida, mais ainda. Parece que seu personagem é um astronauta em câmera lenta, flutuando em vez de pulando.

Se você já passou por isso, fique tranquilo. A física do pulo é uma das primeiras grandes barreiras que todo desenvolvedor indie enfrenta. Mas a boa notícia? Não é tão difícil de resolver.

Neste post, vamos te dar a receita do pulo perfeito na Unity. Vamos focar não só no código, mas também na lógica por trás dele, para que você entenda o que está fazendo e nunca mais tenha um pulo “flutuante”.

A única coisa que você precisa é um personagem com um Rigidbody2D e um Collider. O resto é com a gente.


Parte 1: O Básico do Pulo (A Força e a Velocidade)

Para fazer um personagem pular, você precisa aplicar uma força a ele. E para isso, a Unity nos dá duas opções principais: AddForce e velocity.

  • AddForce: Como empurrar um carro. Você dá um empurrão rápido e a força é aplicada gradualmente. Ideal para pulos, pois simula o impulso de uma perna.
  • velocity: Como definir a velocidade exata de um carro. Você diz: “vá a 60 km/h”. Usar isso para pular pode causar um movimento mais rígido e menos natural.

A nossa receita secreta usa a AddForce. Ela nos dá um pulo mais dinâmico e responsivo.

Vamos começar com um script simples. Crie um novo script C# (chame-o de PlayerController) e cole o código abaixo.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // A força do pulo. Você pode ajustar esse valor no Inspector da Unity.
    public float jumpForce = 5f;

    // Referência ao Rigidbody2D do seu personagem.
    private Rigidbody2D rb;

    void Start()
    {
        // Garante que a gente pegou a referência ao componente.
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // Se a tecla "Espaço" for pressionada...
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // E o personagem estiver no chão (a gente vai ver isso depois)...
            // Aplicamos a força do pulo.
            rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        }
    }
}
  • ForceMode2D.Impulse faz com que a força seja aplicada de uma vez, como um “tapa”, o que é perfeito para um pulo.
  • Vector2.up é só uma forma mais fácil de escrever new Vector2(0, 1).

Cole esse script no seu personagem. No Inspector, você vai ver a variável Jump Force. Brinque com ela para ver como a força afeta a altura do pulo.


Parte 2: Pulo Variável (O Segredo para um Salto Realista)

Um pulo de verdade não é sempre com a mesma força. Quanto mais tempo você pressiona a tecla, mais alto você pula, certo? Na Unity, podemos simular isso.

Isso é o que vai transformar seu pulo “mecânico” em algo que realmente parece vivo.

A ideia é simples: se a tecla de pulo estiver sendo segurada e o personagem ainda estiver subindo, a gente continua aplicando uma forcinha pra cima.

Vamos modificar o nosso script.

O que mudou?

  • Pulo Curto: No Update(), se a velocidade vertical (rb.velocity.y) for maior que 0 (ou seja, ele está subindo) e a tecla Espaço for solta, a gente aplica uma força pra baixo. Isso faz com que ele “corte” o pulo e comece a cair mais cedo.
  • Queda Acelerada: No FixedUpdate(), se a velocidade vertical for menor que 0 (ou seja, ele está caindo), a gente aplica uma força pra baixo. Isso faz com que a gravidade seja mais forte na descida, tornando a queda mais rápida e realista.

Pronto! Você agora tem um pulo com cara de jogo profissional.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float jumpForce = 5f;
    public float lowJumpMultiplier = 2f; // Multiplicador para pulo "curto"
    public float fallMultiplier = 2.5f; // Multiplicador para queda mais rápida

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // Se o pulo estiver ativo e a tecla for solta, "cortamos" o pulo.
        if (rb.velocity.y > 0 && !Input.GetKey(KeyCode.Space))
        {
            rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
        }
    }

    void FixedUpdate()
    {
        // Se o personagem estiver caindo, a queda é mais rápida.
        if (rb.velocity.y < 0)
        {
            rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
        }
    }
}

O Próximo Passo

O pulo variável é um grande passo para fazer seu jogo parecer polido. Mas ele não está completo até que a gente garanta que o personagem só pule quando estiver no chão.

Na nossa próxima postagem, vamos complementar esse tutorial com a lógica para detectar o chão. Essa é a última peça do quebra-cabeça que vai garantir que seu jogador não saia pulando pelo ar como um maluco.

Compartilhe !