Verificação do chão com um raio
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 37 de 71.
Um salto só deve começar a partir do chão. Em Pé no Chão, isso era determinado com base nas normais de contato, atualizadas continuamente pelas mensagens de colisão. Um raio responde à pergunta “estou em pé sobre alguma coisa?” no local, a qualquer momento: dispare-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 com 2 unidades de altura, então a 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 em repouso 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 detecta o chão em alguns quadros. Um comprimento muito maior causa o problema oposto: com 3, o jogador poderia saltar de novo estando 2 unidades acima 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 colisor do próprio jogador, que os raios ignoram, então ele nunca detecta o jogador. A tecla é lida em Update(), porque GetKeyDown é verdadeiro por apenas um quadro, e um impulso pontual pode ser adicionado ali mesmo, como em Salto com um Impulso.
Desafio
MédioFaça o sapo pular somente do chão.
- Adicione
bool IsGrounded(), que retornaPhysics.Raycast(transform.position, Vector3.down, 0.85f): o raio do sapo, 0.75, mais 0.1. - Em
Update(), adicione&& IsGrounded()aoifda tecla Space.
Pressione “Jogar” e aperte Space duas vezes: o sapo pula uma vez. Depois, clique em “Verificar”.
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);
}
}
}
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çamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisõ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 ColetarPratique por conta própria: Playground de Unity