Kafayı yiyecektim dostlar. Şu anlamsız, küçük, gri kutucukların oluşturduğu labirentte, NavMeshAgent'ım tam bir köşeye sıkışıp kaldı ve orada titreşmeye başladı. "Buldum gidiyorum" dediği an, önüne çıkan tek bir engel onu tamamen çıldırtmaya yetti. Meğerse, hazır sistemlerin de bir sınırı varmış.
Unity'nin NavMesh sistemi, harika bir araç. Basit bir SetDestination ile her şeyi çözebileceğinizi sanıyorsunuz. Ben de öyle sanıyordum. Karmaşık bir labirent için bake işlemini yaptım, agent'ın boyutlarını, yüksekliklerini ayarladım. Her şey yolunda gibiydi. Ta ki...
Agent'ım dar bir koridorda, tam dönüş noktasında, iki duvarın arasında sıkışana kadar. Konsola baktım, path.status hala PathComplete diyordu! Yani sistem "yol buldum, buradayım" diye ısrar ediyordu ama karakterim yerinde sayıp titriyordu. StackOverflow'da bile tam bu duruma uyan bir çözüm bulamadım.
C#:
// O anki hislerimi yansıtan kod:
if (agent.isStuck && !agent.hasMentalBreakdown)
{
Debug.Log("YETER ARTIK!");
}
Meğerse sorun şuradaymış: NavMesh, özellikle keskin köşeli ve dar labirentlerde, agent'ın "merkez noktasının" geçebileceği bir yol hesaplıyor. Ancak agent bir Capsule Collider! O keskin köşede, kapsülün kenarları duvara takılıyor ve fizik motoru onu sıkıştırıyor. Çözüm olarak:
1. Labirentin köşelerini biraz daha yuvarlak yapmak (sanatçı arkadaşım bana küstü).
2. Agent'ın boyutunu küçültmek (bu sefer de gereksiz boşluklar oluştu).
3. Ya da, Local Avoidance (RVO) gibi sistemleri karıştırmak.
Ama asıl öğrendiğim şey, hazır black-box sistemlere körü körüne güvenmemek gerektiği. Bazen, özellikle çok spesifik seviye tasarımlarında, kendi basit waypoint veya state machine tabanlı sistemini yazmak daha az baş ağrıtabilir.
Siz de NavMeshAgent ile benzer çılgınlıklar yaşadınız mı? Labirent gibi karmaşık ortamlarda pathfinding için hangi yöntemleri tercih ediyorsunuz? Yoksa siz de "kendi tekerleğinizi mi yeniden icat ediyorsunuz"?