Open1
Unity(C#)でActionの多重登録を防ぐには...
背景
- Actionを組み込んだタイマーに登録した処理がバグった
- 初回は問題ないが、2回目以降に不具合が発生。
- 想定されるIndexのインクリメントが2倍になってた。
- 原因はイベントの多重登録。
- GetInvocationList()で登録イベント数を調べたら判明。
- https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.getinvocationlist?view=net-6.0
- ただ、この関数自分が使った限りだとActionを宣言したクラスの中でしか使えなかった。
- なので、いわゆるnullチェック的な感じで「登録数がhoge以上の時は登録しない」みたいな実装ができない。
- 結局、イベント登録前に毎回消してから登録するような方法をとった。
- なんか、このやり方だといつか不都合でそうな予感がして気持ち悪い。
- そもそもこういう問題が起きないような実装を考えたいところ。
対処法
public void StartAnimation()
{
timer.ClearAllEvent(); //<- 登録前に必ず消すようにした。
timer.OnTimerWrap += onTimewrapHandler;
timer.OnTimerFinished += onTimeFinishHandler;
// 以下略
}
~~~~~~~~~~
public void ClearAllEvent()
{
OnTimerWrap = null;
OnTimerFinished = null;
}