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.

  1. Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?OrtaOyun ProgramlamaGame Dev
  2. Delta time nedir, neden kullanılır?KolayOyun ProgramlamaGame Dev
  3. Object pooling nedir, neden kullanılır?OrtaOyun ProgramlamaGame Dev
  4. Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?ZorOyun ProgramlamaGame Dev
  5. Çarpışma tespitinde broad phase ve narrow phase nedir?ZorOyun ProgramlamaGame Dev
  6. Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?ZorOyun ProgramlamaGame Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle