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.
Desafio
MédioDeixe a sentinela vermelha enquanto ela puder ver o jogador; caso contrário, deixe-a verde.
- Escreva
bool CanSee(): comVector3 toPlayer = player.position - transform.position;, retornefalsequandotoPlayer.magnitude > range. - Em seguida, faça o Raycast com
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)e retornehit.transform == player; se não houver acerto, retornefalse. - Em
Update(), defina a cor da torre comoColor.redouColor.greencom base emCanSee().
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisõ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 ColetarPratique por conta própria: Playground de Unity