Oyunda sistemleri birbirinden ayırmak için bir event (mesaj) sistemi nasıl tasarlarsınız?
Cevap
Event sistemi (Observer pattern / event bus), bir sistemin olay yayınlaması ve ilgilenen sistemlerin birbirini tanımadan dinlemesi esasına dayanır. Örneğin düşman öldüğünde skor, ses, başarım ve UI sistemleri Enemy sınıfına bağımlı olmadan tepki verir.
Tipli bir event bus örneği:
public readonly struct EnemyKilled { public readonly int Score; public EnemyKilled(int s) => Score = s; }
public static class EventBus<T> where T : struct
{
static readonly List<Action<T>> handlers = new();
public static void Subscribe(Action<T> h) => handlers.Add(h);
public static void Unsubscribe(Action<T> h) => handlers.Remove(h);
public static void Publish(T evt)
{
for (int i = handlers.Count - 1; i >= 0; i--) handlers[i](evt); // tersten: handler içinde unsubscribe güvenli
}
}
// Yayınlayan
EventBus<EnemyKilled>.Publish(new EnemyKilled(100));
// Dinleyen
void OnEnable() => EventBus<EnemyKilled>.Subscribe(OnKilled);
void OnDisable() => EventBus<EnemyKilled>.Unsubscribe(OnKilled);Tasarım kararları:
- Tipli event'ler (struct): string tabanlı event isimlerine göre derleme zamanı güvenlik ve allocation'sız iletim sağlar.
- Senkron mu kuyruklu mu? Anında çağırma basittir; kuyruklu (event queue) yaklaşım ise olayları kare sonunda işler, sıralama ve re-entrancy sorunlarını azaltır.
- Abonelik yaşam döngüsü: Yok edilen nesnenin unsubscribe etmemesi sızıntı ve null hatalarına yol açar.
- Unity'de alternatif: ScriptableObject tabanlı event kanalları, tasarımcıların inspector'dan bağlantı kurmasına olanak tanır.
Dezavantajlar: Akışı takip etmek zorlaşır ("bu event'i kim dinliyor?"), sıra bağımlılıkları gizlenir. Bu yüzden debug için event loglama ve sınırlı sayıda iyi isimlendirilmiş event önerilir. Her şeyi event'e çevirmek yerine aynı modül içinde doğrudan çağrı daha okunaklıdır.
İ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.