Physics.Raycast
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 33 de 63.
Um raycast dispara uma linha invisível a partir de um ponto em uma direção e informa se atingiu um colisor. Physics.Raycast(origin, direction, maxDistance) retorna true quando há um colisor na linha dentro de maxDistance unidades e false caso contrário. Este carro freia quando há algo a menos de 2 unidades à frente do para-choque dianteiro:
public float brakeDistance = 2f;
void Update()
{
if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
{
Debug.Log("Brake!");
}
}transform.forward acompanha a rotação do carro, então o raio sempre aponta para fora da parte dianteira; Vector3.forward sempre apontaria ao longo do eixo z do mundo. O raio começa no centro do carro, dentro do próprio colisor, e um raio nunca informa um colisor dentro do qual começa, então o carro não detecta a si mesmo. Omita maxDistance e o raio seguirá indefinidamente: o carro frearia por causa de uma parede do outro lado do mapa.
Os raios detectam colisores, não o que é desenhado: um objeto com um Renderer e sem colisor é invisível para eles, e um colisor de trigger conta como um acerto. Durante os testes, Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) desenha o raio na visualização Scene do Unity.
Desafio
MédioAutomatize a porta da loja. O script DoorSensor fica no Sensor acima da entrada, a 3.5 unidades do chão. O Inspector fornece a ele o door e um reach de 3.
- A cada quadro, lance um raio do Sensor diretamente para baixo, com comprimento de
reachunidades. - Enquanto o raio atingir algo, a porta estará aberta: esconda-a com
SetActive(false). Quando não atingir nada, mostre a porta novamente.
O chão está fora do alcance do raio, então a porta permanece fechada até alguém ficar embaixo do Sensor. Pressione Play e conduza o Visitor para baixo dele usando as setas; depois, clique em Check.
Experimente você mesmo
using UnityEngine;
public class DoorSensor : MonoBehaviour
{
public GameObject door;
public float reach = 3f;
void Update()
{
// Abra a porta enquanto o raio lançado para baixo a partir do Sensor atingir algo.
}
}
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