[TUTORIAL] Double Jumping para games em 2D
Página 1 de 1
[TUTORIAL] Double Jumping para games em 2D
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](https://i.imgur.com/A5yNJBz.png)
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](https://i.imgur.com/5tboJnt.png)
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:
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](https://i.imgur.com/2SGxVEg.png)
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](https://i.imgur.com/amOZkOu.png)
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](https://i.imgur.com/fCIU7hn.png)
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:
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](https://i.imgur.com/A5yNJBz.png)
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](https://i.imgur.com/5tboJnt.png)
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:
- Código:
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](https://i.imgur.com/2SGxVEg.png)
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](https://i.imgur.com/amOZkOu.png)
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](https://i.imgur.com/fCIU7hn.png)
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:
- Código:
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<Rigidbody2D> ();
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);
}
}
Re: [TUTORIAL] Double Jumping para games em 2D
May, o próximo pode ser sobre wall jump? Esses tutoriais são muito bom!
NKKF- ProgramadorMaster
-
PONTOS : 3282
REPUTAÇÃO : 525
Idade : 16
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [TUTORIAL] Double Jumping para games em 2D
@NKKF escreveu:May, o próximo pode ser sobre wall jump? Esses tutoriais são muito bom!
Faço sim! Na verdade nunca fiz um wall jump, seria uma tentativa interessante! Grata pela sugestão!
Página 1 de 1
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum