Pulo Perfeito (Parte 2): Como Detectar o Chão e Controlar os Saltos do Seu Personagem

No último post, a gente te deu a receita para criar um pulo realista na Unity, com física de verdade e pulo variável. Mas, se você testou o código, percebeu que tem um problema.

Seu personagem pode pular no ar, sem parar. Ele vira uma espécie de foguete, e a gente não quer isso, certo?

O grande segredo de um sistema de pulo sólido não está só em quão bem o personagem sobe, mas em quão bem ele sabe quando pode pular.

Neste post, vamos te mostrar como criar a lógica de detecção de chão, a peça que faltava para o seu pulo ser 100% profissional.


A Estratégia: O Que é Detecção de Chão?

Basicamente, a gente precisa de uma forma de perguntar para o jogo: “o meu personagem está tocando em algo que é chão?”

Para responder a essa pergunta, a gente vai usar um OverlapCircleAll.

Pense nisso como um círculo invisível que o seu personagem lança para baixo. Se esse círculo toca em algum objeto que a gente definiu como “chão”, a resposta é sim. Se não toca em nada, a resposta é não. Simples, né?

Aqui está o que você vai precisar antes de começar a codar:

  1. Um Rigidbody2D no seu personagem.
  2. Um Collider2D (pode ser um Box Collider ou um Circle Collider).
  3. Uma Layer para o Chão: Na Unity, vá em Layers (no topo da tela, à direita), clique em Add Layer... e crie uma nova layer chamada Ground. Depois, selecione o chão do seu jogo (plataformas, o terreno, etc.) e mude a layer dele para Ground.

Pronto, a base está montada. Agora, vamos para o código.


O Código: Adicionando a Lógica ao Seu Script

Vamos continuar no mesmo script PlayerController que criamos no post anterior.

Vamos adicionar algumas variáveis e, em seguida, a lógica de detecção.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float jumpForce = 5f;
    public float lowJumpMultiplier = 2f;
    public float fallMultiplier = 2.5f;

    [Header("Detecção de Chão")]
    public Transform groundCheck; // Ponto de onde o círculo será lançado
    public float groundCheckRadius = 0.2f; // O tamanho do círculo
    public LayerMask groundLayer; // A layer que o círculo vai procurar

    private Rigidbody2D rb;

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

    void Update()
    {
        // Pega a informação da detecção do chão
        bool isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);

        // Se a tecla "Espaço" for pressionada E o personagem estiver no chão...
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        }

        if (rb.velocity.y > 0 && !Input.GetKey(KeyCode.Space))
        {
            rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
        }
    }

    void FixedUpdate()
    {
        if (rb.velocity.y < 0)
        {
            rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
        }
    }
}

O Que Adicionamos?

  1. groundCheck: Crie um objeto vazio na hierarquia da Unity, posicione-o na base do seu personagem (onde os pés estariam) e arraste-o para essa variável no Inspector. Esse objeto vai ser o “ponto de checagem” do chão.
  2. groundCheckRadius: Defina um valor pequeno (tipo 0.2f ou 0.3f). É o tamanho do nosso círculo invisível.
  3. groundLayer: No Inspector, selecione a layer Ground que você criou.
  4. isGrounded: Essa variável bool vai ser a nossa resposta. Ela recebe true se o OverlapCircle detectar algo na groundLayer e false se não.
  5. A Condição isGrounded: Agora, no nosso if do pulo, a gente adiciona a condição && isGrounded. Isso significa: “Só pule se a tecla Espaço for pressionada e se o personagem estiver no chão”.

A Jornada Continua

E é isso! Você acabou de completar o pulo. Pode não parecer muito, mas dominar essa mecânica é um marco na jornada de qualquer desenvolvedor.

Agora, seu personagem não só pula de forma realista, como também o faz de forma controlada.

Você acabou de transformar um protótipo em algo que já tem cara de jogo de verdade.

No nosso próximo post, vamos focar em uma das maiores causas de dor de cabeça para os devs iniciantes: o gerenciamento de escopo. A gente vai te ensinar como criar um GDD de uma página que vai salvar seus projetos do temido M.U.P.

Compartilhe !