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:
- Um Rigidbody2D no seu personagem.
- Um Collider2D (pode ser um
Box Collider
ou umCircle Collider
). - Uma Layer para o Chão: Na Unity, vá em
Layers
(no topo da tela, à direita), clique emAdd Layer...
e crie uma nova layer chamadaGround
. Depois, selecione o chão do seu jogo (plataformas, o terreno, etc.) e mude a layer dele paraGround
.
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?
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.groundCheckRadius
: Defina um valor pequeno (tipo 0.2f ou 0.3f). É o tamanho do nosso círculo invisível.groundLayer
: No Inspector, selecione a layerGround
que você criou.isGrounded
: Essa variávelbool
vai ser a nossa resposta. Ela recebetrue
se oOverlapCircle
detectar algo nagroundLayer
efalse
se não.- A Condição
isGrounded
: Agora, no nossoif
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.