Verificação do chão com um raio
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 35 de 63.
Um salto deve começar apenas do chão. Standing on the Ground descobriu isso a partir das normais de contato, mantidas atualizadas por mensagens de colisão. Um raio responde “estou em pé sobre alguma coisa?” no próprio local, a qualquer momento: lance-o diretamente para baixo a partir do centro, com um comprimento um pouco maior que a distância do centro até a parte inferior. Este jogador é uma cápsula de 2 unidades de altura, então sua parte inferior fica 1 unidade abaixo do centro, e o raio tem comprimento 1.1:
public float jumpForce = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}Os 0.1 extras são uma margem. Um corpo apoiado no chão pode ficar um pouquinho acima dele ou afundar um pouquinho nele, então um raio com exatamente 1 de comprimento não acerta em alguns quadros. Um comprimento muito maior causa o problema oposto: com 3, o jogador poderia saltar novamente a 2 unidades do chão, e, sem comprimento algum, o raio sempre encontra o chão, então cada pressionamento resulta em um salto.
O raio começa dentro do próprio colisor do jogador, que os raios ignoram, então ele nunca retorna o jogador. A tecla é lida em Update(), porque GetKeyDown é verdadeiro por apenas um quadro, e um impulso único pode ser aplicado ali mesmo, como em Jump with an Impulse.
Desafio
MédioO sapo pula sempre que a tecla Espaço é pressionada, mesmo no ar, então pode subir até o céu. Corrija Hopper para que ele pule apenas do chão:
- Adicione um método
bool IsGrounded()que lance um raio diretamente para baixo a partir do centro do sapo. O sapo é uma esfera escalada para 1.5, então seu raio é 0.75: faça o raio alcançar 0.1 além da parte inferior. - Pule apenas quando a tecla Espaço for pressionada e
IsGrounded()for verdadeiro.
Pressione Play e tente pular duas vezes, depois Check.
Experimente você mesmo
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float jumpForce = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Física e jogabilidade
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar