Karakter yol bulma

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Yol bulma bir karakteri bir varış noktasına ulaşmak için mantıksal bir yol boyunca hareket ettirme sürecidir, engellerden kaçınma ve (isteğe bağlı olarak) tehlikeli malzemelerden veya tanımlanmış bölgelerden uzak durma.

Yol bulma düzenine ve depurajına yardımcı olmak için, Studio bir navigasyon örüntüsü ve düzenleyici etiketlerini renderlayabilir.Bunları etkinleştirmek için, 3D görüntü penceresinin sağ üst kısmındaki Görüntüleme Seçenekleri düğmesinden Navigasyon örgüsü ve Yol bulma modifiyerleri 'yi açın.

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

Navigasyon örgüsü etkinleştirildiğinde, renkli alanlar bir karakterin yüzmeveya yüzebileceği yeri gösterirken, renksiz alanlar engellenir.Küçük oklar, bir karakterin atlayarak ulaşmaya çalışacağı alanları gösterir, varsayımsal olarak oluştururken yol oluşturduğunuzda ].

Navigation mesh showing in Studio

Yol bulma modifiyerleri etkinleştirildiğinde, metin etiketleri yol bulma modifiyerleri kullanılırken dikkate alınan belirli materyalleri ve bölgeleri gösterir.

Navigation labels showing on navigation mesh

Bilinen sınırlar

Yol bulma özellikleri verimli işlem ve optimum sözleşme imzalamasağlamak için belirli sınırlamalara sahiptir.

Dikey yerleştirme sınırı

Yol bulma hesapları yalnızca belirli dikey sınırlar içindeki parçaları dikkate alır:

  • Alt Sınır — Alt Y koordinatlı parçalar 65,536 damdan daha az olan parçalar göz ardı edilir.
  • Üst Sınır — Üst Y koordinatlı parçalar 65,536 vida sınırını aşan parçalar göz ardı edilir.
  • Dikey Genişlik — En alçak parçanın dibinden en yüksek parçanın üstüne kadar olan dikey mesafe Y koordinatından en yüksek parçanın üstüne kadar olan koordinat Y olmalıdır; aksi takdirde, yol bulma sistemi bu parçaları yol bulma hesaplaması sırasında görmezden gelecektir.

Arama mesafesi sınırlaması

Başlangıç ​​noktasından bitiş noktasına yol bulma için doğrudan görüş mesafesi 3,000 stud'u aşmamalıdır.Bu mesafeyi aşmak bir NoPath durumuna yol açacaktır.

Yollar oluştur

Yol bulma, PathfindingService ve onun CreatePath() işlevi aracılığıyla başlatılır.

YerelScript

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

CreatePath() isteğe bağlı bir parametre tablosu kabul eder, ki bu, karakterin (ajanın) yol boyunca nasıl hareket ettiğini ayarlar.

AnahtarAçıklamaTürVarsayılan
AgentRadiusAjan yarıçapı, mil ile. Engellerden minimum ayrılma belirlenmesi için yararlı.sayısal2
AgentHeightAjan yüksekliği, çivilerle. Bu değerden daha küçük boş alan, merdivenlerin altındaki alan gibi, geçilemez olarak işaretlenecektir.sayısal5
AgentCanJumpYol bulma sırasında atlamanın izin verilip verilmediğini belirler.boşluklıtrue
AgentCanClimbYol bulma sırasında TrussParts tırmanmanın izin verilip verilmediğini belirler.boşluklıfalse
WaypointSpacingYol üzerindeki orta yol noktaları arasındaki boşluk. math.huge olarak ayarlanırsa, orta yol noktaları olmayacaktır.sayı4
CostsMalzeme tablosu veya tanımlanmış PathfindingModifiers ve geçiş maliyeti.Ajanın belirli materyalleri/bölgeleri diğerlerinden tercih etmesini sağlamak için yararlı.Detaylar için modifiye ediciler görün.tablonil
YerelScript

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

Ajanın yol bulma sırasında TrussParts tırmanabileceğini unutmayın, yol oluştururken AgentCanClimb``trueyol oluşturduğunuzda ve hiçbir şey ajanı truss tırmanma yolundan engellemez ve hiçbir şey ajanın tırmanma yolundan engellemez.Tırmanılabilir bir yolun etiketi Tırmanış ve tırmanılabilir bir yolun maliyeti maliyeti varsayılan olarak 1 dır.

Path going up a climbable TrussPart ladder
YerelScript - Kafes Tırmanma Yolu

local PathfindingService = game:GetService("PathfindingService")
local path = PathfindingService:CreatePath({
AgentCanClimb = true,
Costs = {
Climb = 2 -- Tırmanma yolunun maliyeti; varsayılan 1'dir
}
})

Yollar boyunca hareket et

Bu bölüm, oyuncunun karakteri için aşağıdaki yol bulma komutunu kullanır. Okurken test etmek için:

  1. Kodu Class.LocalScript``Class.StarterCharacterScripts .
  2. Oyun karakterinin ulaşabileceği 3B dünyanızdaki bir TEST_DESTINATION değişkeninin hedefini Vector3 olarak ayarlayın.
  3. Yol hesaplaması ve karakter hareketi hakkında bilgi edinmek için aşağıdaki bölümlerden geçin.
YerelScript - Karakter Yol Bulma

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)
-- Yolu hesapla
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol noktalarını alın
waypoints = path:GetWaypoints()
-- Yol engellendiğinde tespit edin
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Engelin yolun daha aşağısında olup olmadığını kontrol et
if blockedWaypointIndex >= nextWaypointIndex then
-- Yol engeli tespit edilmesini durdur, yol yeniden hesaplanana kadar
blockedConnection:Disconnect()
-- Yeni yolun yeniden hesaplanması için çağırma işlevi
followPath(destination)
end
end)
-- Sonraki yol noktasına hareketin tamamlandığını tespit et
if not reachedConnection then
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Yol noktası indeksini artır ve bir sonraki yol noktasına geç
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- Başlangıçta ikinci yol noktasına geç (ilk yol noktası yol başlat; atlayın)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end
followPath(TEST_DESTINATION)

Yolu hesapla

Geçerli bir yol oluşturduktan sonra , başlangıç noktası ve varış noktası için her ikisi için de hesaplanmalıdır ile çağrılarak.

YerelScript - Karakter Yol Bulma

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)
-- Yolu hesapla
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
end
Path start/end marked on series of islands and bridges

Yol noktaları al

Bir kez Path hesaplandıktan sonra, baştan bitiryolun izini takip eden bir dizi yol noktası içerecektir.Bu noktalar Path:GetWaypoints() işleviyle toplanabilir.

YerelScript - Karakter Yol Bulma

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)
-- Yolu hesapla
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol noktalarını alın
waypoints = path:GetWaypoints()
end
end
Waypoints indicated across computed path
Hesaplanan yol boyunca gösterilen yol noktaları

Yol hareketi

Her yol noktası hem bir konum ( Vector3 ) hem de bir eylem ( PathWaypointAction ) içerir.Tipik bir Roblox karakteri gibi bir Humanoid içeren bir karakteri hareket ettirmek için, yol noktasından yol noktasına çağırmak, Humanoid:MoveTo() etkinliğini kullanarak karakterin her yol noktasına ulaştığını tespit etmek için, karakterin her yol noktasına ulaştığını tespit etmek için MoveToFinished etkinliğini kullanmak en kolay yoldur.

YerelScript - Karakter Yol Bulma

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)
-- Yolu hesapla
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol noktalarını alın
waypoints = path:GetWaypoints()
-- Yol engellendiğinde tespit edin
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Engelin yolun daha aşağısında olup olmadığını kontrol et
if blockedWaypointIndex >= nextWaypointIndex then
-- Yol engeli tespit edilmesini durdur, yol yeniden hesaplanana kadar
blockedConnection:Disconnect()
-- Yeni yolun yeniden hesaplanması için çağırma işlevi
followPath(destination)
end
end)
-- Sonraki yol noktasına hareketin tamamlandığını tespit et
if not reachedConnection then
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Yol noktası indeksini artır ve bir sonraki yol noktasına geç
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- Başlangıçta ikinci yol noktasına geç (ilk yol noktası yol başlat; atlayın)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end

Engellenmiş yolları ele alma

Birçok Roblox dünyası dinamiktir; parçalar hareket edebilir veya düşebilir ve zeminler çökebilir.Bu, hesaplanmış bir yol engelleyebilir ve karakterin hedefine ulaşmasını engelleyebilir.Bununla başa çıkmak için, Path.Blocked etkinliğini bağlayabilir ve engellediği her şeyin etrafındaki yolu yeniden hesaplayabilirsiniz.

YerelScript - Karakter Yol Bulma

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)
-- Yolu hesapla
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol noktalarını alın
waypoints = path:GetWaypoints()
-- Yol engellendiğinde tespit edin
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Engelin yolun daha aşağısında olup olmadığını kontrol et
if blockedWaypointIndex >= nextWaypointIndex then
-- Yol engeli tespit edilmesini durdur, yol yeniden hesaplanana kadar
blockedConnection:Disconnect()
-- Yeni yolun yeniden hesaplanması için çağırma işlevi
followPath(destination)
end
end)
end
end

Yol bulma modifiyerleri

Varsayılan olarak, Path:ComputeAsync() başlangıç noktası ile hedef arasındaki en kısa yol yolu döndürür, atlamalardan kaçınmaya çalışırken istisna dışında.Bu, bazı durumlarda doğal olmayan görünüyor - örneğin, bir yol sadece yakındaki bir köprüden geçmek yerine su üzerinden geçebilir, çünkü su yolunun geometrik olarak daha kısa olması.

Two paths indicated with the shorter path not necessarily more logical

Yol bulma optimizasyonunu daha da geliştirmek için, tanımlanmış bölgelerden , çeşitli materyallerden veya engellerden engellerden daha akıllı yollar bulmak için yol bulma değiştiricileri uygulayabilirsiniz.

Malzeme maliyetlerini ayarla

Terrain ve BasePart malzemeleri ile çalışırken, belirli malzemeleri diğerlerinden daha gezilebilir hale getirmek için Costs tablosunu CreatePath() içine dahil edebilirsiniz.Tüm materyallerin varsayılan maliyeti 1 ve herhangi bir materyal değeri ile geçilemez olarak tanımlanabilir math.huge olarak ayarlanarak tanımlanabilir.

Costs tablosundaki anahtarlar, örneğin Enum.Material isimlerini temsil eden Water dize adları olmalıdır, örneğin Enum.Material.Water için.

YerelScript - Karakter Yol Bulma

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

Bölgelerle çalış

Bazı durumlarda, malzeme tercihi yeterli değildir.Örneğin, karakterlerin tanımlanmış bir bölgeden kaçınmasını istemeyebilirsiniz, ayak altındaki malzemelere rağmen.Bu, bir parçaya bir PathfindingModifier nesne ekleyerek elde edilebilir.

  1. Tehlikeli bölge etrafında bir Anchored parça oluşturun ve onun CanCollide özelliğini yalan olarak ayarlayın.

    Anchored part defining a region to apply a pathfinding modifier to
  2. Parçaya bir PathfindingModifier örneği ekleyin, onun Label özelliğini bulun ve DangerZone gibi anlamlı bir isim atayın.

    PathfindingModifier instance with Label property set to DangerZone
  3. Eşleşen bir anahtar ve ilişkili sayısal değer içeren Costs bir tablo CreatePath() içine dahil edin, içinde uygun bir anahtar ve ilişkili sayısal değer bulunan.Bir değiştirici, değerini math.huge olarak ayarlayarak gezilemez olarak tanımlanabilir.

    YerelScript - Karakter Yol Bulma

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

Engelleri görmezden gel

Bazı durumlarda, varmak için katı engellerden geçmek, sanki mevcut olmasalar gibi yararlıdır.Bu, özel fiziksel engellerden geçen bir yol hesaplamanıza izin verir, yani hesap başarısız olur.

  1. Nesne etrafında bir Anchored parça oluştur ve onun CanCollide özelliğini yalan olarak ayarla.

    Anchored part defining a region to apply a pathfinding modifier to
  2. Parçaya bir PathfindingModifier örneği ekleyin ve onun PassThrough özelliğini etkinleştirin.

    PathfindingModifier instance with PassThrough property enabled

    Şimdi, bir yol zombi NPC'den oyuncu karakterine hesaplandığında, yol kapının ötesine genişler ve zombiyi onu geçmesi için uyarabilirsiniz.Zombi kapıyı açamıyor olsa bile, kapının arkasındaki karakteri "duyuyor" gibi tepki verir.

    Zombie NPC path passing through the previously blocking door

Yol bulma bağlantıları

Bazen bir uzay üzerinde normal olarak gezilemeyen bir yol bulmak, örneğin boşluğun üzerinden, ve bir sonraki varış noktasına ulaşmak için özel bir eylem gerçekleştirmek gerekir.Bu, PathfindingLink nesnesi aracılığıyla elde edilebilir.

Yukarıdaki ada örneğini kullanarak, ajanın tüm köprüler üzerinde yürümek yerine bir tekne kullanmasını sağlayabilirsiniz.

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

Bu örnek kullanarak bir PathfindingLink oluşturmak için:

  1. Görselleştirme ve depurajda yardımcı olmak için, 3D görüntü penceresinin sağ üst kısmındaki Görüntüleme Seçenekleri düzeneğinden Yol bulma bağlantıları açık hale getirin.

  2. İki Attachments, biri teknenin koltuğunda ve diğeri de teknenin iniş noktasının yakınında.

    Attachments created for pathfinding link's start and end
  3. Çalışma alanında bir PathfindingLink nesnesi oluşturun, ardından Bağlantı0 ve Bağlantı1 özelliklerini başlangıç ve bitiş eklerine atayın, birbirine göre.

    Attachment0/Attachment1 properties of a PathfindingLink PathfindingLink visualized in the 3D world
  4. Önemli bir adı, örneğin UseBoat özelliklerine atayın Label.Bu isim, ajan başlangıç bağlantı noktasına ulaştığında özel bir eylem tetiklemek için yol bulma kılavuzunda bayrak olarak kullanılır.

    Label property specified for PathfindingLink
  5. Her biri bir Costs ve bir özel anahtar içeren hem bir Water anahtarı hem de Label özellik adına uyan bir özel anahtar içeren bir CreatePath() tablosu dahil edin.Özel anahtara Water daha düşük bir değer atayın.

    YerelScript - Karakter Yol Bulma

    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. Bir varış noktasına ulaşıldığında ateşlenen olayda, Label modifiye adı için özel bir kontrol ekleyin ve Humanoid:MoveTo() — bu durumda, bir işlev çağrılarak ajanın tekneye oturması, su üzerinde hareket etmesi ve varış adasında ajanın yolunu sürdürmesi sırasında farklı bir eylem yapın.

    YerelScript - Karakter Yol Bulma

    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)
    -- Yolu hesapla
    local success, errorMessage = pcall(function()
    path:ComputeAsync(character.PrimaryPart.Position, destination)
    end)
    if success and path.Status == Enum.PathStatus.Success then
    -- Yol noktalarını alın
    waypoints = path:GetWaypoints()
    -- Yol engellendiğinde tespit edin
    blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
    -- Engelin yolun daha aşağısında olup olmadığını kontrol et
    if blockedWaypointIndex >= nextWaypointIndex then
    -- Yol engeli tespit edilmesini durdur, yol yeniden hesaplanana kadar
    blockedConnection:Disconnect()
    -- Yeni yolun yeniden hesaplanması için çağırma işlevi
    followPath(destination)
    end
    end)
    -- Sonraki yol noktasına hareketin tamamlandığını tespit et
    if not reachedConnection then
    reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
    if reached and nextWaypointIndex < #waypoints then
    -- Yol noktası indeksini artır ve bir sonraki yol noktasına geç
    nextWaypointIndex += 1
    -- Yol noktası etiketi "UseBoat" ise tekneyi kullanın; aksi takdirde bir sonraki yol noktasına geçin
    if waypoints[nextWaypointIndex].Label == "UseBoat" then
    useBoat()
    else
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    end
    else
    reachedConnection:Disconnect()
    blockedConnection:Disconnect()
    end
    end)
    end
    -- Başlangıçta ikinci yol noktasına geç (ilk yol noktası yol başlat; atlayı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()
    -- Ajan oturuyorsa teknenin hareket etmesini başlat
    if humanoid.Sit then
    task.wait(1)
    boat.CylindricalConstraint.Velocity = 5
    end
    -- Ada ile ilgili kısıtlayıcı konumunu tespit et
    local boatPositionConnection
    boatPositionConnection = RunService.PostSimulation:Connect(function()
    -- Ada yanında tekneyi durdur
    if boat.CylindricalConstraint.CurrentPosition >= 94 then
    boatPositionConnection:Disconnect()
    boat.CylindricalConstraint.Velocity = 0
    task.wait(1)
    -- Ajanı kaldır ve hedefe devam et
    humanoid.Sit = false
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    end
    end)
    end)
    end
    followPath(TEST_DESTINATION)

Yayın uyumluluğu

Deneyim içi instans yayını 3D içeriği dünya çapında bir oyuncunun karakteri hareket ettiğinde dinamik olarak yükler ve yükler. güçlü bir özelliktir.3B uzayı keşfederken, uzay akışının yeni alt grupları cihazlarına gider ve mevcut alt grupların bazıları yayınlanabilir.

Yayın destekli deneyimlerde PathfindingService kullanmak için aşağıdaki en iyi uygulamaları düşünün:

  • Yayın, bir karakter bunun üzerinde hareket ederken belirli bir yolu engelleme veya engellemeyi kaldırabilir.Örneğin, bir karakter orman boyunca koşarken, bir ağaç önünde bir yerde akış yapabilir ve yolu engelleyebilir.Yol bulma işi akışla sorunsuz bir şekilde çalışması için, gerekli olduğunda bloklanmış yolları ele alma tekniğini kullanmanız ve gerektiğinde yolu yeniden hesaplamanız önerilir.

  • Yol bulma sırasında yaygın bir yaklaşım, mevcut nesnelerin koordinatlarını hesaplama için kullanmaktır, örneğin dünyadaki mevcut bir Hazine Sandığı modelinin konumuna bir yol hedefi ayarlamak.Bu yaklaşım, sunucunun tüm zamanlar boyunca dünyaya tam görünümü olduğundan dolayı sunucu tarafında tamamen uyumludur Scripts , ancak LocalScripts ve ModuleScripts , istemci üzerinde çalışan yol bir nesneye aktarılmayan bir yol hesaplamaya çalışırsa başarısız olabilir.

    Bu sorunu ele almak için, hedefin bir kalıcı model içinde bir BasePart konumuna ayarlanmasını düşünün.Kalıcı modeller, oyuncu katıldıktan kısa bir süre sonra yüklenir ve asla yayınlanmaz, bu nedenle bir istemci tarafı kodu olay ateşlendikten sonra yol noktaları oluşturmak için modeline güvenli bir şekilde erişebilir.