Tutorials
Pathfinding

In-development / writing

Pathfinding

Summary

Roblox pathfinding service allows you to draw points which can go from point a to point b in the fastest way possible.

Moving a Character

Creating a path

Creating a path from point a to point b if very simple, but we need to set some rules for the pathfinding AI to follow.

Path's Agent Prameters

ParameterTypeDefualtDescription
AgentRadiusinteger2The minimum amount horizontal space required for empty space considered traversable.
AgentHeightinteger5The minimum amount of vertical space required for empty space to be considered traversable.
AgentCanJumpbooleantrueDetermins whether jumping is allowed
AgentCanClimbbooleanfalseDetermins whether climbing is allowed
WaypointSpacingnumber4Determins the spacing between intermediate waypoints in path. Copied from roblox docs
Coststable{ }Table of materials or defined Class.PathfindingModifier/PathfindingModifiers and their "cost" for traversal. Useful for making the agent prefer certain materials/regions over others. See here for details. Copied from roblox docs
ServerScriptService/Pathfinding.lua
local PathfindingService = game:GetService("PathfindingService")
 
local path = PathfindingService:CreatePath({
  AgentRadius = 3,
  AgentHeight = 6,
  AgentCanClimb = true,
  Costs = { Water = 20 }
})

Finding a path / Calculating a path

To calculate a path, you would call the method :FindPathAsync. This will yeild your code until the path is found. It requires a start: Vector3 and finish: Vector3 as its args.

ServerScriptService/Pathfinding.lua
local PathfindingService = game:GetService("PathfindingService")
 
local path = PathfindingService:CreatePath({
  AgentRadius = 3,
  AgentHeight = 6,
  AgentCanClimb = true,
  Costs = { Water = 20 }
})
 
local pathObject = path:FindPathAsync(Vector3.new(0, 0, 0), Vector3.new(31, 0, 24))

Moving the character

To start moving the character, you would need to get the waypoints from the path object. You can do this by calling the method :GetWaypoints(). Then you can use the humanoid's :MoveTo() method to move the character to each waypoint.

ServerScriptService/Pathfinding.lua
local PathfindingService = game:GetService("PathfindingService")
 
local path = PathfindingService:CreatePath({
  AgentRadius = 3,
  AgentHeight = 6,
  AgentCanClimb = true,
  Costs = { Water = 20 }
})
 
local pathObject = path:FindPathAsync(Vector3.new(0, 0, 0), Vector3.new(31, 0, 24))
 
local humanoid = script.Parent:WaitForChild("Humanoid") -- Lets say the script was in the model.
 
for _, waypoint in pairs(pathObject:GetWaypoints()) do
  humanoid:MoveTo(waypoint.Position)
  humanoid.MoveToFinished:Wait()
end
Last updated on December 29, 2022