Menu
CoddyTech

Linha de visão

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 37 de 63.

Estar perto de um guarda não é a mesma coisa que ser visto por ele: uma parede no meio bloqueia a visão. Para testar a linha de visão, lance um raio do olho em direção ao alvo e verifique se a primeira coisa que ele atinge é o próprio alvo. A direção é a posição do alvo menos a sua, e um raio com esse comprimento alcança o alvo:

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

Uma câmera de segurança em um pilar registra I see you enquanto CanSee() for verdadeiro. Com o alvo em um local aberto, o primeiro objeto atingido pelo raio é o alvo. Com o alvo atrás de uma caixa, o raio atinge primeiro a caixa, hit.transform é o da caixa, e a resposta é falsa. Physics.Raycast por si só também retorna verdadeiro para a caixa, e é por isso que o objeto atingido é comparado com o alvo.

O alvo precisa de um collider para que o raio o encontre. O raio não precisa de uma direção normalizada, já que seu comprimento vem de maxDistance. Physics.Linecast(from, to) faz a pergunta ao contrário: se algum collider está entre dois pontos: !Physics.Linecast(eye, target.position, wallMask) significa que não há nenhuma parede no caminho.

challenge icon

Desafio

Médio

A torre de sentinela observa o jogador. O script Sentry fica na torre, e o Inspector fornece a ela o player e um range de 8. A cor da torre mostra o que ela vê:

  • Enquanto ela puder ver o jogador, pinte a torre de vermelho (Color.red) e, caso contrário, de verde (Color.green).
  • Ela só vê o jogador quando ele está a no máximo range unidades de distância e não há nada entre eles.

Pressione Play e movimente o jogador ao redor da parede usando as setas. Depois, pressione Check.

Experimente você mesmo

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Vermelho enquanto a sentinela conseguir ver o jogador; verde caso contrário.
    }
}
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