Menu
CoddyTech

Poursuivre à portée

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

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. Ce slime poursuit le joueur 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, un slime qui vous perd de vue continue de glisser jusqu’à ce que les frottements l’arrêtent, et sur la glace, il ne s’arrête jamais. Comme y a été défini sur 0 en premier, toPlayer.magnitude correspond à la distance au sol : un joueur debout sur une caisse à côté du slime est donc toujours considéré comme étant à côté de lui.

Une seule portée a un point faible. Un joueur qui se tient à sa limite entre et sort de cette portée, et le slime 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 n’abandonnent qu’au-delà d’une portée plus longue. Un bool mémorise si l’ennemi poursuit le joueur, et rien ne change entre les deux portées : l’ennemi continue donc ce qu’il faisait.

challenge icon

Défi

Moyen

Fais en sorte que le loup remarque le joueur quand il est proche et abandonne quand il est loin.

  1. Dans FixedUpdate(), calcule la distance à plat jusqu’au joueur : si elle est inférieure à noticeRange, définis le champ bool chasing à true ; si elle est supérieure à giveUpRange, définis-le à false.
  2. Pendant que chasing est activé, définis rb.linearVelocity en direction du joueur à la vitesse speed, en conservant sa valeur y.
  3. Sinon, définis rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

Appuie sur « Jouer », approche-toi du loup, puis éloigne-toi en courant. Ensuite, appuie sur « Vérifier ».

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, abandonner sa poursuite, puis le poursuivre ou rester immobile
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity