Üç boyutlu izometrik yapıda olan oyunlar için en başta gelen problemlerden birisi, hedef konumu karakterimize verdiğimizde en kısa yolu diğer nesneleri de göz önüne alarak bulabilmesidir. Bu problem için çok fazla sayıda algoritma üretilip farklı ve kullanılması zor olan sınıflar kullanılmıştır fakat Unity ile bu sorunu iyi bir şekilde zahmetsizce çözebiliyoruz.
Unity’de NavMeshAgent bileşeni üç boyutlu dünyada, karakterimizin verdiğimiz konuma en kısa ve en uygun yolu takip ederek gitmesini sağlar. Bunun için en kısa yolu bulma algoritmasını kullanır. Algoritmayı üç boyutlu dünya ile uyumlu olarak çalıştırabilmek için Navmesh sınıfından destek alır. Kullanıcı sadece bu bileşeni aktifleştirerek kullanabilir ve parametreleri değiştirerek kolay bir şekilde yönetebilir. Bu yazımda NavMeshAgent bileşeninin içerdiği teknoloji ve metotlar bahsettim.
NavMeshAgent Nedir?
Unity’de kullanılan NavmeshAgent bileşeni çok fazla karmaşık olan çoğu sorunu basit bir şekilde çözmeye yarar. Kullanımı çok basit olsa da arka planda çok fazla çözüme kavuşturduğu problem içerir.
Navigasyon Ağı (NavMesh), iki boyutlu oyunlarda sıklıkla kullanılan ızgara sistemine benzer. Izgara sisteminin üç boyutlu oyunlarda yetersiz kalması sebebiyle geliştirilmiştir. En iyi şekilde sonuç veren bir sistemdir. Aşağıdaki görselde görüldüğü gibi, oyun haritası üzerine çokgenler giydirilir. Bu çokgenlerin duruma göre belirli noktalarını (merkezi, kenarları veya köşeleri) kullanıma sunar. Bu belirli noktaları yol bulma algoritmamız için yol noktası kabul etmemizi sağlar. Yükselti, çukur gibi her eğime duyarlıdır verilen parametreler içerisinde bu kısmın derecesini belirtebiliriz.
Navigasyon Ağlarından faydalanmanın en iyi yöntemi düğümleri olası tüm belirli noktalarından çekmektir. Eğer engel varsa köşeleri kullanmak veya bir yolun sonunda dönme hareketi yapılacaksa kenarları kullanmak daha faydalıdır. Tüm nokta çeşitlerinin kullanıldığı türe Hibrit Hareket denir. Düğümler arasındaki ağırlıklar hesaplanırken duruma göre çeşitli algoritmalar kullanılabilir bunlar A*, dijksta veya Floyd-Warshall olabilir.
NavMesh ve A* Algoritması
Unity’nin NavMesh’de uyguladığı algoritma A* algoritmasıdır. A* olmasının sebebi önceden kullanılan Dijkstra, Best First Search gibi algoritmaların en iyi özelliklerini alıp sadece hedefe yönelik hamleler yapmasıdır. Ayrıca bunu diğerlerinden çok daha hızlı yapmasından kaynaklıdır. Dijkstra çok geniş kapsamda alan tarayarak hedef konuma ulaşır çok hızlı bulmasına karşın maliyetlidir. Best First Search ise hedef konuma yönelik tarar. Ama geniş açıdan tarama yapamadığı için sonradan büyük yol saplamalarına girebilir. Böylece bu zaman açısından algoritmayı geride bırakır.
A* da açgözlü bir algoritmadır buna ek olarak çalışma fonksiyonu tam maliyet ile sezgizel tahmini maliyetlerin toplamından oluşur. A* sadece iki adet veri listesi ile sorunu çözebilir. Bunlardan birisi açık liste diğeri ise kapalı liste olsun. Kapalı liste başlangıçta tamamen boştur, açık liste ise başlangıç konumunu barındırır. Daha sonra sıra sıra çevresindekileri inceleyerek ağırlığı en az olan düğümü kapalı listeye atar. Liste kapalı ise son düğüm oluncaya kadar bu işlem döngü halinde devam eder. Eğer başka yollar oluşturulması istenirse düğümler kaldırılıp yerine yenileri eklenebilir. Burada başlangıç ile hedef konum arasındaki mesafe veya ağırlıklar arasında mesafe kalır. Bu Manhattan metodu veya Öklid metodu ile bulunabilir. Kapalı listenin son hali bize en uygun ve en kısa yolu verir.
NavMeshAgent ve Raycast Kullanımı
Her ne kadar tamamen gerekli olmasa da Raycast bizim için en iyi sonuçları veren hedef konumu bulma yöntemidir. Buna bağlı olmayarak el ile veya farklı metotlarla da konum verilebilir. Ama üç boyutlu dünyada bu her zaman istenilen sonuçları veremeyebilir. Unity’de nesnelerden belirli bir geometriye sahip bir ışın göndererek diğer nesneler ile çarpışmaları kontrol edebilir. Konum, katman veya nesnenin raporunu geri döndürebilir. NavmeshAgent ise genellikle döndürdüğümüz konum ile ilgilenir ve onu temsilciye iletir.
Tüm metotlar ilgili parametreleri alıp işledikten sonra temsilci başlangıç konumundan hedef konumuna engelleri aşarak hızlı ve olabilecek en iyi şekilde gider. NavmeshAgent bileşeninin bize sağladığı hız, açısal hız, ivme, durma mesafesi gibi parametreleri kullanarak temsilciyi kolay bir şekilde yönetebiliriz.
İçeriğin sonuna gelmiş bulunmaktayız.Özet olarak, NavMeshAgent bileşeni geliştiricilerin karakterleri en iyi şekilde hareket ettirmesini sağlayan günümüzdeki en iyi araçlardan birisidir. Güncelliğini korumasına rağmen daha iyi algoritmalar ile üzerinde çalışıldığı bir bileşendir. Bu yeni algortimalar A* algoritması veya oyunlar üzerinde sürekli test edilen özelleştirilmiş sezgisel algoritmalardır. Benim anlatacaklarım buraya kadar, sorularınızı veya görüşlerinizi yorumlar kısmına yazabilirsiniz. Yazılım dolu günler dilerim.
Diğer içeriklerim için Bükiye BARAK sayfasını takip edebilirsiniz.
Siber Eğitmen Youtube Sayfası ⇒ YouTube
Siber Eğitmen İnstagram Sayfası ⇒İnstagram