Menu
CoddyTech

Pulo

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 39 de 56.

Um salto é uma velocidade vertical definida uma única vez, no momento em que a tecla Espaço é pressionada; a gravidade que o script já adiciona então desacelera a subida, para o personagem no topo e traz o controlador de volta para baixo. O que falta é a velocidade inicial para uma determinada altura. A gravidade reduz a velocidade a uma taxa constante, então um salto que começa com velocidade v sobe v * v / (2 * g) unidades antes de parar. Invertendo a fórmula, a velocidade inicial para uma altura h é v = √(2 * g * h).

Com gravity armazenada como um número negativo, -20, e um salto de 2.5 unidades de altura, isso é Mathf.Sqrt(2.5f * -2f * -20f), a raiz quadrada de 100: 10 unidades por segundo. O -2f transforma a gravidade negativa em positiva, porque a raiz quadrada de um número negativo é NaN:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

O teste de redefinição verticalSpeed < 0f faz com que ele só encerre as quedas: um simples if (controller.isGrounded) para redefinir após a linha do salto sobrescreveria a velocidade do salto no mesmo quadro em que ele acontece. O teste controller.isGrounded no salto impede saltos no ar. Altere jumpHeight ou gravity no Inspector e o salto ainda atingirá exatamente jumpHeight, enquanto uma velocidade fixa como verticalSpeed = 8f atingirá uma altura diferente para cada valor de gravidade.

challenge icon

Desafio

Médio

Dois saltadores executam o mesmo Jumper.cs: o Kid, cujo Inspector define gravity como -18 e jumpHeight como 1, e o Kangaroo, com gravity -8 e jumpHeight 4. A tecla Espaço define verticalSpeed como 9, um número encontrado por tentativa e erro: ele não serve para nenhum dos saltadores e também funciona no ar. Corrija o salto:

  • A tecla Espaço inicia um salto que sobe exatamente jumpHeight, calculado com base no próprio jumpHeight e em gravity de cada saltador.
  • Somente um saltador no chão pode saltar.

Pressione Play e salte; em seguida, pressione Check.

Experimente você mesmo

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade