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.
Défi
MoyenFais rouler le rocher derrière le joueur.
- Dans
FixedUpdate(), définisVector3 toPlayer = player.position - rb.position;ettoPlayer.y = 0f;, pour que la poussée reste au ras du sol. - 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
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity