Apparition de véhicules
Faire apparaître un piéton est permissif : si un humain apparaît à dix centimètres au-dessus du sol, il retombe sur ses pieds sans bruit. Faire apparaître un véhicule de deux tonnes ne pardonne rien. Si tu le fais apparaître sur des coordonnées brutes, la moitié de la carrosserie peut se retrouver encastrée dans un lampadaire, posée de travers sur une rambarde ou exploser parce que ses roues sont nées dans la géométrie d'un mur.
Pour faire apparaître des voitures proprement, tu dois interroger le réseau routier du moteur.
Trouver une route valide : GetNextPositionOnStreet
GTA V dispose d'un graphe interne décrivant chaque voie de circulation, intersection et sens de circulation de Los Santos. Plutôt que de deviner des coordonnées, demande au moteur d'aligner ton point sur le nœud routier le plus proche :
using GTA;
using GTA.Math;
// Chercher un nœud routier à 25 mètres devant le joueur
Vector3 pointRecherche = player.Position + player.ForwardVector * 25f;
Vector3 pointRoute = World.GetNextPositionOnStreet(pointRecherche);
if (pointRoute == Vector3.Zero)
{
// Aucune route trouvée (le joueur est en montagne ou sur un toit)
GTA.UI.Notification.PostTicker("Aucune route valide à proximité.", false);
return;
}
GetNextPositionOnStreet renvoie Vector3.Zero si aucun nœud routier n'est détecté dans le rayon de recherche. Teste toujours cette condition avant de tenter la création.
Le rituel de chargement d'un véhicule
Les modèles de véhicules se chargent via le gestionnaire de streaming, en utilisant VehicleHash :
Model model = new Model(VehicleHash.Dominator);
if (!model.IsValid || !model.IsInCdImage || !model.Request(2000))
{
model.MarkAsNoLongerNeeded();
return;
}
Vehicle voiture = null;
try
{
voiture = World.CreateVehicle(model, pointRoute, player.Heading);
}
finally
{
model.MarkAsNoLongerNeeded();
}
La méthode PlaceOnGround
Quand World.CreateVehicle se termine, la voiture est placée à l'altitude Z renvoyée par le nœud routier. Mais comme chaque véhicule a des suspensions et un diamètre de roues différents, les pneus peuvent mordre de quelques millimètres dans l'asphalte.
Pose immédiatement le véhicule sur ses suspensions :
if (voiture != null && voiture.Exists())
{
voiture.IsPersistent = true;
voiture.PlaceOnGround();
}
PlaceOnGround() plaque la base des quatre pneus exactement sur la surface de collision de la route. Cela empêche le véhicule de rebondir violemment dans les airs à la première image de calcul physique.
Dans le Projet 04, tu combines ces notions pour concevoir un spawner de véhicule vide disponible à la demande.