PathFindingService

A service that computes paths.
Key ConceptsDetails
PathfindingServiceA service that computes paths.
PathAn object representing a computed path.
WaypointsPoints along the path that the character will follow.
Agent ParametersParameters defining the movement capabilities and limitations of the character (e.g., radius, height, jump height).
Blocked EventAn event that fires when the path is blocked.
StatusChanged EventAn event that fires when the path status changes.

Define Start Point and End Point

Image 1
Image 2
Roblox Studio
local PathfindingService = game:GetService("PathfindingService")
local character = workspace:WaitForChild("NPC")
local humanoid = character:WaitForChild("Humanoid")
local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
humanoidRootPart.Anchored = false

-- Get the NPC's start position
local startPoint
if character.PrimaryPart then
	startPoint = character.PrimaryPart.Position
elseif character:FindFirstChild("HumanoidRootPart") then
	startPoint = character.HumanoidRootPart.Position
else
	error("No valid part found to determine the NPC's position")
end

local endPoint = workspace.End.Position

Creating a Path

-- Create a path object
local path = PathfindingService:CreatePath({
	AgentRadius = 2,
	AgentHeight = 5,
	AgentCanJump = true,
	AgentJumpHeight = 10,
	AgentMaxSlope = 45,
})

Computing a Path

-- Compute the path
path:ComputeAsync(startPoint, endPoint)

-- Check the path's status
if path.Status == Enum.PathStatus.Success then
	print("Path successfully computed.")
elseif path.Status == Enum.PathStatus.NoPath then
	print("No path could be found.")
elseif path.Status == Enum.PathStatus.Fail then
	print("Path computation failed.")
end

Visualizing the Path

-- Visualize the path
local waypoints = path:GetWaypoints()

for _, waypoint in ipairs(waypoints) do
	local part = Instance.new("Part")
	part.Shape = Enum.PartType.Ball
	part.Material = Enum.Material.Neon
	part.Color = Color3.fromRGB(0, 255, 0)
	part.Size = Vector3.new(0.5, 0.5, 0.5)
	part.Position = waypoint.Position
	part.Anchored = true
	part.CanCollide = false
	part.Parent = workspace
end
Image 1
Roblox Studio

Moving NPC Along the Path

-- Move the character along the path
for _, waypoint in ipairs(waypoints) do
	print(waypoint.Position)
	print(humanoid)
	humanoid:MoveTo(waypoint.Position)
	humanoid.MoveToFinished:Wait()
end

print("Character has followed the path.")
Image 1
Roblox Studio

Example: Complete Code

local PathfindingService = game:GetService("PathfindingService")
local character = workspace:WaitForChild("NPC")
local humanoid = character:WaitForChild("Humanoid")
local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
humanoidRootPart.Anchored = false

-- Get the NPC's start position
local startPoint
if character.PrimaryPart then
	startPoint = character.PrimaryPart.Position
elseif character:FindFirstChild("HumanoidRootPart") then
	startPoint = character.HumanoidRootPart.Position
else
	error("No valid part found to determine the NPC's position")
end

local endPoint = workspace.End.Position


-- Create a path object
local path = PathfindingService:CreatePath({
	AgentRadius = 2,
	AgentHeight = 5,
	AgentCanJump = true,
	AgentJumpHeight = 10,
	AgentMaxSlope = 45,
})

-- Compute the path
path:ComputeAsync(startPoint, endPoint)

-- Check the path's status
if path.Status == Enum.PathStatus.Success then
	print("Path successfully computed.")
elseif path.Status == Enum.PathStatus.NoPath then
	print("No path could be found.")
elseif path.Status == Enum.PathStatus.Fail then
	print("Path computation failed.")
end

-- Handle path being blocked during movement
path.Blocked:Connect(function(blockedWaypointIndex)
	print("Path is blocked at waypoint index:", blockedWaypointIndex)
end)

-- Visualize the path
local waypoints = path:GetWaypoints()

for _, waypoint in ipairs(waypoints) do
	local part = Instance.new("Part")
	part.Shape = Enum.PartType.Ball
	part.Material = Enum.Material.Neon
	part.Color = Color3.fromRGB(0, 255, 0)
	part.Size = Vector3.new(0.5, 0.5, 0.5)
	part.Position = waypoint.Position
	part.Anchored = true
	part.CanCollide = false
	part.Parent = workspace
end


-- Move the character along the path
for _, waypoint in ipairs(waypoints) do
	print(waypoint.Position)
	print(humanoid)
	humanoid:MoveTo(waypoint.Position)
	humanoid.MoveToFinished:Wait()
end

print("Character has followed the path.")

If you found this tutorial helpful and would like to support my work, please consider buying me a coffee.

Thank you very much for your support!

Buy me a coffee