Unityはマルチタスクなため同期のとり方に注意するメモ。

すげえ面倒なバグに遭遇したのでメモ。

概要

  • Unity上で各オブジェクトのマネージャを持つ
  • マネージャは大本のマネージャに同期して自分でフレームカウントを行う
  • その中で1個のマネージャだけが何故か動かない
  • 1個のマネージャは別のマネージャから起動命令をかけて動く

確認の観点

  • 動かないマネージャについてはなぜ動かないのかわからない
  • Editor上だと動いてしまっている
  • そこで別のマネージャの起動タイミングを見る
  • 機能自体は正常に起動しているが、起動するときとしないときがある
  • この違いはなにかと確認してみると、フレームカウントの加算タイミングが1個だけ違う
  • Unityはオブジェクトがプリエンプティブマルチタスク的に動くが、
    フレームカウントが同期しない状態で動いていたために起きた問題であった
  • フレームカウントの処理自体を他のフレームカウンタと同期するように修正して対応

観点

  • Unityは各GameObjectが非同期に動く
  • そのため、状態を確認しようとしても、アバウトにしか捕まえられない
  • 同期をかける場合、Eventで制御するか、1個のGameObjectからツリー上にして処理をすすめる必要がある