Basit Yol Bulma
NextBot'lar için otomatik yol bulma
NextBot'lar, mevcut konumlarından hedeflerine nasıl gideceklerini hesaplamak için navmesh'i kullanır.
Bu işlem, PathFollower gibi yardımcı sınıflar kullanılarak yapılır ve yol oluşturma işleminin çoğu dahili olarak gerçekleştirilir.
Ancak, PathFollower:Compute fonksiyonunun 3. argümanını kullanarak, NextBot'ların yolu hesaplarken nerelere gidip gidemeyeceğini etkileyebilirsiniz.
<!-- Belki daha sonra buraya örnekler eklenebilir -->
Aşağıda, yol oluşturma üzerinde tam kontrole sahip olmanızı sağlayan ve böylece bunun sadece NextBot'larla sınırlı kalmamasını sağlayan örnekler bulacaksınız.
Terminoloji
- navmesh - Navigasyon ağı.
- agent (ajan/aktör) - Ajan, oluşturulan yolu kullanacak olan varlıktır, örneğin bir oyuncu botu veya bir NPC.
- path (yol) - Oluşturulan yol, ajanın hedefe ulaşmak için geçmesi gereken bir dizi düğüm.
- node (düğüm) - Ulaşılabilecek pozisyonları belirten, birbirine bağlı noktalar.
A* ve navmesh kütüphanesi kullanarak manuel yol bulma
CNavArea, oyuncu botları için yol bulma gibi kendi amaçlarınız için tamamen özel bir A* yol bulma algoritmasını hızlıca kurmanıza olanak tanıyan metotlar sağlar.
Bu metotlar şunlardır:
Bunların hepsi A* yol bulma algoritmasında kullanılan temel fonksiyonlardır.
İşte bu metotları kullanarak Wikipedia'daki temel bir A* algoritmasını nasıl uygulayacağınıza dair bir örnek:
Bu örnekte, Astar() fonksiyonu 2 argüman alır: Başlangıç CNavArea'sı, örneğin oyuncu botunun veya NPC'nin o an bulunduğu yer, ve hedef CNavArea'sı, yani botun veya NPC'nin gitmek istediği yer.
Astar() fonksiyonu 3 değerden birini döndürür:
- Hedef CNavArea'sına fiziksel olarak ulaşmak imkansızsa, false döndürür
- Başlangıç CNavArea'sı hedef CNavArea ile aynıysa, true döndürür
- Aksi takdirde, botun/NPC'nin hedefe ulaşmak için içinden geçmesi gereken bir CNavArea dizisi döndürür (birbiri ardına, hedef CNavArea dizideki ilk girdi olacak şekilde, gerekirse dizi sırasını tersine çevirmek için table.Reverse kullanın).
Aşağıda, bu örnek fonksiyonu kullanarak oyuncu botlarını yol bulma ile belirli bir hedefe nasıl hareket ettireceğinize dair birkaç örnek bulacaksınız.
Başlangıç ve hedef pozisyonları olarak vektörleri kullanma
İstediğiniz Vector pozisyonuna en yakın CNavArea'yı bulmak için navmesh.GetNearestNavArea fonksiyonunu kullanabilirsiniz.
İşte Astar() fonksiyonu için girdi olarak 2 vektör alan bir örnek fonksiyon:
A*, alanlarla değil, nokta düğümleriyle en iyi şekilde çalışır
Garry's Mod'da, navigasyon ağı Vector pozisyonlarından değil, CNavArea'lardan oluşur. Sonuç olarak, buradaki örneklerin ajanı çoğunlukla bir CNavArea'nın merkezinden diğerinin merkezine taşıdığını fark edeceksiniz. Bu, oluşturulan yolların doğal görünmemesine neden olur.
Daha doğal yollar elde etmek için, ajanın içinden geçmesi gereken pozisyonları oluştururken, CNavArea'ların köşelerini kullanmak, köşeleri kesmek veya belirli pozisyonları atmak için Görüş Hattı (Line of Sight) kontrollerini kullanmak gibi daha gelişmiş teknikler gerekecektir.
Yol bulma kolay değildir
Lütfen tüm bu örneklerin eğitim amaçlı olarak olabildiğince basit tutulduğunu unutmayın. Mutlak en verimli yolları oluşturmayabilir. Yolların doğal hissettirmesi veya verimli olması için ajanın hareket koduna daha fazla çalışma yapılması gerekecektir.
Oluşturulan yolu test etmek ve görselleştirmek için örnek konsol komutu
Bu örnek kod, oluşturulan yolu debugoverlay kullanarak doğrudan Astar() fonksiyonundan çizecek bir fonksiyon içerir.
Lütfen debugoverlay'in yalnızca çok oyunculu modda ve yalnızca developer konsol komutu sıfırdan farklı bir değere ayarlandığında çalıştığını unutmayın.
Bu örnek, yol oluşturma işleminizi test etmek ve hatalarını ayıklamak için Astar() ve drawThePath() fonksiyonlarını birlikte nasıl kullanabileceğinizi gösterir.
Oyuncu botları ile örnek kullanım
Bu örnek, bir oyuncu botunu (bir ajan) oluşturulan yol boyunca hareket ettirmenin en temel yolunu gösterir:
Bu örnek, sunucudaki tüm botların sunucudaki ilk oyuncuya doğru hareket etmesini sağlayacaktır. Oluşturulan yol güzel değil, ancak bu örneğin amacı, bir ajanı oluşturulmuş bir yol boyunca hareket ettirmek için yolun nasıl kullanılacağını göstermektir.
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord