Menu
CoddyTech

Pulo

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 40 de 60.

Um salto é uma velocidade vertical definida uma única vez, no momento em que a tecla Space é pressionada; a gravidade que o script já adiciona então desacelera a subida, para o personagem no ponto mais alto e traz o controlador de volta para baixo. O que falta é a velocidade inicial para atingir 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. Reorganizando a fórmula, a velocidade inicial para atingir 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, temos 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;

A verificação de reinicialização testa verticalSpeed < 0f, então só encerra as quedas: uma reinicialização simples com if (controller.isGrounded) depois da linha do salto substituiria a velocidade do salto no quadro em que ele acontece. A verificação controller.isGrounded no salto impede saltos no meio do 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

Faça um único script de pulo funcionar tanto para a Criança quanto para o Canguru.

  1. Em Update(), substitua 9f por Mathf.Sqrt(jumpHeight * -2f * gravity), a velocidade inicial que faz o personagem subir exatamente jumpHeight.
  2. Adicione && controller.isGrounded ao if do pulo, para não haver pulo no ar.

Pressione “Jogar” e a tecla Espaço: a Criança sobe 1 unidade e o Canguru, 4. Em seguida, pressione “Verificar”.

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);
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity