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 escrevernew 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 teclaEspaç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.