Tìm đường con chữ cái

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Tìm đường đi là quá trình di chuyển một nhân vật dọc theo một con đường logic để đến điểm đến, tránh chướng ngại vật và (opcional) vật liệu nguy hiểm hoặc khu vực định nghĩa.

Hình họa điều hướng

Để hỗ trợ với bố trí tìm đường và gỡ lỗi, Studio có thể render một lưới điều hướng và nhãn sửa đổi.Để bật chúng, bật chuyển sang Mesh điều hướngThay đổi đường đi từ widget Tùy chọn hiển thị ở góc trên bên phải của cửa sổ 3D.

A close up view of the 3D viewport with the Visualization Options button indicated in the upper-right corner.

Với Mesh điều hướng bật, các khu vực có màu cho thấy nơi một nhân vật có thể đi bộ hoặc bơi, trong khi các khu vực không có màu bị chặn.Những mũi tên nhỏ chỉ ra các khu vực mà một nhân vật sẽ cố gắng tiếp cận bằng cách nhảy, cho rằng bạn đặt AgentCanJump đến true khi tạo con đường .

Navigation mesh showing in Studio

Với biến thể tìm đường bật, nhãn văn bản chỉ ra các vật liệu và khu vực cụ thể được xem xét khi sử dụng biến thể tìm đường .

Navigation labels showing on navigation mesh

Các hạn chế đã biết

Các tính năng tìm đường có các hạn chế cụ thể để đảm bảo xử lý hiệu lựcquả và hiệu suất tối ưu.

Giới hạn vị trí ngang

Các tính toán tìm đường xem xét chỉ các bộ phận nằm trong các giới hạn ngang nhất định:

  • Giới hạn thấp hơn — Các bộ phận có phối trí bên dưới Y ít hơn -65,536 đinh tán là bị bỏ qua.
  • Giới hạn trên — Các bộ phận có điểm Y trên cùng vượt quá 65,536 đinh tán được bỏ qua.
  • Khoảng cách dọc — Khoảng cách dọc từ đáy phần thấp nhất đến điểm cao nhất của phần Y phải không vượt quá 65,536 đinh tán; nếu không, hệ thống tìm đường sẽ bỏ qua những phần đó trong quá trình tìm đường.

Hạn chế khoảng cách tìm kiếm

Khoảng cách nhìn trực tiếp từ điểm bắt đầu đến điểm kết thúc không được vượt quá 3,000 đinh tán.Vượt quá khoảng cách này sẽ dẫn đến trạng tháitrạng NoPath .

Tạo lối đi

Tìm đường được khởi động thông qua PathfindingService và chức năng CreatePath() của nó.

Tập lệnh địa phương

local PathfindingService = game:GetService("PathfindingService")
local path = PathfindingService:CreatePath()

CreatePath() chấp nhận một bảng tham số tùy chọn mà nó sẽ tinh chỉnh cách nhân vật (đại lý) di chuyển dọc theo con đường.

Nhân vật chínhMô tảLoạiMặc định
AgentRadiusBán kính đại lý, bằng studs. Hữu ích để xác định khoảng cách tối thiểu từ chướng ngại vật.số nguyên2
AgentHeightChiều cao của đặc vụ, bằng studs. Không gian trống nhỏ hơn giá trị này, như không gian dưới cầu thang, sẽ được đánh dấu là không thể đi qua.số nguyên5
AgentCanJumpXác định xem có cho phép nhảy trong quá trình tìm đường không.boolean như vậytrue
AgentCanClimbXác định xem có cho phép leo TrussParts trong quá trình tìm đường không.boolean như vậyfalse
WaypointSpacingKhoảng cách giữa các điểm dừng giữa trên đường đi. Nếu được đặt thành math.huge, sẽ không có điểm dừng giữa.số4
CostsBảng vật liệu hoặc được xác định PathfindingModifiers và chi phí cho việc di chuyển.Hữu ích để làm cho đại lý ưu tiên các vật liệu/khu vực nhất định hơn những người khác.Xem biến thể để có chi tiết.bảngnil
Tập lệnh địa phương

local PathfindingService = game:GetService("PathfindingService")
local path = PathfindingService:CreatePath({
AgentRadius = 3,
AgentHeight = 6,
AgentCanJump = false,
Costs = {
Water = 20
}
})

Lưu ý rằng đại lý có thể leo lên TrussParts trong quá trình tìm đường với điều kiện bạn đặt AgentCanClimb đến true khi tạo đường đi và không có gì chặn đại lý khỏi con đường leo truss.Một con đường có thể leo có nhãn Leo và chi phí cho một con đường có thể leo là 1 mặc định.

Path going up a climbable TrussPart ladder
LocalScript - Con đường leo trèo Truss

local PathfindingService = game:GetService("PathfindingService")
local path = PathfindingService:CreatePath({
AgentCanClimb = true,
Costs = {
Climb = 2 -- Chi phí của con đường leo trèo; mặc định là 1
}
})

Di chuyển dọc theo đường đi

Phần này sử dụng kịch bản tìm đường dẫn sau cho nhân vật của người chơi. Để kiểm tra trong khi đọc:

  1. Sao chép mã vào một LocalScript bên trong StarterCharacterScripts .
  2. Đặt biến TEST_DESTINATION thành một điểm đến Vector3 trong thế giới 3D mà nhân vật người chơi có thể tiếp cận.
  3. Tiến hành thông qua các phần sau để tìm hiểu về tính toán đường đi và di chuyển nhân vật.
LocalScript - Tìm đường con chữ cái

local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local path = PathfindingService:CreatePath()
local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")
local TEST_DESTINATION = Vector3.new(100, 0, 100)
local waypoints
local nextWaypointIndex
local reachedConnection
local blockedConnection
local function followPath(destination)
-- Tính đường đi
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Nhận điểm đường đi
waypoints = path:GetWaypoints()
-- Phát hiện nếu đường đi bị chặn
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Kiểm tra xem chướng ngại vật ở xa hơn trên đường đi
if blockedWaypointIndex >= nextWaypointIndex then
-- Ngừng phát hiện chặn đường cho đến khi đường được tính toán lại
blockedConnection:Disconnect()
-- Gọi chức năng để tính toán lại con đường mới
followPath(destination)
end
end)
-- Phát hiện khi di chuyển đến điểm dừng tiếp theo hoàn thành
if not reachedConnection then
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Tăng chỉ mục điểm dừng và di chuyển đến điểm dừng tiếp theo
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- Lúc đầu di chuyển đến điểm dừng thứ hai (điểm dừng đầu tiên là đường bắt đầu; bỏ qua nó)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end
followPath(TEST_DESTINATION)

Tính đường đi

Sau khi bạn đã tạo một con đường hợp lệ với CreatePath() , nó phải được tính toán bằng cách gọi Path:ComputeAsync() với một Vector3 cho cả điểm xuất phát và điểm đến.

LocalScript - Tìm đường con chữ cái

local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local path = PathfindingService:CreatePath()
local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")
local TEST_DESTINATION = Vector3.new(100, 0, 100)
local waypoints
local nextWaypointIndex
local reachedConnection
local blockedConnection
local function followPath(destination)
-- Tính đường đi
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
end
Path start/end marked on series of islands and bridges

Nhận điểm đường

Khi Path được tính toán, nó sẽ chứa một loạt điểm dừng theo dõi con đường từ đầu đến kết thúc.Các điểm này có thể được thu thập với chức năng Path:GetWaypoints() .

LocalScript - Tìm đường con chữ cái

local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local path = PathfindingService:CreatePath()
local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")
local TEST_DESTINATION = Vector3.new(100, 0, 100)
local waypoints
local nextWaypointIndex
local reachedConnection
local blockedConnection
local function followPath(destination)
-- Tính đường đi
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Nhận điểm đường đi
waypoints = path:GetWaypoints()
end
end
Waypoints indicated across computed path
Điểm dừng được chỉ ra trên toàn bộ con đường được tính toán

Di chuyển đường đi

Mỗi điểm dừng bao gồm cả một vị trí ( ) và một hành động ( ).Để di chuyển một nhân vật chứa một Humanoid , giống như một nhân vật Roblox thông thường, cách dễ nhất là gọi Humanoid:MoveTo() từ điểm đến điểm, sử dụng sự kiện MoveToFinished để phát hiện khi nhân vật đến mỗi điểm đến.

LocalScript - Tìm đường con chữ cái

local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local path = PathfindingService:CreatePath()
local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")
local TEST_DESTINATION = Vector3.new(100, 0, 100)
local waypoints
local nextWaypointIndex
local reachedConnection
local blockedConnection
local function followPath(destination)
-- Tính đường đi
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Nhận điểm đường đi
waypoints = path:GetWaypoints()
-- Phát hiện nếu đường đi bị chặn
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Kiểm tra xem chướng ngại vật ở xa hơn trên đường đi
if blockedWaypointIndex >= nextWaypointIndex then
-- Ngừng phát hiện chặn đường cho đến khi đường được tính toán lại
blockedConnection:Disconnect()
-- Gọi chức năng để tính toán lại con đường mới
followPath(destination)
end
end)
-- Phát hiện khi di chuyển đến điểm dừng tiếp theo hoàn thành
if not reachedConnection then
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Tăng chỉ mục điểm dừng và di chuyển đến điểm dừng tiếp theo
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- Lúc đầu di chuyển đến điểm dừng thứ hai (điểm dừng đầu tiên là đường bắt đầu; bỏ qua nó)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end

Xử lý các lối bị chặn

Nhiều thế giới Roblox là năng động; các bộ phận có thể di chuyển hoặc rơi và sàn có thể sụp đổ.Điều này có thể chặn một con đường được tính toán và ngăn nhân vật đến được điểm đến của nó.Để xử lý điều này, bạn có thể kết nối sự kiện Path.Blocked và tính toán lại con đường xung quanh bất cứ thứ gì đã chặn nó.

LocalScript - Tìm đường con chữ cái

local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local path = PathfindingService:CreatePath()
local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")
local TEST_DESTINATION = Vector3.new(100, 0, 100)
local waypoints
local nextWaypointIndex
local reachedConnection
local blockedConnection
local function followPath(destination)
-- Tính đường đi
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Nhận điểm đường đi
waypoints = path:GetWaypoints()
-- Phát hiện nếu đường đi bị chặn
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Kiểm tra xem chướng ngại vật ở xa hơn trên đường đi
if blockedWaypointIndex >= nextWaypointIndex then
-- Ngừng phát hiện chặn đường cho đến khi đường được tính toán lại
blockedConnection:Disconnect()
-- Gọi chức năng để tính toán lại con đường mới
followPath(destination)
end
end)
end
end

Biến thể tìm đường đi

Mặc định, trả về con đường ngắn nhất giữa điểm xuất phát và điểm đến, với ngoại lệ là nó cố gắng tránh nhảy.Điều này trông không tự nhiên trong một số tình huống - ví ví dụ / trường hợp, một con đường có thể đi qua nước thay vì qua một cây cầu gần đó chỉ vì con đường qua nước ngắn hơn về mặt hình học.

Two paths indicated with the shorter path not necessarily more logical

Để tối ưu hóa việc tìm đường càng xa hơn, bạn có thể thực hiện biến thể tìm đường để tính toán các con đường thông minh hơn trên các vật liệu khác nhau, xung quanh các khu vực được xác định hoặc thông qua trở ngại .

Đặt chi phí vật liệu

Khi làm việc với TerrainBasePart vật liệu, bạn có thể bao gồm một bảng Costs trong CreatePath() để làm cho một số vật liệu dễ di chuyển hơn so với những vật liệu khác.Tất cả các vật liệu đều có chi phí mặc định là 1 và bất kỳ vật liệu nào cũng có thể được xác định là không thể đi qua bằng cách đặt giá trị của nó thành math.huge .

Các chìa khóa trong bảng Costs phải là tên chuỗi đại diện cho tên Enum.Material , ví dụ Water cho Enum.Material.Water .

LocalScript - Tìm đường con chữ cái

local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local path = PathfindingService:CreatePath({
Costs = {
Water = 20,
Mud = 5,
Neon = math.huge
}
})

Làm việc với khu vực

Trong một số trường hợp, tùy chọn vật liệu không đủ.Ví dụ, bạn có thể muốn các nhân vật tránh một khu vực định n义 , bất kể các vật liệu dưới chân.Điều này có thể đạt được bằng cách thêm một đối tượng PathfindingModifier vào một phần.

  1. Tạo một phần Anchored xung quanh khu vực nguy hiểm và đặt tính chất CanCollide của nó thành sai .

    Anchored part defining a region to apply a pathfinding modifier to
  2. Chèn một ví dụ PathfindingModifier vào phần, tìm thuộc tính Label của nó, và gán một tên có ý nghĩa như DangerZone .

    PathfindingModifier instance with Label property set to DangerZone
  3. Bao gồm một bảng Costs bên trong CreatePath() chứa một chìa khóa phù hợp và giá trị số liên quan.Một modifier có thể được định nghĩa là không thể đi qua bằng cách đặt giá trị của nó thành math.huge .

    LocalScript - Tìm đường con chữ cái

    local PathfindingService = game:GetService("PathfindingService")
    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local Workspace = game:GetService("Workspace")
    local path = PathfindingService:CreatePath({
    Costs = {
    DangerZone = math.huge
    }
    })

Bỏ qua chướng ngại vật

Trong một số trường hợp, có ích khi tìm đường qua chướng ngại vật vững chắc như thể chúng không tồn tại.Điều này cho phép bạn tính toán một con đường thông qua các chặn vật lý cụ thể, so với việc tính toán thất bại hoàn toàn.

  1. Tạo một phần Anchored xung quanh đối tượng và đặt tính chất CanCollide của nó thành false .

    Anchored part defining a region to apply a pathfinding modifier to
  2. Chèn một ví dụ PathfindingModifier vào phần và bật chức năng PassThrough của nó.

    PathfindingModifier instance with PassThrough property enabled

    Bây giờ, khi một con đường được tính toán từ NPC thây ma đến nhân vật người chơi, con đường vượt ra ngoài cửa và bạn có thể yêu cầu zombie di chuyển qua nó.Ngay cả khi thây ma không thể mở cửa, nó phản ứng như thể "nghe thấy" nhân vật phía sau cửa.

    Zombie NPC path passing through the previously blocking door

Liên kết tìm đường đi

Đôi khi cần tìm một con đường qua không gian không thể đi thông thường, chẳng hạn như qua khoảng trống, và thực hiện một hành động tùy chỉnh để đến điểm dừng tiếp theo.Điều này có thể đạt được thông qua đối tượng PathfindingLink.

Sử dụng ví dụ hòn đảo ở trên, bạn có thể làm cho đại lý sử dụng một chiếc thuyền thay vì đi bộ qua tất cả các cây cầu.

PathfindingLink showing how an agent can use a boat instead of walking across all of the bridges

Để tạo một PathfindingLink sử dụng ví dụ này:

  1. Để hỗ trợ vẽ và gỡ lỗi, bật liên kết tìm đường từ widget Tùy chọn hiển thị ở góc trên bên phải của cửa sổ 3D viewport.

  2. Tạo hai Attachments , một trên ghế thuyền và một gần điểm hạ cánh của thuyền.

    Attachments created for pathfinding link's start and end
  3. Tạo một đối tượng PathfindingLink trong không gian làm việc, sau đó gán các thuộc tính Attachment0Attachment1 của nó cho các phụ lục bắt đầu và kết thúc tương ứng.

    Attachment0/Attachment1 properties of a PathfindingLink PathfindingLink visualized in the 3D world
  4. Gán một tên có ý nghĩa như Sử dụng Thuyền cho tài sản Label của nó.Tên này được sử dụng như một lá cờ trong kịch bản tìm đường để kích hoạt hành động tùy chỉnh khi đại lý đến điểm liên kết khởi động.

    Label property specified for PathfindingLink
  5. Bao gồm một bảng Costs bên trong CreatePath() chứa cả một chìa khóa Water và một chìa khóa tùy chỉnh phù hợp với tên thuộc tính Label.Gán chìa khóa tùy chỉnh một giá trị thấp hơn Water .

    LocalScript - Tìm đường con chữ cái

    local PathfindingService = game:GetService("PathfindingService")
    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local Workspace = game:GetService("Workspace")
    local path = PathfindingService:CreatePath({
    Costs = {
    Water = 20,
    UseBoat = 1
    }
    })
  6. Trong sự kiện xảy ra khi điểm dừng được đạt đến, thêm một kiểm tra tùy chỉnh cho tên chỉnh sửa Label và thực hiện một hành động khác với Humanoid:MoveTo() - trong trường hợp này, gọi một chức năng để ngồi đại diện cho đơn vị trên thuyền, di chuyển thuyền trên mặt nước và tiếp tục con đường của đại diện đến khi đến điểm đến.

    LocalScript - Tìm đường con chữ cái

    local PathfindingService = game:GetService("PathfindingService")
    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local Workspace = game:GetService("Workspace")
    local path = PathfindingService:CreatePath({
    Costs = {
    Water = 20,
    UseBoat = 1
    }
    })
    local player = Players.LocalPlayer
    local character = player.Character
    local humanoid = character:WaitForChild("Humanoid")
    local TEST_DESTINATION = Vector3.new(228.9, 17.8, 292.5)
    local waypoints
    local nextWaypointIndex
    local reachedConnection
    local blockedConnection
    local function followPath(destination)
    -- Tính đường đi
    local success, errorMessage = pcall(function()
    path:ComputeAsync(character.PrimaryPart.Position, destination)
    end)
    if success and path.Status == Enum.PathStatus.Success then
    -- Nhận điểm đường đi
    waypoints = path:GetWaypoints()
    -- Phát hiện nếu đường đi bị chặn
    blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
    -- Kiểm tra xem chướng ngại vật ở xa hơn trên đường đi
    if blockedWaypointIndex >= nextWaypointIndex then
    -- Ngừng phát hiện chặn đường cho đến khi đường được tính toán lại
    blockedConnection:Disconnect()
    -- Gọi chức năng để tính toán lại con đường mới
    followPath(destination)
    end
    end)
    -- Phát hiện khi di chuyển đến điểm dừng tiếp theo hoàn thành
    if not reachedConnection then
    reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
    if reached and nextWaypointIndex < #waypoints then
    -- Tăng chỉ mục điểm dừng và di chuyển đến điểm dừng tiếp theo
    nextWaypointIndex += 1
    -- Sử dụng thuyền nếu nhãn điểm dừng là "Sử dụng thuyền"; nếu không, di chuyển đến điểm dừng tiếp theo
    if waypoints[nextWaypointIndex].Label == "UseBoat" then
    useBoat()
    else
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    end
    else
    reachedConnection:Disconnect()
    blockedConnection:Disconnect()
    end
    end)
    end
    -- Lúc đầu di chuyển đến điểm dừng thứ hai (điểm dừng đầu tiên là đường bắt đầu; bỏ qua nó)
    nextWaypointIndex = 2
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    else
    warn("Path not computed!", errorMessage)
    end
    end
    function useBoat()
    local boat = Workspace.BoatModel
    humanoid.Seated:Connect(function()
    -- Bắt đầu di chuyển thuyền nếu đại lý đang ngồi
    if humanoid.Sit then
    task.wait(1)
    boat.CylindricalConstraint.Velocity = 5
    end
    -- Phát hiện vị trí hạn chế so với hòn đảo
    local boatPositionConnection
    boatPositionConnection = RunService.PostSimulation:Connect(function()
    -- Dừng thuyền khi ở gần hòn đảo
    if boat.CylindricalConstraint.CurrentPosition >= 94 then
    boatPositionConnection:Disconnect()
    boat.CylindricalConstraint.Velocity = 0
    task.wait(1)
    -- Loại bỏ đại lý và tiếp tục đến điểm đến
    humanoid.Sit = false
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    end
    end)
    end)
    end
    followPath(TEST_DESTINATION)

Tương thích phát trực tiếp

In-experience instream vídeo là một tính năng mạnh mẽ tải và tháo tải nội dung 3D một cách năng động khi nhân vật của người chơi di chuyển xung quanh thế giới.Khi họ khám phá không gian 3D, các phân tập mới của dòng không gian chảy vào thiết bị của họ và một số phân tập hiện có có thể bị tràn ra.

Xem xét các tốt nhất sau đây cho việc sử dụng PathfindingService trong các trải nghiệm bật phát trực tiếp:

  • Phát trực tiếp có thể chặn hoặc bỏ chặn một con đường nhất định như một nhân vật di chuyển theo nó.Ví dụ, trong khi một nhân vật chạy qua khu rừng, một cây có thể dòng chảy ở đâu đó trước họ và cản trở con đường.Để làm cho công việc tìm đường hoạt động mượt mà với phát trực tuyến, được khuyến khích mạnh mẽ rằng bạn nên sử dụng kỹ thuật xử lý các con đường bị chặn và tính toán lại con đường khi cần thiết.

  • Một phương pháp phổ biến trong tìm đường là sử dụng các điểm cố định của các đối tượng hiện có cho tính toán, chẳng hạn như đặt điểm đến của một con đường đến vị trí của một mô hình Hòm Kho Báu hiện có trên thế giới.Cách tiếp cận này hoàn toàn tương thích với phía máy chủ Scripts vì máy chủ có tầm nhìn trọn vẹn về thế giới mọi lúc, nhưng LocalScriptsModuleScripts những thứ chạy trên máy khách có thể thất bại nếu họ cố gắng tính toán một con đường đến một đối tượng không được phát trực tiếp vào.

    Để giải quyết vấn đề này, hãy xem xét việc đặt điểm đến vào vị trí của một BasePart trong một mô hình bền vững.Các mô hình bền vững tải sớm sau khi người chơi tham gia và chúng không bao giờ phát trực tuyến, vì vậy một kịch bản bên khách có thể kết nối với sự kiện PersistentLoaded và truy cập an toàn mô hình để tạo điểm dừng sau khi sự kiện bùng phát.