| کانال توسعهدهندگان بازی |
الگوی Observer توی بازیسازی یکی از بهترین راهها برای جدا کردن سیستمها از هم و جلوگیری از وابستگیهای درهمبرهمه 🔁
بهجای اینکه هر اسکریپت مستقیم بره سراغ بقیه، فقط به یک «رویداد» گوش میدهد. این رویکرد توی پروژههای متوسط و بزرگ یونیتی، دیباگ و تغییر گیمپلی رو خیلی راحتتر میکند.
مسئلهٔ رایج:
مثلاً وقتی بازیکن سکه میگیرد:
- اسکور باید زیاد شود
- صدا پخش شود
- یوآی آپدیت شود
اگر اسکریپت سکه مستقیماً سه کلاس مختلف را صدا بزند، هر تغییر کوچکی مساوی است با ویرایش چند جای متفاوت در کد 😵💫
با الگوی Observer فقط یک رویداد فراخوانی میشود و بقیه سیستمها خودشـان «مشترک» آن رویداد هستند.
نمونهٔ ساده در یونیتی (C#)
using UnityEngine;
using System;
public class GameEvents : MonoBehaviour
{
public static GameEvents Instance;
public event Action<int> OnCoinCollected;
void Awake()
{
Instance = this;
}
public void CoinCollected(int amount)
{
OnCoinCollected?.Invoke(amount);
}
}
فرستندهٔ رویداد (مثلاً روی Coin):
public class Coin : MonoBehaviour
{
public int amount = 1;
void OnTriggerEnter(Collider other)
{
GameEvents.Instance.CoinCollected(amount);
Destroy(gameObject);
}
}
دریافتکنندهها (Observerها):
public class ScoreSystem : MonoBehaviour
{
int score;
void OnEnable()
{
GameEvents.Instance.OnCoinCollected += HandleCoin;
}
void OnDisable()
{
GameEvents.Instance.OnCoinCollected -= HandleCoin;
}
void HandleCoin(int amount)
{
score += amount;
}
}
همین الگو را میتوان برای سیستم یوآی، افکت صوتی یا حتی آنالیتیکس هم استفاده کرد، بدون اینکه اسکریپت Coin دربارهٔ آنها چیزی بداند 🎯
چند نکتهٔ عملی:
- توی صحنههای بزرگ، بهجای Singleton ساده، از ScriptableObject Event یا سیستم Event Bus تمیزتر استفاده میشود (ارجاع: "Game Programming Patterns" و داکیومنت یونیتی دربارهٔ ScriptableObject).
- حتماً در OnDisable از رویدادها لغو عضویت شود تا Memory Leak یا خطای Null Reference در سوییچ صحنه پیش نیاید.
برای مطالعهٔ بیشتر:
Game Programming Patterns - Observer
Unity Learn
از پروژهٔ بعدی، سیستم رویداد گیمپلی را جدا طراحی کن؛ معماری بازی تمیزتر و قابلگسترشتر میشود 🚀
🔖 #GameDev #بازیسازی #Observer #Unity #CSharp #GameArchitecture #Events #CleanCode
👤 Developix
💎 Channel: @DevelopixGame
2 · 224 ·