Photon Fusion で エラー "InvalidOperationException: Behaviour not initialized: Object not set." が出てから修正するまで

エラー発生

Fusionのおかげでオンライン対戦が実装できた!
感謝とワクワクでいっぱいでしたが、"InvalidOperationException: Behaviour not initialized: Object not set."が出てしまい三日以上は格闘していました

発生条件

マッチングをキャンセルした後再度マッチングした時に発生。
ゲーム起動から一度もマッチングのキャンセルを行わなかった場合は発生しない

調査

Fusion + エラーメッセージで調べたところ英語のページが1件見つかりました。どうやら NetworkRunner.GameStart() をする前にRPC関数を呼ぶと発生するらしい
しかし、私のコードはちゃんと NetworkRunner.GameStart() 後にRPC関数を呼んでいました

解決

  1. マッチングキャンセル時にNetworkRunnerをShutdownする

  2. NetworkObjectがDestroy()される

  3. 色々あってコールバックが発火される(私が意図した通りの動きです)

  4. コールバックに登録していた関数が呼ばれるが、関数を持っているNetworkObjectがDestroy()されている

  5. エラー発生

教訓

コールバックに登録した関数は、オブジェクト破棄時に登録解除しよう!

private void Start()
{
    GameManager.instance.OnGameStartCallback += GameStart;
}

private void OnDestroy()
{
    GameManager.instance.OnGameStartCallback -= GameStart;
}

そもそも最初から置いてあるNetworkObjectが、RunnerをShutdown()した時に破棄されるのを知らなかったよ……

この記事が気に入ったらサポートをしてみませんか?