PathFindingService (路徑查找服務)

一種計算路徑的服務。
Key Concepts (關鍵概念)Details (詳情)
PathfindingService一種計算路徑的服務。
Path表示已計算路徑的物件。
Waypoints角色將要遵循的路徑上的點。
Agent Parameters定義角色移動能力和限制的參數(例如,半徑、高度、跳躍高度)。
Blocked Event路徑被阻擋時觸發的事件。
StatusChanged Event路徑狀態改變時觸發的事件。

定義起點和終點

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

創建路徑

-- 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

可視化路徑

-- 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

沿路徑移動 NPC

-- 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

範例:完整代碼

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.")

如果您覺得本教程對您有幫助,並且願意支持我的工作,請考慮請我喝杯咖啡。

非常感謝您的支持!

請我喝杯咖啡