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.
Défi
MoyenFais en sorte que le loup remarque le joueur quand il est proche et abandonne quand il est loin.
- Dans
FixedUpdate(), calcule la distance à plat jusqu’au joueur : si elle est inférieure ànoticeRange, définis le champbool chasingàtrue; si elle est supérieure àgiveUpRange, définis-le àfalse. - Pendant que
chasingest activé, définisrb.linearVelocityen direction du joueur à la vitessespeed, en conservant sa valeur y. - 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
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