경로를 계산하는 서비스입니다.
핵심 개념 | 세부 사항 |
---|---|
PathfindingService | 경로를 계산하는 서비스입니다. |
Path | 계산된 경로를 나타내는 객체입니다. |
Waypoints | 캐릭터가 따를 경로상의 지점들입니다. |
Agent Parameters | 캐릭터의 이동 능력과 제한 사항을 정의하는 매개 변수입니다(예: 반경, 높이, 점프 높이). |
Blocked Event | 경로가 차단되었을 때 발생하는 이벤트입니다. |
StatusChanged Event | 경로 상태가 변경되었을 때 발생하는 이벤트입니다. |
시작점과 끝점 정의하기
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
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.")
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.")