Menu
CoddyTech

Poursuivre à portée

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

La plupart des ennemis vous laissent tranquille jusqu’à ce que vous vous approchiez. Mesurez la distance jusqu’au joueur à chaque étape physique et ne le poursuivez que dans une certaine portée. Cette limace vous poursuit dans un rayon de sightRange et reste immobile au-delà :

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    if (toPlayer.magnitude < sightRange)
    {
        Vector3 dir = toPlayer.normalized;
        rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
    }
    else
    {
        rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
    }
}

Le else est important : un Rigidbody conserve sa vitesse jusqu’à ce que quelque chose la modifie. Sans cela, une limace qui vous perd de vue continue à glisser jusqu’à ce que le frottement l’arrête, et sur la glace, elle ne s’arrête jamais. Comme y a d’abord été défini sur 0, toPlayer.magnitude correspond à la distance au sol : un joueur debout sur une caisse à côté de la limace est donc toujours considéré comme étant à côté d’elle.

Une seule portée a un point faible. Un joueur qui se tient à sa limite entre et sort de cette portée, et la limace démarre et s’arrête sans cesse. Les ennemis évitent cela avec deux portées : ils repèrent le joueur dans une portée courte et abandonnent seulement au-delà d’une portée plus longue. Un bool mémorise si l’ennemi poursuit le joueur, et entre les deux portées, rien ne modifie cette valeur : l’ennemi continue donc ce qu’il était en train de faire.

challenge icon

Défi

Moyen

Un loup chasse dans la forêt. Écris le script Wolf pour le loup. Dans l’Inspector, définis player, speed (3), noticeRange (4) et giveUpRange (8). Le script Player est prêt.

  • Un champ bool nommé chasing indique si le loup poursuit le joueur. Sa valeur initiale est false.
  • À chaque étape de physique, mesure la distance au joueur au ras du sol (sans tenir compte de la hauteur). À une distance inférieure à noticeRange : chasing devient true. À une distance supérieure à giveUpRange : il devient false. Entre les deux, il garde sa valeur.
  • Lorsqu’il poursuit le joueur, le loup court vers lui à la vitesse speed avec son Rigidbody, tout en conservant sa vélocité sur l’axe y. Sinon, il reste immobile : ses vélocités sur les axes x et z sont égales à 0.

Appuie sur Play, approche-toi du loup et éloigne-toi en courant, puis clique sur Check.

Essayez vous-même

using UnityEngine;

public class Wolf : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float speed = 3f;
    [SerializeField] private float noticeRange = 4f;
    [SerializeField] private float giveUpRange = 8f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // repérer le joueur, cesser de le poursuivre, puis le pourchasser ou rester immobile
    }
}
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