Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Um 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 int chamado next, 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, avance next para o próximo ponto de passagem e, depois do último, volte para 0.
  • Perseguição: enquanto o jogador estiver a menos de chaseRange no 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 speed no 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
    }
}
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