オブジェクトが「Call the Start event」と言うたびに、ゲーム内のすべてのエンティティを反復処理し、それらがそのイベントを「リッスン」しているかどうかを確認する必要があります。
あなたはそれを間違っている !すべてのオブジェクトを繰り返し処理し、それらがイベントに登録されているかどうかを確認するのは非常に非効率的です! これはObserver の典型的な設計パターンであり、これにはいくつかの方法があります。
- 発生する単一のイベントを持ち、イベント タイプの列挙型パラメーターを持ちます (すべてのサブスクライバーが取得します)。
- 列挙型と対応するイベントの辞書を用意します。
オプション 1は次のようになります。
delegate void OnEventDelegate(kEvents anEvent);
public class MyEventObservable
{
public event OnEventDelegate OnEvent;
}
public class MyEventObserver
{
// Constructors and all
// ...
public void OnEventReceived(kEvents anEvent)
{
switch(anEvent)
{
// switch through all the events and handle the ones that you need
}
}
}
MyEventObserver observer = new MyEventObserver();
MyEventObservable observable = new MyEventObservable();
observable.OnEvent += new OnEventDelegate(observer.OnEventReceived);
オプション 2は次のとおりです。
public class MyEventObservable
{
private Dictionary<kEvents, List<IObserver>> _observers;
MyEventObservable()
{
// Initialize the dictionary with all the events
}
public void RegisterObserver(kEvents event, IObserver observer)
{
_observers[event].Add(observer);
}
}
interface class IObserver
{
void Notify(kEvents anEvent);
}
public MyEventObserver: IObserver
{
// Constructors and all
// ...
// Override the IObserver
public void Notify(kEvents anEvent)
{
switch(anEvent)
{
// switch through all the events and handle the ones that you need
}
}
}
MyEventObserver observer = new MyEventObserver();
MyEventObservable observable = new MyEventObservable();
observable.RegisterObserver(kEvents.Start, observer);
オプション 2 では、各オブザーバーが処理しなければならないイベントの数を減らすことができますが、すべてのイベントを個別に登録する必要があるという代償が伴います (これにより、コーディングが複雑になります)。これは、実行する関数呼び出しが少ないため、オプション 2 がより高速に動作することを意味します。パフォーマンスをどれだけ「クレイジー」にしたいかによっては、速度を上げるのに役立つ他のオプションがあるかもしれませんが、これは正しい軌道に乗るはずです.
PS 私はコードをコンパイルしていませんが、物事がどのように機能するべきかについての一般的な考えを与えるはずです.