Projet 04 : Vehicle spawner
Dans le Projet 03, tu as conçu un garde du corps allié qui te suit à pied. Dans le Projet 04, tu t'attaques aux véhicules motorisés. Ton objectif est de bâtir un spawner fiable qui interroge le maillage routier, cale une voiture vide sur le nœud d'asphalte le plus proche devant le joueur, plaque ses roues au sol via la physique native et gère proprement son cycle de vie.
La mission
Concevoir un spawner de véhicule vide remplissant cinq objectifs techniques majeurs :
- Interroger le graphe routier du jeu pour localiser le nœud de rue valide le plus proche devant le joueur.
- Gérer gracieusement les zones sauvages ou hors-piste où aucun nœud routier n'existe sans lever d'exception.
- Streamer le modèle du véhicule de façon asynchrone en mémoire avec un délai de sécurité.
- Faire apparaître un véhicule vide aux coordonnées calculées et stabiliser ses suspensions avec
PlaceOnGround. - Verrouiller la possession d'une entité unique pour éviter que des véhicules ne s'empilent lors des actualisations.
- Supprimer proprement le véhicule lors du rechargement du script.
Spécifications, contraintes
- Véhicule vide uniquement : ne pas faire apparaître de conducteur IA dans ce projet ; la conduite autonome par IA fait l'objet de la leçon 48 avant le Complete Mod.
- Calage sur les nœuds routiers : toujours sonder les coordonnées candidates avec
World.GetNextPositionOnStreetet vérifier l'absence d'égalité avecVector3.Zero. - Stabilisation des collisions au sol : appeler systématiquement
PlaceOnGround()immédiatement après la création pour prévenir les rebonds de suspension ou l'enfoncement dans le bitume. - Indicateur de persistance : passer
_car.IsPersistent = truepour protéger le véhicule du ramasse-miettes natif lorsque le joueur s'éloigne. - Zéro véhicule orphelin : assurer la suppression définitive de
_cardansOnAborted.
Étapes de réalisation
- Déclarer le champ de suivi : crée un champ privé
private Vehicle _car;dans ta classe de script. - Brancher les événements : dans le constructeur, enregistre des gestionnaires pour
TicketAborted. - Contrôler la possession active : dans
OnTick, vérifie si_carn'est pas nul et existe. Si oui, retourne immédiatement pour préserver l'instance unique. - Calculer la position sur la route : calcule un point candidat à 25 mètres devant le joueur (
player.Position + player.ForwardVector * 25f) et interrogeWorld.GetNextPositionOnStreet. - Gérer le repli hors route : si la coordonnée renvoyée vaut
Vector3.Zero, interromps la méthode sans instanciation. - Streamer le modèle : charge
VehicleHash.Dominatoravecmodel.Request(2000)en contrôlant les délais d'attente. - Créer et plaquer au sol : dans un bloc
try-finally, appelleWorld.CreateVehicle, activeIsPersistent = trueet exécute_car.PlaceOnGround(). - Libérer la ressource : dans le bloc
finally, invoquemodel.MarkAsNoLongerNeeded(). - Implémenter le nettoyage : dans
OnAborted, vérifie l'existence de_caret appelle_car.Delete().
APIs, outils à explorer
GTA.World.GetNextPositionOnStreet(Vector3 position): analyse le maillage de circulation pour renvoyer la coordonnée d'asphalte la plus proche.GTA.Vehicle: classe gérant les automobiles, deux-roues, hélicoptères et embarcations maritimes.GTA.World.CreateVehicle(Model model, Vector3 position, float heading): instancie physiquement un véhicule dans l'univers de jeu.Vehicle.PlaceOnGround(): plaque instantanément les quatre roues et le châssis de collision sur le relief du terrain.Entity.IsPersistent: indique au ramasse-miettes natif de conserver l'entité en mémoire même si la caméra s'en détourne.GTA.VehicleHash.Dominator: hash identifiant la muscle car Vapid Dominator.
Critères de validation
Ton mod est validé dès que :
- Placé sur ou près d'une chaussée, la Dominator apparaît proprement orientée sur l'asphalte devant le joueur.
- Le véhicule repose de façon stable sur ses pneus, sans saut parasite, sans enfoncement et sans vibration de châssis.
- Placé au sommet du Mont Chiliad ou dans l'océan loin de toute route, le script refuse d'apparaître sans provoquer de crash.
- S'éloigner du véhicule ne le fait pas disparaître de la carte (preuve de la bonne configuration de persistance).
- Recharger avec
Insersupprime immédiatement la voiture du monde physique.
Solution, explications
Partner
Solution vérifiée et explications du code
Le sujet, les contraintes et les étapes de réalisation restent 100% libres pour t'exercer par toi-même. Le code source de référence vérifié et les explications détaillées de production sont réservés aux membres du tier Partner.