Bir karakter veya düşman AI'ı için finite state machine (FSM) nasıl tasarlanır?
Cevap
FSM, bir varlığın aynı anda yalnızca bir durumda (state) bulunduğu ve belirli koşullarla durumlar arasında geçiş yaptığı modeldir. Ör. düşman: Patrol → Chase → Attack → Flee.
Basit switch ile başlanabilir, ancak durum sayısı arttıkça State pattern daha sürdürülebilirdir:
public interface IState
{
void Enter();
void Tick();
void Exit();
}
public class StateMachine
{
IState current;
public void ChangeState(IState next)
{
current?.Exit();
current = next;
current.Enter();
}
public void Tick() => current?.Tick();
}
public class ChaseState : IState
{
readonly Enemy enemy;
public ChaseState(Enemy e) => enemy = e;
public void Enter() => enemy.Agent.speed = 6f;
public void Tick()
{
enemy.Agent.SetDestination(enemy.Target.position);
if (enemy.DistanceToTarget < 2f) enemy.Fsm.ChangeState(enemy.AttackState);
else if (enemy.DistanceToTarget > 20f) enemy.Fsm.ChangeState(enemy.PatrolState);
}
public void Exit() { }
}Avantajları
- Her durumun mantığı ayrı sınıftadır,
Enter/Exitile animasyon ve ses tetikleme kolaylaşır. - Hata ayıklama kolaydır: "şu an hangi durumdayım" tek alan.
Sınırları ve alternatifler
- Durum sayısı arttıkça geçişler patlar (her durum diğerlerini bilir). Hierarchical FSM ortak davranışları üst duruma taşır.
- Karmaşık AI için Behavior Tree (modüler, yeniden kullanılabilir) veya GOAP / Utility AI (hedef ve puan tabanlı karar) tercih edilir.
- Unity'nin Animator'ü de bir FSM'dir; ama oyun mantığını animator'e gömmek yerine mantık FSM'i kodda tutmak genellikle daha temizdir.
İlgili Oyun Programlama soruları
- Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?
- Delta time nedir, neden kullanılır?
- Object pooling nedir, neden kullanılır?
- Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?
- Çarpışma tespitinde broad phase ve narrow phase nedir?
- Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.