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.
Desafio
MédioA 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
rangeunidades 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.
}
}
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