Técnicas de Pulo

Pulo Duplo

Vejamos o código da Listagem 4.

x
1
using System.Collections;
2
using System.Collections.Generic;
3
using UnityEngine;
4
5
public class PlayerController : MonoBehaviour {
6
7
    private bool jumping = false;
8
    private bool grounded = false;
9
    private bool doubleJump = false;
10
    private bool doubleJumping = false;
11
12
    private Rigidbody2D rigidBody;
13
    public Transform groundCheck;
14
    public LayerMask layerMask;
15
16
    public float acceleration = 100f;
17
    public float maxSpeed = 10f;
18
    public float jumpSpeed = 500f;
19
20
    // Use this for initialization
21
    void Awake () {
22
        rigidBody = GetComponent<Rigidbody2D> ();
23
    }
24
25
    // Update is called once per frame
26
    void Update() {
27
        grounded = Physics2D.Linecast(transform.position, groundCheck.position, 
28
        layerMask);
29
30
        if (Input.GetButtonDown("Jump"))
31
        {
32
            if (grounded) {
33
                jumping = true;
34
                doubleJump = true;
35
            } else if (doubleJump) {
36
                doubleJumping = true;
37
                doubleJump = false;
38
            }
39
        }
40
    }
41
42
    //Called in fixed time intervals, frame rate independent
43
    void FixedUpdate()
44
    {
45
        float moveH = Input.GetAxis ("Horizontal");
46
47
        if (rigidBody.velocity.x * moveH < maxSpeed) {
48
            rigidBody.AddForce (Vector2.right * moveH * acceleration);
49
        }
50
51
        if (Mathf.Abs (rigidBody.velocity.x) > maxSpeed) {
52
            Vector2 vel = new Vector2 (Mathf.Sign (rigidBody.velocity.x) * maxSpeed, 
53
            rigidBody.velocity.y);
54
            rigidBody.velocity = vel;
55
        }
56
57
        if (jumping) {
58
            rigidBody.AddForce(new Vector2(0f, jumpSpeed));
59
            jumping = false;
60
        }
61
        if (doubleJumping) {
62
            rigidBody.velocity = new Vector2 (rigidBody.velocity.x, 0);
63
            rigidBody.AddForce(new Vector2(0f, jumpSpeed));
64
            doubleJumping = false;
65
        }
66
            
67
    }
68
}
Listagem 4 - Adicionando o pulo duplo ao personagem.

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