Salut! Ce tutoriel simple vous apprendra comment créer une IA de base capable de trouver et de suivre automatiquement des chemins.
Avant de commencer, vous devriez avoir les connaissances du didacticiel de script avancé.
Création d'un parcours et d'un gréement
C'est le parcours du combattant que je vais utiliser pour ce tutoriel. Il contient un labyrinthe, des sauts de lave, une corde raide et un puzzle Pick-a-Path. Ce sont tous des modèles gratuits, donc si vous souhaitez les utiliser, ils sont tous disponibles dans la boîte à outils.
Maintenant, nous devons créer un point de départ au début du labyrinthe. Pour éviter toute confusion, il est préférable d'encadrer l'emplacement.
Enfin, à la fin du cours, vous devriez avoir une cale d'extrémité. Ou, vous pouvez obtenir les coordonnées de l'emplacement final.
Maintenant, nous devons fabriquer le robot lui-même. N'oubliez pas que pour que cela fonctionne, le robot doit avoir un objet humanoïde à l'intérieur. Idéalement, vous devriez insérer un rig via le Rig Builder.
Créer un chemin
Maintenant, nous devons créer un chemin. Insérez un script dans la plate-forme et utilisez un service appelé PathfindingService.
1 pathService local = game:GetService("PathfindingService")
Maintenant, nous configurons quelques variables locales pour le point de départ et de fin, ainsi que l'humanoïde.
1 local start = script.Parent.HumanoidRootPart 2 local End = game.Workspace.EndPoint 3 local hum = script.Parent.Humanoid
Ici, le point de départ est la HumanoidRootPart du robot. Le point final est la partie de l'espace de travail appelée « EndPoint ».
Maintenant, nous utilisons une fonction appelée Créer un chemin pour créer un chemin vide.
1 chemin local = pathService:CreatePath()
Bien sûr, nous n'avons pas encore donné au système un point de départ et d'arrivée. Nous utilisons la fonction ComputeAsync() pour que le système calcule le chemin le plus court possible.
1 path:ComputeAsync(start.Position, end.Position) 2 --Alternatively, 3 path:ComputeAsync(Vector3.new(x1,y1,z1), Vector3.new(x2,y2,z2))
Si vous utilisez des coordonnées, remplacez x1, x2, etc. par les nombres correspondants. Pourtant, nous n'avons pas encore fait en sorte que le robot fasse réellement le chemin.
Waypoints
Waypoints sont de petits points le long du chemin que le robot suit jusqu'à la destination finale. J'ai modifié mon script final pour produire ces points. Chacun de ces points correspond à 1 waypoint.
Maintenant, nous devons utiliser la fonction GetWaypoints pour obtenir les waypoints. Ce que fait la fonction, c'est qu'elle renvoie un tableau, composé des coordonnées de chaque point de cheminement dans l'ordre.
1 waypoints locaux = chemin:GetWaypoints()
Enfin, nous devons utiliser la fonction MoveTo pour nous déplacer vers chaque waypoint. Bien sûr, comme les waypoints sont dans un tableau, nous utilisons une boucle par paires.
1 pour i, waypoint en ipairs(waypoints) do 2 Humanoid:MoveTo(waypoint.Position) 3 end
Mais, si vous vous en souvenez, si vous utilisez n'importe quelle sorte de boucle, vous avez besoin d'au moins un délai. Ainsi, nous utilisons l'événement MoveToFinished pour attendre que le MoveTo soit terminé, avant de répéter la boucle.
1 pour i, waypoint en ipairs(waypoints) do 2 Humanoid:MoveTo(waypoint.Position) 3 Humanoid.MoveToFinished:Wait() 4 end
Cependant, le robot ne peut pas sauter par-dessus les sauts de lave. Pour résoudre ce problème, il existe une propriété de chaque waypoint appelée "Action", qui lui indique quelle action il doit effectuer. Donc, configurez une instruction if de sorte que si le waypoint l'oblige à sauter, il saute.
1 if waypoint.Action == Enum.PathWaypointAction.Jump then 2 Humanoid.Jump = true 3 end
Et c'est tout! Une fois les sauts de lave terminés, il fera facilement la corde raide et Pick-a-Path avec une brise ! Au cas où vous auriez du mal à suivre, voici le script final :
1 PathfindingService local = game:GetService("PathfindingService") 2 Humanoid local = script.Parent:WaitForChild("Humanoid") 3 Root local = script.Parent:WaitForChild("HumanoidRootPart") 4 goal local = game.Workspace.Goal. Position 5 chemin local = PathfindingService:CreatePath() 6 chemin:ComputeAsync(Root.Position, goal) 7 waypoints locaux = chemin:GetWaypoints() 8 pour i, waypoint en ipairs(waypoints) do 9 Humanoid:MoveTo(waypoint.Position) 10 if waypoint.Action == Enum.PathWaypointAction.Jump then 11 Humanoid.Jump = true 12 end 13 Humanoid.MoveToFinished:Wait() 14 end