No chão
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 11 de 63.
Todo contato tem uma normal: uma direção de comprimento 1, perpendicular à superfície que você tocou, apontando para longe dela, na direção do seu objeto. collision.GetContact(0) é o primeiro ponto de contato, e sua normal informa qual lado você tocou. Em pé sobre um chão plano, ela é (0, 1, 0); contra uma parede à sua direita, é (-1, 0, 0); ao bater a cabeça no teto, é (0, -1, 0).
Esta caixa distingue aterrissagens de impactos laterais:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}O teste é normal.y > 0.5f, em vez de exatamente 1, para que as rampas também contem como chão: y é 0.5 em uma rampa de 60 graus, mais íngreme do que qualquer pessoa consegue subir andando. Mais duas mensagens ajudam com tudo que dura: OnCollisionStay é executado a cada passo da física enquanto o contato durar, e OnCollisionExit é executado uma vez quando ele termina. Um evento de saída não tem pontos de contato, pois nada mais está se tocando, então não chame GetContact nesse caso.
Desafio
FácilO jogador pode andar e pular, mas a tecla Espaço também funciona no ar, então ele pode subir pelo céu dando um pulo de cada vez e pular para longe da lateral da parede. (O colisor tem um material sem atrito, então ele desliza pelas paredes em vez de ficar preso a elas.) Faça com que ele só pule quando estiver apoiado em algo.
- Mantenha um
bool grounded: true enquanto o jogador tocar em algo cuja normal de contato aponte para cima (y acima de 0.5), false assim que parar de tocar. - Pule somente quando a tecla Espaço tiver sido pressionada e
groundedfor true. Um pressionamento no ar é ignorado, não fica guardado para o pouso.
Pressione Play, tente pular duas vezes e subir pela parede, depois Check.
Experimente você mesmo
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
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