Déplacer un PNJ sans qu'il se coince
MoveTo tout seul abandonne au bout de huit secondes et ne contourne rien. Pour un trajet un peu long, passe par PathfindingService : il calcule des points de passage que tu suis un par un.
Recalcule le chemin quand la cible bouge nettement, pas à chaque image. Et vérifie l'arrivée à chaque point : un PNJ qui n'atteint jamais son point suivant doit repartir plutôt que d'attendre.
Détecter sans tout scanner
Chercher le joueur le plus proche en parcourant tout le Workspace à chaque image coûte cher pour rien. Parcours la liste des joueurs, compare les distances, et ne fais ce calcul que quelques fois par seconde.
Pour « voit-il le joueur ? », un Raycast depuis la tête du PNJ vers celle du joueur suffit, avec un filtre qui ignore les deux personnages.
Une machine à états, pas une pile de conditions
Repos, patrouille, poursuite, attaque, retour. Un état à la fois, des transitions explicites. C'est ce qui rend le comportement lisible et corrigible ; une accumulation de `if` imbriqués devient impossible à déboguer au troisième comportement.
- Chaque état sait ce qui le fait entrer et ce qui le fait sortir.
- Les connexions d'un PNJ sont rangées à sa mort : sinon elles fuient et le serveur ralentit.
- Le serveur possède le PNJ : SetNetworkOwner(nil) sur ce qui doit rester autoritaire.
Le nombre est le vrai problème
Dix PNJ qui réfléchissent chaque image coûtent plus que cent PNJ qui réfléchissent dix fois par seconde. Étale les mises à jour dans le temps, et mets en sommeil ceux qui sont loin de tout joueur.
Questions fréquentes
Faut-il un Humanoid pour un PNJ ?
Pour marcher et s'animer, oui. Pour un objet flottant ou une tourelle, non — un Humanoid coûte cher et n'apporte rien s'il n'y a ni marche ni animation.