C# delegate, event ve UnityEvent arasındaki farklar nelerdir?
Cevap
Delegate, bir metoda referans tutan tiptir. event, delegate üzerine kurulu ve dışarıdan sadece += / -= yapılmasına izin veren bir erişim kısıtlamasıdır. UnityEvent ise Inspector'dan bağlanabilen, serileştirilebilir bir event sistemidir.
public class Health : MonoBehaviour
{
// C# event: kod ile abone olunur
public event Action<int> OnDamaged;
// UnityEvent: Inspector'dan da bağlanabilir
public UnityEvent onDied;
int hp = 100;
public void TakeDamage(int amount)
{
hp -= amount;
OnDamaged?.Invoke(hp);
if (hp <= 0) onDied.Invoke();
}
}
// Abone
void OnEnable() { health.OnDamaged += UpdateHealthBar; }
void OnDisable() { health.OnDamaged -= UpdateHealthBar; }| Özellik | C# event | UnityEvent |
|---|---|---|
| Bağlama | Sadece kod | Kod ve Inspector |
| Performans | Daha hızlı | Daha yavaş, reflection/serileştirme maliyeti |
| Kimin tetiklediği | Sadece sahip sınıf | Public ise herkes |
| Tasarımcı erişimi | Yok | Var |
Neden event kullanılır
- Gevşek bağlılık (decoupling):
Health, UI'ı veya ses sistemini tanımak zorunda kalmaz; sadece "hasar aldım" der. - Observer pattern'in dil seviyesindeki karşılığıdır.
Yaygın hata
Aboneliği bırakmamak memory leak ve yok edilmiş nesne üzerinde MissingReferenceException hatalarına yol açar. Statik event'lerde bu risk daha büyüktür, çünkü statik referans nesnenin GC tarafından toplanmasını engeller.
İlgili Unity & C# soruları
- Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?
- GetComponent çağrılarını neden önbelleğe almalısınız?
- Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?
- Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?
- C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?
- Prefab nedir? Prefab variant ve nested prefab ne işe yarar?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.