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.
Desafio
MédioDois 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ópriojumpHeighte emgravityde 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);
}
}
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro4Cenas e Fases
Carregar uma CenaReiniciar a FasePróxima FaseManter entre CenasRevisão: Seleção de Fases10Projeto: Jogo de Plataforma 3D
O PercursoPlataformas Móveis2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no banco8Controlador de personagem
CharacterController.MoveGravidade na mãoPuloEmpurrando objetosMover-se para onde você olhaRecapitulação: pulo duplo