ゼニガネブログ

ゲーム開発のための小ネタなど。現在はUnityメインでやってます

【Unity】SceneManager.LoadSceneAsyncの使い方が悪くて痛い目にあった話

この失敗談がきっかけで他の人が無駄にする時間が減ればいいなあと思ったので記事化します。

何が起きる

最終的に何が起こったかと言うとUnityの非同期読込関数が機能しなくなります。
もう少し具体的に言うと、「SceneManager.LoadSceneAsyncで使うAsyncOperation」や「Resources.LoadAsyncで使うResourceRequest」のisDoneがいつまで経ってもtrueにならない、もっと正確に言うとprogress値が全く進まなくなります。
なのでゲームの設計によってはおかしくなった事にすぐ気がつけなかったりする超危険なバグになってしまいます。

 

原因

既にこの時点でピンと来た方もいらっしゃるかもしれませんが、「非同期読込を開始したもの(シーンなど)が終了されずそのまま放置されていた」ため発生しました。
Unity 2017時点ではAsyncLoad系の並列実行は出来ないため、読込開始から終了せずに放置してしまうと次の読込処理が進まない訳です。
※やり方によっては無理やり並列実行させること自体は出来てprogress値も進みましたがバグの一種ぽかったので出来ないとしてます

 

そんな状況あるの?って感じですが、適当に書いたソースにシーン遷移が絡んできたりするとなくはなかったりします。

 ものすごいおバカな例を挙げると、ステージ1読込ボタンとステージ2読込ボタンが排他処理になっていなくて両方押せちゃうとか連打出来ちゃうとかが原因で発生します。
自分の名誉の為に言い訳しておくと、例みたいな単純な形じゃなくて、デバッグでしか使わない部分で、更に色々な要素がうまく絡み合って起きた奇跡的なあれだったんですよ…
………デバッグ用だからこそ不要なバグを生まないちゃんとしたコーディングをすべきですね!

 

昔SceneManager実装直後に、シーンの複数同時読込をテストしてprogress値が進まなくなる経験はしていたので、似たような結果からすぐに原因を特定出来ていたらなと思いました。


バグの原因・結果を覚えておくと思わぬところで役にたったりするので、頭の片隅にでも入れておくとハッピーになれるかもしれません!