Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Automatize 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 reach unidades.
  • 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.
    }
}
quiz iconTeste seus conhecimentos

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