Menu
CoddyTech

Patrouiller et poursuivre

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 52 sur 63.

Un garde en patrouille suit un parcours jusqu’à ce qu’il aperçoive le joueur, le poursuive, puis reprenne son parcours une fois le joueur parti. Les deux comportements dirigent le garde de la même façon, vers un point : une seule méthode peut donc assurer le déplacement dans les deux cas. Cette sentinelle fait des allers-retours entre deux postes et poursuit le joueur s’il se trouve dans 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);
}

La vérification de la poursuite vient en premier, et son return ignore le code de patrouille : la poursuite est donc prioritaire dès que le joueur est proche. goal est un champ, donc la sentinelle s’en souvient pendant la poursuite : une fois le joueur parti, elle continue vers le poste qu’elle visait.

La vérification de l’arrivée mesure la distance au sol. Les postes sont des repères sur le sol et le centre de la sentinelle se trouve 1 unité au-dessus d’eux ; la distance tenant compte de la hauteur ne descend donc jamais en dessous de 1, et la sentinelle ne ferait jamais demi-tour. La vérification demande une distance inférieure à 0.2, et non exactement égale à 0 : à 2 unités par seconde, la sentinelle avance de 0.04 unité par étape et n’atteint presque jamais exactement le poste.

challenge icon

Défi

Moyen

Un robot de sécurité patrouille dans l’entrepôt. Écris le script Robot. L’Inspecteur lui fournit les waypoints (les quatre marqueurs jaunes W0 à W3, dans l’ordre), le player, la speed (4) et le chaseRange (4). Le script Player est prêt.

  • Un champ int nommé next, initialisé à 0, est l’index du waypoint vers lequel le robot se dirige.
  • Patrouille : dirige-toi vers waypoints[next]. Une fois que le robot est à moins de 0.2 de celui-ci au sol, passe next au waypoint suivant, puis reviens à 0 après le dernier.
  • Poursuite : tant que le joueur est à une distance au sol inférieure à chaseRange, dirige-toi plutôt vers le joueur.
  • Lorsque le joueur s’éloigne, poursuis ta route vers waypoints[next], le waypoint vers lequel le robot se dirigeait.
  • Déplace le robot en réglant la vitesse du Rigidbody à speed au sol, tout en conservant sa vitesse en y.

Appuie sur Play, observe un cycle de patrouille et traverse sa trajectoire, puis Check.

Essayez vous-même

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()
    {
        // poursuivre le joueur lorsqu'il est proche, sinon suivre le parcours de patrouille
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Physique et gameplay