Karakter Yol Göstirme

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

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

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

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

Navigation mesh showing in Studio

Yol bulma modifikatörleri etkinleştirildiğinde, yol bulma modifikatörleri kullanıldığında dikkate alınan özel malzemeleri ve bölgeleri gösterir.

Navigation labels showing on navigation mesh

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.

AnahtarAçıklamaTürVarsayılan
AgentRadiusAjan menzili, in studs. Objelerden minimum ayrılımı belirlemek için yararlı.sayı2
AgentHeightAjan 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
AgentCanJumpYol bulma sırasında zıplamanın izin verilip etkinleştirileceğini belirler.bootrue
AgentCanClimbYol bulma sırasında tırmanma izin verileceğini belirler.boofalse
WaypointSpacingYol 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
CostsMalzeme 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üleymasanil
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

Path going up a climbable TrussPart ladder
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:

  1. Kodu LocalScript içindeki bir StarterCharacterScripts içine kopyalayın.
  2. Oyuncu karakterinin ulaşabileceği bir Vector3 hedefine 11. satırı düzenle.
  3. 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
Path start/end marked on series of islands and bridges

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
Waypoints indicated across computed path
Hesaplanan yolun gösterildiği yön

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

Two paths indicated with the shorter path not necessarily more logical

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.

  1. Tehlikeli bölgenin etrafında bir Anchored parçası oluşturun ve onun CanCollide özelliğini false olarak ayarlın.

    Anchored part defining a region to apply a pathfinding modifier to
  2. Parçaya bir PathfindingModifier instansı ekleyin, onun Class.Pathfindingmodified.Label|Label özelliğini bulun ve Tehlike Bölgesi gibi anlamlı bir isim verin.

    PathfindingModifier instance with Label property set to DangerZone
  3. 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östirme

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

  1. Etkili bir Anchored parçası oluşturun ve onun CanCollide özelliğini doğru olarak ayarlayın.

    Anchored part defining a region to apply a pathfinding modifier to
  2. Parçaya bir PathfindingModifier eklentisi girin ve onun Class.Pathfindingmodified.PassThrough|PassThrough özelliğini etkinleştirin.

    PathfindingModifier instance with PassThrough property enabled

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

    Zombie NPC path passing through the previously blocking door

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.

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

Bu örnek kullanılarak bir PathfindingLink oluşturmak:

  1. Görselleştirme ve debug'e yardımcı olmak için, 3D görünümü ileticiindeki Yol Gösterme BağlantılarıEkranın Sağ Üst Köşesindeki Görüntü Seçenekleri widget'ından etkinleştirin.

  2. İki Attachments oluşturun, biri tekne 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, sonra başlangıç ve bitiş bağlantılarına ait Attachment0 ve Attachment1 özelliklerini ayarlayın.

    Attachment0/Attachment1 properties of a PathfindingLink PathfindingLink visualized in the 3D world
  4. 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.

    Label property specified for PathfindingLink
  5. 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östirme

    local PathfindingService = game:GetService("PathfindingService")
    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local path = PathfindingService:CreatePath({
    Costs = {
    Water = 20,
    UseBoat = 1
    }
    })
  6. 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östirme

    local 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.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)
    -- 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
    -- Yol Noktası etiketi "Yol Noktası Kullan"sa kullanın; aksi takdirde bir sonraki yol noktasına hareket edin
    if waypoints[nextWaypointIndex].Label == "UseBoat" then
    useBoat()
    else
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    end
    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
    function useBoat()
    local boat = workspace.BoatModel
    humanoid.Seated:Connect(function()
    -- Ajan oturduysa tekneyi hareket ettirmeyi başlat
    if humanoid.Sit then
    task.wait(1)
    boat.CylindricalConstraint.Velocity = 5
    end
    -- Adanın ilişkisiyle ilgili kısıtlayıcı pozisyonunu tespit et
    local boatPositionConnection
    boatPositionConnection = RunService.PostSimulation:Connect(function()
    -- Adanın yanında duraklıyorsa sona yanaş
    if boat.CylindricalConstraint.CurrentPosition >= 94 then
    boatPositionConnection:Disconnect()
    boat.CylindricalConstraint.Velocity = 0
    task.wait(1)
    -- Ajanın koltuğunu kaldır ve hedefe devam et
    humanoid.Sit = false
    humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
    end
    end)
    end)
    end
    followPath(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