Menu
CoddyTech

Linha de visão

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 39 de 71.

Estar perto de um guarda não é o mesmo que ser visto por ele: uma parede entre vocês 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 desse 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 sozinho também retorna verdadeiro para a caixa, e é por isso que o objeto atingido é comparado com o alvo.

O alvo precisa de um colisor 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 colisor está entre dois pontos. !Physics.Linecast(eye, target.position, wallMask) significa que não há parede no caminho.

challenge icon

Desafio

Médio

Deixe a sentinela vermelha enquanto ela puder ver o jogador; caso contrário, deixe-a verde.

  1. Escreva bool CanSee(): com Vector3 toPlayer = player.position - transform.position;, retorne false quando toPlayer.magnitude > range.
  2. Em seguida, faça o Raycast com Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) e retorne hit.transform == player; se não houver acerto, retorne false.
  3. Em Update(), defina a cor da torre como Color.red ou Color.green com base em CanSee().

Pressione “Jogar” e caminhe para trás da parede. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

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

    void Update()
    {
        // Vermelho enquanto a sentinela consegue ver o jogador; verde, caso contrário.
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity