Yol Gösterme bir karakteri mantıksal bir yol üzerinde hareket ettirerek bir hedefe ulaşma işlemini, engelleri ve (isteğe bağlı) tehlikeli malzemeleri veya belirli bölgeleri vardır.
Navigasyon Görüntüleme
Yol bulma düzenine ve hata ayıklama işlevselliğine yardımcı olmak için, Studio bir navigasyon ağı ve modifier etiketlerini gösterir. Onları etkinleştirmek için, Navigasyon ağı ve modifier etiketlerinden 3D görüntü ortasındaki 2>Navigasyon ayarları2> ve
Navigasyon kaynağını etkinleştirdiğinizde, renkli alanlar bir karakterin yüzmeveya yüzebileceği yeri gösterirken, renkli olmayan alanlar blok edilir. Küçük oklar, bir karakterin yürüyebileceği veya yüzebileceği yeri gösterirken AgentCanJump ile true
Yol bulma modifikatörleri etkinleştirildiğinde, yol bulma modifikatörleri kullanıldığında dikkate alınan özel malzemeleri ve bölgeleri gösterir.
Bilinen Sınırlamalar
Yol Gösterme özellikleri verimli işlem ve maksimum sözleşme imzalamasağlamak için belirli sınırlamalara sahiptir.
Yatay Yerleştirme Sınırı
Yol bulma hesapları sadece belirli bir yatay sınır içindeki parçaları göz önünde bulundurur:
- Düşük Sınır - Y koordinatının altındaki parçalar 65,536'dan daha az önemsiz hale getirilir.
- Üst Sınır - 65,536 stud'un üstünde Y koordinatıyla aşan parçalar görülmez.
- Yatay Uzunluk — En düşük kısmın altındaki yatay mesafe Y kodu ile en yüksek kısmın üstüne Y koordine olmalıdır; aksi takdirde, yol bulma sistemi bu parçaları yol bulma hesabı sırasında görmezden gelir.
Arama Mesafesi Sınırı
Yol bulma sırasında başlangıç noktasından son noktasına doğrudan görüş mesafesi 3.000 stud'den fazla olamaz. Bu mesafeyi aşmak ile sonuçlanacak bir NoPath durumu sona erecektir.
Yollar Oluşturulması
Yol bulma, PathfindingService ve onun CreatePath() işlevi aracılığıyla başlatılır.
Yerel Kod
local PathfindingService = game:GetService("PathfindingService")local path = PathfindingService:CreatePath()
CreatePath(), karakterin (ajent) yol boyunca hareket ettiğini iyileştiren bir seçeneksel tablosu parametreleri kabul eder.
Anahtar | Açıklama | Tür | Varsayılan |
---|---|---|---|
AgentRadius | Ajan menzili, in studs. Objelerden minimum ayrılımı belirlemek için yararlı. | sayı | 2 |
AgentHeight | Ajan yüksekliği, inç olarak ifade edilir. Merdiven altındaki boş alan gibi, bu değerden daha küçük alanlar geçersiz olarak işaretlenir. | sayı | 5 |
AgentCanJump | Yol bulma sırasında zıplamanın izin verilip etkinleştirileceğini belirler. | boo | true |
AgentCanClimb | Yol bulma sırasında tırmanma izin verileceğini belirler. | boo | false |
WaypointSpacing | Yol boyunca yerleştirilmiş yerleştirme noktaları arasındaki boşluk. Eğer math.huge olarak ayarlandıysa, orta yerleştirme noktaları yok olacaktır. | sayı | 4 |
Costs | Malzeme tablosu veya belirlenmiş PathfindingModifiers ve geçiş için maliyetleri. Trafik için bazı malzemeleri/bölgeleri tercih etmenizi sağlayan modifikatörleri görüntüleyin. Ajanın bazı malzemeleri/bölgeleri üzerinde tercih ettiği malzemeleri görüntüleyin. Ajandanın tercihlerine genel bakın. modifikatörleri için detayları görüntüley | masa | nil |
Yerel Kod
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ırmanabilirsiniz, yolu oluştururken AgentCanClimb 'i true olarak ayarlarsanız. Bir yol tırmanma yapabil
Yerel Kod - İstemci Tırmanma Yolu
local PathfindingService = game:GetService("PathfindingService")local path = PathfindingService:CreatePath({AgentCanClimb = true,Costs = {Climb = 2 -- Tırmanma yolunun maliyeti; varsayılan 1}})
Yolların Takip Edilmesi
Bu bölüm oyuncunun karakteri için aşağıdaki yol bulma kısmını kullanır. To test while reading:
- Kodu LocalScript içindeki bir StarterCharacterScripts içine kopyalayın.
- Oyuncu karakterinin ulaşabileceği bir Vector3 hedefine 11. satırı düzenle.
- Yol hesabı ve karakter hareketi hakkında bilgi almak için aşağıdaki bölümleri geçin.
Yerel Kod - Karakter Yol Göstirme
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
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)
-- Yolı Hesap Et
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol güvenim noktalarını alın
waypoints = path:GetWaypoints()
-- Yol bloğa düştüğünü tespit et
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Engellenmenin yolun daha aşağı olduğunu kontrol edin
if blockedWaypointIndex >= nextWaypointIndex then
-- Yol tekrar hesaplandığına kadar yol engellemeyi durdur
blockedConnection:Disconnect()
-- Yeni yolı yeniden hesap etmek için fonksiyonu çağır
followPath(destination)
end
end)
-- Hareket sonraki yönlendirme noktasına tamamlandığında algılanır
if not reachedConnection then
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Yön noktası indeksini artır ve bir sonraki yön noktasına hareket et
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- İlk olarak ikinci gözcüğe hareket et (ilk gözcük yol başlat; atlayın)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end
followPath(TEST_DESTINATION)
Yol Hesabı
Bir geçerli yolu oluşturduktan sonra CreatePath() ile, şu anda Class.Path:ComputeAsync() ile çağrılmalıdır, bu da başlangıç noktası ve hedef arasında bir geçerli yol olmalıdır.
Yerel Kod - Karakter Yol Göstirme
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
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)
-- Yolı Hesap Et
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
end
Yol Noktaları Alınıyor
Bir Path hesaplandığında, bir seri hareket noktaları içerecek ki, bu yolu başlangıç noktasından bitirnoktasına takip eder. Bu noktalar Path:GetWaypoints() işleviyle toplanabilir.
Yerel Kod - Karakter Yol Göstirme
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
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)
-- Yolı Hesap Et
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol güvenim noktalarını alın
waypoints = path:GetWaypoints()
end
end
Yol Hareketi
Her yön noktası, bir pozisyon ( Vector3 ) ve bir eylem ( 1> Class.Human
Yerel Kod - Karakter Yol Göstirme
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
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)
-- Yolı Hesap Et
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol güvenim noktalarını alın
waypoints = path:GetWaypoints()
-- Yol bloğa düştüğünü tespit et
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Engellenmenin yolun daha aşağı olduğunu kontrol edin
if blockedWaypointIndex >= nextWaypointIndex then
-- Yol tekrar hesaplandığına kadar yol engellemeyi durdur
blockedConnection:Disconnect()
-- Yeni yolı yeniden hesap etmek için fonksiyonu çağır
followPath(destination)
end
end)
-- Hareket sonraki yönlendirme noktasına tamamlandığında algılanır
if not reachedConnection then
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Yön noktası indeksini artır ve bir sonraki yön noktasına hareket et
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- İlk olarak ikinci gözcüğe hareket et (ilk gözcük yol başlat; atlayın)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end
Bloklu Yolların İşlenmesi
Birçok Roblox dünyası dinamiktir; parçalar hareket edebilir ve zeminler düşebilir. Bu, karakterin hedefine ulaşmasını engeller ve karakterin yolunu etkileyen blokları yeniden hesaplayabilir. Bunu ele almak için, Path.Blocked etkinliğini bağlayabilir ve blokların etrafındaki yolu yeniden hesaplayabilirsiniz.
Yerel Kod - Karakter Yol Göstirme
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
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)
-- Yolı Hesap Et
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Yol güvenim noktalarını alın
waypoints = path:GetWaypoints()
-- Yol bloğa düştüğünü tespit et
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Engellenmenin yolun daha aşağı olduğunu kontrol edin
if blockedWaypointIndex >= nextWaypointIndex then
-- Yol tekrar hesaplandığına kadar yol engellemeyi durdur
blockedConnection:Disconnect()
-- Yeni yolı yeniden hesap etmek için fonksiyonu çağır
followPath(destination)
end
end)
end
end
Yol Gösterme Modifikatörleri
Varsayılan olarak, Path:ComputeAsync() başlangıç noktasından hedef arasındaki en kısa yolu, jumps'ı önlemek için denemesi gerektiği hariç, ile döndürür. Bu, bazı durumlarda doğal olmayan görünür - örneğin, bir yol suyun üstünden geçerken geometrik olarak daha kısa bir yol izleyebil
Yol bulma işlevini daha da optimize etmek için, yol bulma modifikatörlerini uygulayarak, çeşitli malzemeler , etrafında belirlenmiş bölgeler veya 2>engeller2> aracılığıyla daha akıllı yollar hesaplayabilirsiniz.
Malzeme Maliyetlerini Ayarlama
Class.Terrain ve BasePart malzemeleri ile çalışırken, bazı malzemeleri diğerlerinden daha çok geçişlere sahip hale getirmek için Costs tablosunu
Anahtarlar Costs tablosunda, örneğin Enum.Material için Water isimlerini temsil eden yuva isimleri olmalıdır.
Yerel Kod - Karakter Yol Göstirme
local PathfindingService = game:GetService("PathfindingService")local Players = game:GetService("Players")local RunService = game:GetService("RunService")local path = PathfindingService:CreatePath({Costs = {Water = 20,Mud = 5,Neon = math.huge}})
Bölgelerle Çalışma
Bazı durumlarda, malzeme tercihi yeterli değildir. Örneğin, karakterlerin altındaki malzemelerin belirli bir bölge ından kaçınmasını istiyebilirsiniz. Bunu PathfindingModifier elde edebilirsiniz.
Tehlikeli bölgenin etrafında bir Anchored parçası oluşturun ve onun CanCollide özelliğini false olarak ayarlın.
Parçaya bir PathfindingModifier instansı ekleyin, onun Class.Pathfindingmodified.Label|Label özelliğini bulun ve Tehlike Bölgesi gibi anlamlı bir isim verin.
Eşleşen bir anahtar ve ilgili sayı değerini içeren bir Costs içinde bir CreatePath() tablosu içeriyor. Bir değiştirici, değerini math.huge olarak ayarlarak geçersiz hale getirebilir.
Yerel Kod - Karakter Yol Göstirmelocal PathfindingService = game:GetService("PathfindingService")local Players = game:GetService("Players")local RunService = game:GetService("RunService")local path = PathfindingService:CreatePath({Costs = {DangerZone = math.huge}})
Engelleri Görmezden Gelemek
Bazı durumlarda, mevcut olmayan gibi sı固 engellerden geçmek yol göstermek yararlıdır. Bu, mevcut olmayan gibi görünmeyen fiziksel bloklara karşı yol hesaplama yapmanızı sağlar, yerleşik olarak yanlış olursa.
Etkili bir Anchored parçası oluşturun ve onun CanCollide özelliğini doğru olarak ayarlayın.
Parçaya bir PathfindingModifier eklentisi girin ve onun Class.Pathfindingmodified.PassThrough|PassThrough özelliğini etkinleştirin.
Şimdi, bir yol zombie NPC'sinden oyuncu karakterine hesaplanırken, yol kapıyı aşar ve oyuncu karakterine zombinin geçmesini isteyebilirsiniz. Zombi kapıyı açamıyorsa bile, kapının arkasındaki karakteri duyduğu gibi tepki verir.
Yol Gösterme Bağlantıları
Bazen, normalde geçilmez bir uzay aracılığıyla gidilemeyen bir yol bulmak gerekir, örneğin bir kanyondan geçmek gibi, ve bir özelleştirilmiş eylem yapmak gidilecek bir sonraki yol noktasına ulaşmak için. Bu, PathfindingLink nesneleri aracılığıyla gerçekleştirilebilir.
Yukarıdaki ada örneğini kullanarak, ajanın tüm köprüleri boyunca yürümek yerine bir tekne kullanmasını sağlayabilirsiniz.
Bu örnek kullanılarak bir PathfindingLink oluşturmak:
Görselleştirme ve debug'e yardımcı olmak için, 3D görünümü ileticiindeki Yol Gösterme Bağlantıları nı Ekranın Sağ Üst Köşesindeki Görüntü Seçenekleri widget'ından etkinleştirin.
İki Attachments oluşturun, biri tekne koltuğunda ve diğeri de teknenin iniş noktasının yakınında.
Çalışma alanında bir PathfindingLink nesnesi oluşturun, sonra başlangıç ve bitiş bağlantılarına ait Attachment0 ve Attachment1 özelliklerini ayarlayın.
Anahtar kelimeyi UseBoat ile Label özelliğine atar. Bu isim yol gösterim skriptinde bir bayrak olarak kullanılır, böylece ajan başlangıç bağlantı noktasına ulaştığında bir özel eyleme başlatılır.
Incline a bir Costs table within CreatePath() 含 both a Water key and a custom key matching the 1> Class.PathfindingLink.Label|Label1> property name. Assign the custom key a lower value than 4> Water4> .
Yerel Kod - Karakter Yol Göstirmelocal PathfindingService = game:GetService("PathfindingService")local Players = game:GetService("Players")local RunService = game:GetService("RunService")local path = PathfindingService:CreatePath({Costs = {Water = 20,UseBoat = 1}})Bir yön bulma noktasına ulaşıldığında etkinleştirilen olayda, Label modifiyer ismi için özel bir kontrol ekleyin ve Humanoid:MoveTo() - bu durumda, ajanı teknemin üstüne oturacak şekilde çağırın, teknemi suyun üstünd
Yerel Kod - Karakter Yol Göstirmelocal PathfindingService = game:GetService("PathfindingService")local Players = game:GetService("Players")local RunService = game:GetService("RunService")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)-- Yolı Hesap Etlocal success, errorMessage = pcall(function()path:ComputeAsync(character.PrimaryPart.Position, destination)end)if success and path.Status == Enum.PathStatus.Success then-- Yol güvenim noktalarını alınwaypoints = path:GetWaypoints()-- Yol bloğa düştüğünü tespit etblockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)-- Engellenmenin yolun daha aşağı olduğunu kontrol edinif blockedWaypointIndex >= nextWaypointIndex then-- Yol tekrar hesaplandığına kadar yol engellemeyi durdurblockedConnection:Disconnect()-- Yeni yolı yeniden hesap etmek için fonksiyonu çağırfollowPath(destination)endend)-- Hareket sonraki yönlendirme noktasına tamamlandığında algılanırif not reachedConnection thenreachedConnection = humanoid.MoveToFinished:Connect(function(reached)if reached and nextWaypointIndex < #waypoints then-- Yön noktası indeksini artır ve bir sonraki yön noktasına hareket etnextWaypointIndex += 1-- Yol Noktası etiketi "Yol Noktası Kullan"sa kullanın; aksi takdirde bir sonraki yol noktasına hareket edinif waypoints[nextWaypointIndex].Label == "UseBoat" thenuseBoat()elsehumanoid:MoveTo(waypoints[nextWaypointIndex].Position)endelsereachedConnection:Disconnect()blockedConnection:Disconnect()endend)end-- İlk olarak ikinci gözcüğe hareket et (ilk gözcük 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 oturduysa tekneyi hareket ettirmeyi başlatif humanoid.Sit thentask.wait(1)boat.CylindricalConstraint.Velocity = 5end-- Adanın ilişkisiyle ilgili kısıtlayıcı pozisyonunu tespit etlocal boatPositionConnectionboatPositionConnection = RunService.PostSimulation:Connect(function()-- Adanın yanında duraklıyorsa sona yanaşif boat.CylindricalConstraint.CurrentPosition >= 94 thenboatPositionConnection:Disconnect()boat.CylindricalConstraint.Velocity = 0task.wait(1)-- Ajanın koltuğunu kaldır ve hedefe devam ethumanoid.Sit = falsehumanoid:MoveTo(waypoints[nextWaypointIndex].Position)endend)end)endfollowPath(TEST_DESTINATION)
Yayınlanma Uyumluluğu
In-experience istemcisi akışı özelliği, bir oyuncu karakterinin dünya çevresinde 3D içeriğini dinamik olarak yükleyip yüklemeyi sağlayan güçlü bir özelliktir. 3D alanını keşfederken, mevcut alanın yeni alt setleri ve bazı mevcut alt setleri çıkabilir.
Yayınlanabilir deneyimlerde PathfindingService kullanımı için şu en iyi pratikleri dikkate alın:
Yayın, bir karakterin yolunu takip ederken belirli bir yolu blok veya aç blocklayabilir. Örneğin, bir karakter bir ormanı koşarken, bir ağaç bir yerden önünde yayılabilir ve yolu engeller. Yol bulma yayının akışlı şekilde çalışması için, Bloklu Yolları İşlemleme Tekniğini kullanmanı
Yol bulma yönteminde kullanılan yaygın bir yaklaşım, mevcut nesnelerin koordinatlarını kullanarak hesaplama için, bir mevcut
Bu sorunu ele almak için, bir BasePart ile ilgili hedefi kalıcı bir şekilde belirlemeyi düşünün. Kalıcı modeller oyuncu katıldıktan sonra yüklenir ve asla yayınlanmaz, bu yüzden bir klien tarafından oluşturulan yönlendirme yapıyorum sonra etkinle