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.
Défi
MoyenUn 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
boolnomméchasingindique si le loup poursuit le joueur. Sa valeur initiale estfalse. - À chaque étape de physique, mesure la distance au joueur au ras du sol (sans tenir compte de la hauteur). À une distance inférieure à
noticeRange:chasingdevienttrue. À une distance supérieure àgiveUpRange: il devientfalse. Entre les deux, il garde sa valeur. - Lorsqu’il poursuit le joueur, le loup court vers lui à la vitesse
speedavec 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
}
}
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
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 à rebours2Collisions
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 à ramasserZones mortellesEntrée et sortieRécapitulatif : clé et porte6Lancers de rayons
Physics.RaycastRaycastHitVérifier le sol avec un rayonLayers et LayerMaskLigne de vueOverlapSphere et SphereCastRécapitulatif : fil-piège laser9Ennemis
Poursuivre le joueurPoursuivre à portéePatrouiller et poursuivreSanté et dégâtsReculRécapitulatif : chien de garde