Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos I / Aula
Vejamos o código da Listagem 4.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
private bool jumping = false;
private bool grounded = false;
private bool doubleJump = false;
private bool doubleJumping = false;
private Rigidbody2D rigidBody;
public Transform groundCheck;
public LayerMask layerMask;
public float acceleration = 100f;
public float maxSpeed = 10f;
public float jumpSpeed = 500f;
// Use this for initialization
void Awake () {
rigidBody = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void Update() {
grounded = Physics2D.Linecast(transform.position, groundCheck.position,
layerMask);
if (Input.GetButtonDown("Jump"))
{
if (grounded) {
jumping = true;
doubleJump = true;
} else if (doubleJump) {
doubleJumping = true;
doubleJump = false;
}
}
}
//Called in fixed time intervals, frame rate independent
void FixedUpdate()
{
float moveH = Input.GetAxis ("Horizontal");
if (rigidBody.velocity.x * moveH < maxSpeed) {
rigidBody.AddForce (Vector2.right * moveH * acceleration);
}
if (Mathf.Abs (rigidBody.velocity.x) > maxSpeed) {
Vector2 vel = new Vector2 (Mathf.Sign (rigidBody.velocity.x) * maxSpeed,
rigidBody.velocity.y);
rigidBody.velocity = vel;
}
if (jumping) {
rigidBody.AddForce(new Vector2(0f, jumpSpeed));
jumping = false;
}
if (doubleJumping) {
rigidBody.velocity = new Vector2 (rigidBody.velocity.x, 0);
rigidBody.AddForce(new Vector2(0f, jumpSpeed));
doubleJumping = false;
}
}
}
Conforme observado, as modificações não são muitas, dessa vez. Criamos duas novas variáveis booleanas para lidar com o pulo duplo. São elas: doubleJump e doubleJumping. A primeira, indica se o personagem pode executar o segundo pulo ou não. A segunda indica se ele tentou executar esse pulo.
A lógica utilizada, como dito anteriormente, permanece a mesma. No update, vemos se o personagem está no chão e se o botão de pulo foi pressionado. Caso sim, avisamos o pulo ao FixedUpdate com a variável jumping e também ativamos a habilidade de executar um segundo pulo (doubleJump = true). Caso a tecla tenha sido pressionada quando o personagem não está no chão e pode dar um pulo duplo, avisamos ao FixedUpdate que ocorrerá um pulo duplo.
Já no FixedUpdate, verificamos duas alternativas e não mais uma apenas. Se o caso for de Jumping, adicionamos uma velocidade vertical ao nosso personagem e retiramos o pulo. Caso seja de DoubleJumping, além de adicionar uma velocidade ao nosso personagem e tirar o pulo duplo, zeramos a velocidade dele em Y antes de adicionar essa força. Fazemos isso justamente para que o personagem possa subir, caso já esteja caindo, uma vez que, se a velocidade não fosse zerada antes do pulo ser ativado, ela apenas agiria contra a gravidade por um instante, diminuindo a velocidade de queda evitando jogar o personagem para cima novamente.
Às vezes esse pode ser o comportamento desejado, por exemplo se tentarmos fazer um jogo no qual o personagem fica flutuando com pulos (Flappy Bird). Nesses casos, podemos retirar essa linha onde a velocidade é zerada e simplesmente adicionar a força normalmente.
Bem legal, não acha? Espero que todos tenham entendido e possam adicionar isso ao jogo sem maiores problemas. Qualquer dúvida, convido-os mais uma vez a discutir no fórum!
Versão 5.3 - Todos os Direitos reservados