Double Jump para jogos 2D - Unity

Olá, dessa vez resolvi postar um tutorial bem simples para ensinar como fazer um sistema de double jump, visto que muitas pessoas fazem de diversos modos, o meu seria uma maneira bem simples e direta. Então caso não saiba e queira saber (ou já sabe, mas queira aprender uma alternativa) confira abaixo:

O script vai depender que o objeto possua um rigidbody2D e um objeto filho que deve ser posicionado abaixo do player com o nome de "GroundCheck" para podermos verificar se o objeto está tocando no chão:

[TUTORIAL] Double Jumping para games em 2D A5yNJBz

Também faça com que as plataformas que o objeto vai pular estejam no layer chamado "Ground".


Dentro do script nós vamos criar as seguintes variáveis:

Um float para mensurar a força do pulo, 3 bools: uma vai verificar se o objeto está no chão, a outra se o objeto está pulando e a outra se o pulo duplo está sendo executado. Por fim, uma variável do tipo "Transform" para armazenar a posição do objeto-filho de verificação e a variável do tipo "Rigidbody2D" para armazenar o componente de física do objeto.

Dentro do Start, referencie o Rigidbody, e faça com que a variável do tipo "Transform" receba a posição do objeto na cena com nome de "GroundCheck", através do comando GameObject.Find:

[TUTORIAL] Double Jumping para games em 2D 5tboJnt

Agora no Update, precisamos verificar se o jogador pressionou a tecla de pulo, para fazer o objeto pular, para tal, faça com que a variável "isJumping" receba o comando de Input da tecla:

isJumping = Input.GetKeyDown(KeyCode.Space);

Então se o jogador pressionar "Space" a variável isJumping se tornará verdadeira, do contrário será false, dessa forma poderemos verificar se o jogador apertou para pular, para executarmos o pulo através do FixedUpdate.

Ainda dentro do Update, vamos checar se o objeto está tocando ao chão: Para isso, nós iremos fazer com que a variável "isGround" receba um OverlapCircle, que vai detectar através de um valor de raio se o objeto "GroundCheck" está colidindo com algo no layer "Ground".
Então passe como argumento da função: a posição de "GroudCheck", um valor para o raio (acredito que 0.1f esteja suficiente, não precisa ser tão grande) e o layer específico que criamos chamado "Ground".
Também verifique se "isGround" é verdadeiro, pois caso for, devemos passar "doubleJump" para false, dessa forma, o pulo duplo volta a desabilitar quando o objeto voltar a tocar no chão:

[TUTORIAL] Double Jumping para games em 2D 2SGxVEg


Agora crie uma função chamada "DoJump" para executarmos o pulo: dentro dela apenas resete a velocidade em y do rigidbody, para que a força nesse eixo não fique aumentando sempre, e por fim, adicione uma força nesse objeto através do "AddForce", com uma força direcionada para cima e multiplicada pelo valor da variável "jumpForce":

[TUTORIAL] Double Jumping para games em 2D AmOZkOu

Depois de tudo isso, vamos de fato fazer o objeto pular: dentro do FixedUpdate, verifique se "isJumping é verdadeiro, caso for, crie outra verificação se "isGround" é true (ou seja, se o objeto toca no chão). Dentro dessa condição faça com que o pulo seja executado chamando a função "DoJump" e faça com que "doubleJump" fique verdadeiro, permitindo que o jogador possa dar o pulo duplo, se ele desejar.
Na condição "isGround" crie um "else if" verificando se o objeto não está no chão e se "doubleJump" é true, permitindo então, que o pulo duplo seja executado chamando a função "DoJump" e tornando false a variável "doubleJump" para impedir que o jogador dê um terceiro, quarto pulo:

[TUTORIAL] Double Jumping para games em 2D FCIU7hn

Agora salve o script e através do Inspector configure a força do pulo da forma que achar necessário.

Como podem ver, é um script bem simples e rápido que dará um double jump ao objeto, então aproveite se precisar.

Código completo:


using System.Collections; using System.Collections.Generic; using UnityEngine; public class Jump : MonoBehaviour { public float jumpForce; private bool doubleJump, isJumping, isGround; private Transform groundCheck; private Rigidbody2D rb; void Start () { rb = GetComponent (); groundCheck = GameObject.Find ("GroundCheck").transform; } void Update () { isJumping = Input.GetKeyDown (KeyCode.Space); isGround = Physics2D.OverlapCircle (groundCheck.position, 0.1f, LayerMask.GetMask ("Ground")); if (isGround) doubleJump = false; } void FixedUpdate(){ if (isJumping) { if (isGround) { DoJump (); doubleJump = true; } else if (!isGround && doubleJump) { DoJump (); doubleJump = false; } } } void DoJump(){ rb.velocity = new Vector2 (rb.velocity.x, 0); rb.AddForce (Vector2.up * jumpForce); } }

Comentários