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.
Navigasyon görselleştirme
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.

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

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

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.
Anahtar | Açıklama | Tür | Varsayılan |
---|---|---|---|
AgentRadius | Ajan yarıçapı, mil ile. Engellerden minimum ayrılma belirlenmesi için yararlı. | sayısal | 2 |
AgentHeight | Ajan yüksekliği, çivilerle. Bu değerden daha küçük boş alan, merdivenlerin altındaki alan gibi, geçilemez olarak işaretlenecektir. | sayısal | 5 |
AgentCanJump | Yol bulma sırasında atlamanın izin verilip verilmediğini belirler. | boşluklı | true |
AgentCanClimb | Yol bulma sırasında TrussParts tırmanmanın izin verilip verilmediğini belirler. | boşluklı | false |
WaypointSpacing | Yol üzerindeki orta yol noktaları arasındaki boşluk. math.huge olarak ayarlanırsa, orta yol noktaları olmayacaktır. | sayı | 4 |
Costs | Malzeme 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. | tablo | nil |
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.

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:
- Kodu Class.LocalScript``Class.StarterCharacterScripts .
- Oyun karakterinin ulaşabileceği 3B dünyanızdaki bir TEST_DESTINATION değişkeninin hedefini Vector3 olarak ayarlayın.
- 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

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

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

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.
Tehlikeli bölge etrafında bir Anchored parça oluşturun ve onun CanCollide özelliğini yalan olarak ayarlayın.
Parçaya bir PathfindingModifier örneği ekleyin, onun Label özelliğini bulun ve DangerZone gibi anlamlı bir isim atayın.
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 Bulmalocal 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.
Nesne etrafında bir Anchored parça oluştur ve onun CanCollide özelliğini yalan olarak ayarla.
Parçaya bir PathfindingModifier örneği ekleyin ve onun PassThrough özelliğini etkinleştirin.
Ş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.
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.

Bu örnek kullanarak bir PathfindingLink oluşturmak için:
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.
İki Attachments, biri teknenin koltuğunda ve diğeri de teknenin iniş noktasının yakınında.
Ç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.
Ö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.
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 Bulmalocal 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}})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 Bulmalocal 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.LocalPlayerlocal character = player.Characterlocal humanoid = character:WaitForChild("Humanoid")local TEST_DESTINATION = Vector3.new(228.9, 17.8, 292.5)local waypointslocal nextWaypointIndexlocal reachedConnectionlocal blockedConnectionlocal function followPath(destination)-- Yolu hesaplalocal success, errorMessage = pcall(function()path:ComputeAsync(character.PrimaryPart.Position, destination)end)if success and path.Status == Enum.PathStatus.Success then-- Yol noktalarını alınwaypoints = path:GetWaypoints()-- Yol engellendiğinde tespit edinblockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)-- Engelin yolun daha aşağısında olup olmadığını kontrol etif blockedWaypointIndex >= nextWaypointIndex then-- Yol engeli tespit edilmesini durdur, yol yeniden hesaplanana kadarblockedConnection:Disconnect()-- Yeni yolun yeniden hesaplanması için çağırma işlevifollowPath(destination)endend)-- Sonraki yol noktasına hareketin tamamlandığını tespit etif not reachedConnection thenreachedConnection = 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çinif waypoints[nextWaypointIndex].Label == "UseBoat" thenuseBoat()elsehumanoid:MoveTo(waypoints[nextWaypointIndex].Position)endelsereachedConnection:Disconnect()blockedConnection:Disconnect()endend)end-- Başlangıçta ikinci yol noktasına geç (ilk yol noktası yol başlat; atlayın)nextWaypointIndex = 2humanoid:MoveTo(waypoints[nextWaypointIndex].Position)elsewarn("Path not computed!", errorMessage)endendfunction useBoat()local boat = Workspace.BoatModelhumanoid.Seated:Connect(function()-- Ajan oturuyorsa teknenin hareket etmesini başlatif humanoid.Sit thentask.wait(1)boat.CylindricalConstraint.Velocity = 5end-- Ada ile ilgili kısıtlayıcı konumunu tespit etlocal boatPositionConnectionboatPositionConnection = RunService.PostSimulation:Connect(function()-- Ada yanında tekneyi durdurif boat.CylindricalConstraint.CurrentPosition >= 94 thenboatPositionConnection:Disconnect()boat.CylindricalConstraint.Velocity = 0task.wait(1)-- Ajanı kaldır ve hedefe devam ethumanoid.Sit = falsehumanoid:MoveTo(waypoints[nextWaypointIndex].Position)endend)end)endfollowPath(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.