PathFindingService

Um serviço que calcula caminhos.
Conceitos PrincipaisDetalhes
PathfindingServiceUm serviço que calcula caminhos.
PathUm objeto que representa um caminho calculado.
WaypointsPontos ao longo do caminho que o personagem seguirá.
Agent ParametersParâmetros que definem as capacidades e limitações de movimento do personagem (por exemplo, raio, altura, altura do salto).
Blocked EventUm evento que é acionado quando o caminho é bloqueado.
StatusChanged EventUm evento que é acionado quando o status do caminho muda.

Definir Ponto de Início e Ponto Final

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

Criando um Caminho

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

Calculando um Caminho

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

Visualizando o Caminho

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

Movendo NPC ao Longo do Caminho

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

Exemplo: Código Completo

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

Se você achou este tutorial útil e gostaria de apoiar meu trabalho, por favor, considere me comprar um café.

Muito obrigado pelo seu apoio!

Me compre um café