Patrulhe e persiga
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 52 de 63.
Um guarda em patrulha percorre uma rota até avistar o jogador, persegui-lo e voltar à rota quando o jogador se afasta. Os dois comportamentos dirigem-se da mesma maneira, em direção a um ponto, então um método pode cuidar do movimento em ambos. Este sentinela vai e volta entre dois postos e persegue o jogador dentro de chaseRange:
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;
void Start()
{
rb = GetComponent<Rigidbody>();
goal = pointA;
}
void FixedUpdate()
{
if (Flat(player.position - rb.position).magnitude < chaseRange)
{
WalkTo(player.position);
return;
}
if (Flat(goal.position - rb.position).magnitude < 0.2f)
{
goal = goal == pointA ? pointB : pointA;
}
WalkTo(goal.position);
}
void WalkTo(Vector3 target)
{
Vector3 dir = Flat(target - rb.position).normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
Vector3 Flat(Vector3 v)
{
return new Vector3(v.x, 0f, v.z);
}A verificação da perseguição vem primeiro, e o return faz com que o código da patrulha seja ignorado, então a perseguição tem prioridade sempre que o jogador está por perto. goal é um campo, então o sentinela se lembra dele durante a perseguição: quando o jogador se afasta, ele continua andando até o posto para o qual estava se dirigindo.
O teste de chegada mede a distância pelo chão. Os postos são marcadores no piso e o centro do sentinela fica 1 unidade acima deles, então uma distância que inclua a altura nunca fica abaixo de 1 e o sentinela nunca se viraria. O teste verifica se a distância é menor que 0.2, não se é exatamente 0: a 2 unidades por segundo, o sentinela se move 0.04 unidade por passo e quase nunca chega exatamente ao posto.
Desafio
MédioUm robô de segurança patrulha o armazém. Escreva o script Robot. O Inspector fornece a ele waypoints (os quatro marcadores amarelos W0 a W3, em ordem), player, speed (4) e chaseRange (4). O script Player está pronto.
- Um campo
intchamadonext, começando em 0, é o índice do ponto de passagem para o qual o robô está caminhando. - Patrulha: caminhe até
waypoints[next]. Quando o robô estiver a menos de 0.2 dele no plano do chão, avancenextpara o próximo ponto de passagem e, depois do último, volte para 0. - Perseguição: enquanto o jogador estiver a menos de
chaseRangeno plano do chão, caminhe em direção ao jogador. - Quando o jogador se afastar, continue até
waypoints[next], o ponto de passagem para o qual estava se dirigindo. - Mova-se definindo a velocidade do Rigidbody como
speedno plano do chão, mantendo a velocidade no eixo y.
Pressione Play, observe uma rodada da patrulha e cruze o caminho dela; em seguida, Check.
Experimente você mesmo
using UnityEngine;
public class Robot : MonoBehaviour
{
[SerializeField] private Transform[] waypoints;
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float chaseRange = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// persiga o jogador quando ele estiver perto ou percorra a rota de patrulha
}
}
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 Coletar3Gatilhos
Colisores de gatilhoOnTriggerEnterItens coletáveisZonas de eliminaçãoEntrada e saídaRevisão: chave e porta6Raycasts
Physics.RaycastRaycastHitVerificação do chão com um raioCamadas e LayerMaskLinha de visãoOverlapSphere e SphereCastRecapitulação: armadilha a laser9Inimigos
Persiga o jogadorPersiga ao alcancePatrulhe e persigaVida e danoEmpurrãoRecapitulação: Cão de guarda