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:
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:
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:
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":
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:
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:
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:
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:
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":
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:
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
Postar um comentário