Menu
CoddyTech

Poursuivre le joueur

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

Un ennemi qui poursuit le joueur a besoin d’un Rigidbody : les murs l’arrêtent et il peut pousser et être poussé. La poursuite consiste à se déplacer à une vitesse dirigée vers le joueur, définie une fois par étape physique. Ce zombie se dirige vers ce qui se trouve dans son emplacement player :

[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;

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

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

player.position - rb.position pointe du zombie vers le joueur. Sa coordonnée y est définie sur 0 pour que le zombie marche à plat, que le joueur se trouve plus haut ou plus bas, et normalized lui donne une longueur de 1 : le zombie marche donc à la vitesse speed, que le joueur soit à 2 ou à 20 unités. La nouvelle vitesse conserve l’ancienne vitesse sur l’axe y, de sorte que la gravité continue d’attirer le zombie vers le bas lorsqu’il descend une marche. La rotation de son Rigidbody est verrouillée, donc il ne bascule pas en marchant.

Une vitesse que tu définis permet de faire démarrer et tourner immédiatement un ennemi qui marche. Un ennemi lourd, comme un tonneau roulant, est plutôt poussé avec AddForce dans le même FixedUpdate : il prend de la vitesse, conserve son élan et dépasse sa cible lorsque le joueur s’écarte.

Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);

Évite de déplacer le Transform d’un poursuivant : il se retrouverait aussi facilement à l’intérieur d’un mur qu’ailleurs, et le moteur physique ne pourrait ensuite que le repousser à l’extérieur.

challenge icon

Défi

Moyen

Fais rouler le rocher derrière le joueur.

  1. Dans FixedUpdate(), définis Vector3 toPlayer = player.position - rb.position; et toPlayer.y = 0f;, pour que la poussée reste au ras du sol.
  2. Appelle rb.AddForce(toPlayer.normalized * force); pour appliquer la même poussée, de près comme de loin. Laisse sa rotation libre afin que la friction le fasse rouler.

Appuie sur « Jouer » et cours en cercle autour du rocher. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class Boulder : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float force = 6f;
    private Rigidbody rb;

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

    void FixedUpdate()
    {
        // pousser le rocher vers le joueur, le long du sol
    }
}

Toutes les leçons de Physique et gameplay

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