Unity(C#)でゲームを開発していて、C#イベントに依存してゲームの状態を更新しています。C#イベントの実行順序(Unity3Dゲーム)
次のシナリオを検討してください:?
// model class
class A
{
// Event definition
public event EventHandler<EventArgs> LetterSet;
protected virtual void OnLetterSet (EventArgs e)
{
var handler = LetterSet;
if (handler != null)
handler (this, e);
}
// Method (setter) that triggers the event.
char _letter;
public char Letter {
get { return _letter }
set {
_letter = value;
OnLetterSet (EventArgs.Empty);
}
}
}
// controller class
class B
{
B()
{
// instance of the model class
a = new A();
a.LetterSet += HandleLetterSet;
}
// Method that handles external (UI) events and forward them to the model class.
public void SetLetter (char letter)
{
Debug.Log ("A");
a.Letter = letter;
Debug.Log ("C");
}
void HandleCellLetterSet (object sender, EventArgs e)
{
// check whether the constraints were met and the game is completed...
Debug.Log ("B");
}
}
それは出力が常にがA B C
なること保証ですかまたは、イベントサブスクライバの実行(HandleCellLetterSet()
)が次のフレームまで遅れてA C B
になることはありますか?
EDIT:B
はA.LetterSet
の唯一の加入者です。質問は複数の加入者間の実行順序に関するものではありません。
ある呼び出しから次の呼び出しまで、特定の順序で実行されているハンドラーに依存することはできません。これは本当に危険であり、理解できないコードのパスにつながります。あなたが本当に必要なら[イベントチェーン](https://www.codeproject.com/Articles/27406/Event-Chain)を見てください。 – Smartis
@Smartisを参考にしていただきありがとうございます。混乱を避けるために、コードには1つのイベント加入者しか含まれていないことを明確にするための質問を編集しています。質問は、複数のサブスクライバ間の実行順序についてではなく、イベントをトリガする動作とサブスクライバでコードを実行する動作の間の実行順序に関するものです。 –