Unity NavMesh ile Basit Yapay Zeka Gezintisi Rehberi
Oyun geliştirme dünyasında, yapay zeka (AI) karakterlerin doğal ve inandırıcı bir şekilde hareket etmesi, oyun deneyimini zenginleştiren en önemli unsurlardan biridir. Unity, bu ihtiyacı karşılamak üzere güçlü bir araç olan Unity NavMesh sistemini sunar. Bu kapsamlı rehberde, Unity NavMesh'in temellerinden başlayarak, orta seviye detaylara, pratik ipuçlarına ve yaygın hatalara kadar her şeyi ele alacağız.
Unity NavMesh Nedir?
Unity NavMesh (Navigation Mesh), oyun dünyasındaki yapay zeka karakterlerinin engellerden kaçınarak hedeflerine ulaşmasını sağlayan bir yol ağacı sistemidir. Temel olarak, oyun ortamınızın gezilebilir alanlarını temsil eden üçgenlerden oluşan bir ağ oluşturur. Bu ağ sayesinde, karakterleriniz karmaşık ortamlarda bile akıllıca hareket edebilir, duvarlara çarpmadan veya uçurumlardan düşmeden yollarını bulabilirler.
Unity NavMesh Kurulumu ve Temelleri
Unity NavMesh'i kullanmaya başlamak oldukça basittir. İşte adım adım kurulum ve temel kullanım:
1. NavMesh Oluşturma (Bake)
Öncelikle, karakterlerinizin üzerinde gezineceği ve engellerin bulunduğu tüm objelerinizi Unity'ye tanıtmanız gerekir.
- Navigation Penceresini Açma: Unity menüsünden
Window > AI > Navigationyolunu izleyerek Navigation penceresini açın. - Gezilebilir Alanları İşaretleme: Karakterlerinizin üzerinde yürümesini istediğiniz zemin (floor) objelerini seçin. Inspector penceresinde, bu objelerin
Staticolarak işaretlendiğinden emin olun. Ardından, Navigation penceresindekiObjectsekmesine gidin veNavigation Statickutucuğunu işaretleyin. Bu, Unity'ye bu objelerin NavMesh oluşturulurken dikkate alınması gerektiğini söyler. - Engelleri İşaretleme: Karakterlerinizin geçmesini istemediğiniz duvar, kaya gibi objeleri de aynı şekilde
StaticveNavigation Staticolarak işaretleyin. - NavMesh'i Oluşturma (Bake): Navigation penceresindeki
Bakesekmesine geçin. Burada, AI karakterlerinizin boyutlarına uygun bazı ayarlar bulunur: Agent Radius: Karakterin yarıçapı.Agent Height: Karakterin yüksekliği.Max Slope: Karakterin tırmanabileceği maksimum eğim açısı.Step Height: Karakterin aşabileceği maksimum basamak yüksekliği.- Ayarları yaptıktan sonra
Bakedüğmesine tıklayın. Unity, sahnenizdeki gezilebilir alanları hesaplayarak mavi renkli bir NavMesh oluşturacaktır.
2. NavMeshAgent Bileşeni Ekleme
Yapay zeka karakterinizin hareket edebilmesi için ona bir NavMeshAgent bileşeni eklemeniz gerekir.
- AI karakterinizin GameObject'ini seçin.
- Inspector penceresinde
Add Componentdüğmesine tıklayın veNavMeshAgentyazarak bileşeni ekleyin. - Bu bileşen, karakterinizin NavMesh üzerinde nasıl hareket edeceğini belirleyen özellikler içerir:
Speed,Angular Speed,Acceleration,Stopping Distancegibi. Bu ayarları karakterinizin hareket dinamiklerine göre düzenleyebilirsiniz.
3. AI'ı Hareket Ettirme (C#)
Artık karakterinizi kod ile hareket ettirebilirsiniz. Bunun için basit bir C# script'i yeterlidir:
using UnityEngine;
using UnityEngine.AI;
public class AICaracterKontrol : MonoBehaviour
{
public Transform hedefKonum;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
if (agent == null)
{
Debug.LogError("NavMeshAgent bulunamadı!");
return;
}
if (hedefKonum != null)
{
agent.SetDestination(hedefKonum.position);
}
else
{
Debug.LogWarning("Hedef Konum atanmamış!");
}
}
void Update()
{
// İsteğe bağlı: Hedef dinamik olarak değişebilir.
// if (hedefKonum != null && agent.destination != hedefKonum.position)
// {
// agent.SetDestination(hedefKonum.position);
// }
}
}
Bu script'i AI karakterinize ekleyin ve hedefKonum değişkenine sahnenizdeki bir hedef GameObject'i sürükleyip bırakın. Oyun başladığında karakteriniz, Unity NavMesh üzerinde engellerden kaçınarak bu hedefe doğru hareket edecektir.
Orta Seviye Unity NavMesh Detayları
Unity NavMesh, basit gezintinin ötesinde daha karmaşık senaryolar için de çözümler sunar.
1. NavMesh Obstacles (Dinamik Engeller)
Eğer oyununuzda hareket eden veya dinamik olarak ortaya çıkan/kaybolan engeller varsa (açılıp kapanan kapılar, hareketli platformlar), bunları `Static` olarak işaretleyemezsiniz. Bu tür durumlar için NavMeshObstacle bileşenini kullanırız. Bu bileşen, engelin etrafındaki NavMesh'i dinamik olarak keserek (carve) AI'ın yolunu yeniden hesaplamasını sağlar. Carve özelliğini aktif ettiğinizde, engel NavMesh üzerinde geçilemez bir boşluk oluşturur.
2. NavMesh Areas (Alanlar ve Maliyetler)
Farklı zemin türlerinin (örneğin, yol, çim, su, çamur) AI için farklı hareket maliyetleri olmasını isteyebilirsiniz. Örneğin, çamurda daha yavaş hareket etmesini sağlayabilirsiniz. Navigation penceresindeki Areas sekmesinden yeni alan tipleri oluşturabilir ve bunlara maliyet (Cost) atayabilirsiniz. Daha sonra, Bake sekmesinde, bu alanları belirli objelere uygulayarak AI'ın bu bölgelerden geçerken maliyeti hesaba katmasını sağlayabilirsiniz.
3. Off-Mesh Links (Özel Bağlantılar)
Bazen AI karakterlerinizin zıplama, merdiven çıkma, teleferik kullanma gibi özel geçişler yapması gerekebilir. Off-Mesh Link'ler, NavMesh'in iki farklı noktası arasında özel bir bağlantı oluşturmanızı sağlar. Bu bağlantılar otomatik olarak oluşturulabilir veya manuel olarak yerleştirilebilir. Bir Off-Mesh Link'i karakterinize eklediğinizde, bu bağlantı üzerinden geçiş yapma yeteneği kazanır.
4. Yol Hesaplama (NavMeshPath)
Bazen karakteri hemen hareket ettirmek yerine sadece bir hedefe giden yolu hesaplamak isteyebilirsiniz (örneğin, bir sonraki hamleyi planlamak için). NavMeshAgent doğrudan hareket ettirirken, NavMeshPath sınıfı sadece yolu hesaplar ve bu yolu bir dizi köşe noktası olarak döndürür. Bu, özellikle performansı optimize etmek veya AI davranışını daha karmaşık hale getirmek istediğinizde kullanışlıdır.
NavMeshPath path = new NavMeshPath();
if (agent.CalculatePath(hedefKonum.position, path))
{
// Yol başarıyla hesaplandı, path.corners dizisini kullanabilirsiniz.
// Örneğin, yolu çizmek için Debug.DrawLine kullanabilirsiniz.
}
Pratik Unity NavMesh İpuçları
1. AI'ın Hedefe Ulaşımını Algılama ve Yeni Hedef Belirleme
AI'ın bir hedefe ulaştığını anlamak ve ardından yeni bir hedef belirlemek, döngüsel veya görev tabanlı AI davranışları için kritiktir. NavMeshAgent bileşeninin bazı özellikleri bu konuda yardımcı olur:
agent.pathPending: Agent'ın hala bir yol hesaplayıp hesaplamadığını gösterir.agent.remainingDistance: Agent'ın hedefe olan kalan mesafesi.agent.hasPath: Agent'ın geçerli bir yola sahip olup olmadığını gösterir.agent.isStopped: Agent'ın durdurulup durdurulmadığını gösterir.
void Update()
{
if (!agent.pathPending && agent.remainingDistance < agent.stoppingDistance)
{
if (!agent.hasPath || agent.velocity.sqrMagnitude == 0f)
{
// Hedefe ulaşıldı veya hareket durdu, yeni hedef belirle
BelirleYeniHedef();
}
}
}
void BelirleYeniHedef()
{
// Rastgele bir hedef veya görev tabanlı yeni bir hedef belirle
Vector3 yeniHedef = new Vector3(Random.Range(-10f, 10f), 0, Random.Range(-10f, 10f));
agent.SetDestination(yeniHedef);
}
2. Dinamik Engellerle Baş Etme
NavMeshObstacle bileşeni, dinamik engelleri yönetmenin en iyi yoludur. Bir kapı açıldığında veya kapandığında, bu bileşeni etkinleştirip devre dışı bırakarak NavMesh'in güncellenmesini sağlayabilirsiniz. carve özelliğini kapattığınızda engel NavMesh'ten kaldırılır, açtığınızda ise NavMesh'te bir boşluk oluşturur.
public GameObject kapi;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
// Kapıyı aç ve NavMesh engelini kaldır
kapi.SetActive(false);
NavMeshObstacle obstacle = kapi.GetComponent<NavMeshObstacle>();
if (obstacle != null) obstacle.carving = false;
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
// Kapıyı kapat ve NavMesh engelini geri getir
kapi.SetActive(true);
NavMeshObstacle obstacle = kapi.GetComponent<NavMeshObstacle>();
if (obstacle != null) obstacle.carving = true;
}
}
3. Performans Odaklı NavMesh Ayarları
Bake işlemi sırasında Voxel Size ve Agent Radius gibi ayarlar, hem NavMesh'in doğruluğunu hem de performansını etkiler. Küçük Voxel Size daha detaylı bir NavMesh oluşturur ancak Bake süresini uzatır ve dosya boyutunu artırır. Oyununuzun ihtiyacına göre bu değerleri optimize edin. Çok detaylı olmayan alanlar için daha büyük Voxel Size kullanmak performansı artırabilir. Ayrıca, gereksiz objeleri Navigation Static olarak işaretlemekten kaçının.
Yaygın Hatalar ve Çözümleri
-
NavMesh'in Baked Olmaması: En sık yapılan hata. Navigation penceresini açın, gezilebilir objeleri
Navigation Staticolarak işaretleyin veBakedüğmesine tıklayın. Mavi NavMesh'in sahnenizde göründüğünden emin olun. -
Agent'ın Sıkışması veya Hareket Etmemesi:
NavMeshAgent'ınAgent RadiusveAgent Heightdeğerlerinin karakterinize uygun olduğundan emin olun. Çok büyükse sıkışabilir, çok küçükse engellerin içinden geçebilir.- Karakterinizde bir
Rigidbodyvarsa,isKinematickutucuğunu işaretleyin. Aksi takdirde fizik motoru ile NavMeshAgent arasında çakışmalar yaşanabilir. - Hedef konumun gerçekten NavMesh üzerinde olup olmadığını kontrol edin. NavMesh dışında bir hedefe gidemez.
-
Engellerin Algılanmaması: Engellerin
StaticveNavigation Staticolarak işaretlendiğinden veya dinamik engeller içinNavMeshObstaclebileşeni kullanıldığından emin olun. -
Off-Mesh Link'lerin Çalışmaması: Bağlantıların doğru şekilde ayarlandığından ve karakterin
Off-Mesh Link'in başlangıç veya bitiş noktalarına yeterince yakın olduğundan emin olun.Agent'ınAuto Traverse OffMesh Linközelliğinin açık olması gerekir.
Performans ve Optimizasyon Notları
- Çok Sayıda NavMeshAgent: Çok sayıda AI karakteri aynı anda yol hesaplaması yapıyorsa, bu CPU üzerinde ciddi bir yük oluşturabilir. Her karakterin her karede yol hesaplaması yapmasını engellemek için, yol hesaplama sıklığını azaltabilir veya daha basit AI davranışları kullanabilirsiniz.
-
NavMesh Kalitesi:
BakeayarlarındakiVoxel Sizedeğeri, NavMesh'in detay seviyesini belirler. Daha küçük birVoxel Size, daha doğru ama daha karmaşık bir NavMesh anlamına gelir ve performansı etkileyebilir. İhtiyaç duyduğunuz en düşük detay seviyesini kullanmaya çalışın. -
Statik Objeler: Yalnızca gerçekten hareket etmeyen ve AI gezintisini etkileyecek objeleri
Navigation Staticolarak işaretleyin. Gereksiz objeleri işaretlemek,Bakesüresini ve NavMesh veri boyutunu artırır. -
NavMeshPath Kullanımı: Eğer bir AI karakteri sürekli olarak aynı hedefe gitmiyorsa veya yolun sadece bir kısmını takip etmesi gerekiyorsa,
NavMeshPathile yolu önceden hesaplayıp sadece gerektiğindeagent.SetDestination()çağırmak, performansı artırabilir.
Sonuç
Unity NavMesh, oyunlarınızda yapay zeka karakterlere basit ve etkili gezinti yetenekleri kazandırmak için güçlü ve kullanımı kolay bir sistemdir. Temel kurulumdan dinamik engellerin yönetimine, farklı alan maliyetlerine ve özel bağlantılara kadar birçok senaryoyu destekler. Bu rehberdeki bilgileri kullanarak, oyunlarınızda akıllıca hareket eden ve oyunculara daha sürükleyici bir deneyim sunan AI karakterleri yaratabilirsiniz. Unutmayın, pratik yapmak ve farklı ayarları denemek, Unity NavMesh'in tüm potansiyelini anlamanın en iyi yoludur.
🧠 Ders Sonu Değerlendirme Testi
Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.
Yorumlar (0)
İlk yorumu siz yapın!