Unityでシーンが増えてくると、Game ViewでLoadScene()がうまく動かないことがある。後からシーン名を変えたり、Build Settingsでシーンの並び順を変えたときに問題が起こりやすい。(確認したUnityのバージョンは2018.1.4f1)
引数は番号と名称のどっち?
シーン遷移に使うメソッドはSceneManager.LoadScene()。これに与える引数は、遷移先シーンのインデックス番号と、シーン名称文字列の二通りが使える。
あとからBuild Settingsでシーンの並び順を変更すると、引数のインデックス番号も変える必要がある。シーン名を変更しても修正は必要なので、どちらがよいともいえない。
一度名づけたシーン名を変える可能性が低いなら、引数は文字列で与えた方が、コードはわかりやすくなると思う。
Game Viewの怪現象
開発中にシーンの数が増えてきたので、Build Settingsで並び順を変えて整理してみた。するとGame Viewで正しくシーン遷移できない問題が生じた。
プレビュー操作中に以下のようなエラーが出て、意図しないシーンに飛ばされてしまう。
Scene ‘Test’ couldn’t be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
何度も確認したが、LoadScene()に与えたシーン名は間違っていない。Build Settingに登録したインデックス番号で指定しても、同じエラーが出てしまう。
さらに不可解なことに、上記のエラーが出ずに変なシーンに飛んでしまうこともある。ここまで来ると、さすがにUnityのバグっぽい。
Build Settingsが地雷
一方、プロジェクトをビルドして実行すると、このようなシーン遷移のトラブルは起こらない。
最終的なプロダクトに影響が出なければ問題ない。しかし、原因不明のエラーを抱えたままなのは精神衛生上よくない。そこそこ大きなプロジェクトなので、開発中にプレビューするため毎回ビルドするのは時間の無駄だ。
ダミーのシーンを作っていろいろ試した結果、原因はBuild Settings内でシーンの順番を入れ替えたことだとわかった。ダイアログ画面上でシーンをドラッグドロップすると再生順序を変えられるが、この操作はビルド前のプロジェクトに正しく反映されない。
Build SettingsからDeleteキーで全シーンをいったん削除して、再びAdd Open Scenesボタンでひとつずつ登録し直したら問題は解決した。Game Viewでも正しく動く。
作業中、Deletedとグレーアウトされた空行も、マウス操作で上下に移動できてしまう。不気味なUIなので、うかつに触れない方がよさそうだ。
Unityを再起動しても直る
わざわざシーン登録をやり直さなくても、現在のプロジェクトを保存してUnity自体を再起動したら直るとわかった。まるで昔のWindowsのようだが、「困ったら再起動」という経験則は今でも有効らしい。
Unityでは他にも「インスペクター上で行った変更がシーンに反映されない」とか、不可解な挙動に悩まされることがある。原因を追究する前に、とりあえず再起動すると直るパターンが多いように感じる。