Unityでシーン(Scene)切り替え時にオブジェクトを引き継ぐ、残す方法/DontDestroyOnLoadの使い方と欠点

table IT

シーンを切り替える際に、オブジェクト(など)を残すことができるDontDestroyOnLoadの使い方です。

スポンサーリンク

成果物

シーンを切り替えた時に、指定したオブジェクトは残す、というものを作り、その問題点を確認します。

DontDestroyOnLoadの使い方

シーンを切り替えた時に破棄しない
DontDestroyOnLoad(対象);
この画面から、矢印を押すと別のシーンに移動するというスクリプトを作りたいと思います。
そのためにまずは新しいシーンを作成し、
ビルド設定にも追加しておきます。
シーンの切り替えをスクリプトで書き、矢印にアタッチしておきます。
新しく作ったシーンには何もオブジェクトを配置していないので、遷移前のScene2から色々オブジェクトを引き継いでみたいと思います。
スクリプトはごく単純です。
Startメソッド内にDontDestroyOnLoad(this.gameObject);と記述し、残したいオブジェクトにアタッチすれば、
シーンを切り替えてもオブジェクトがそのまま残ります(この場合壁を残してます)。
あとはそのスクリプトを色々なオブジェクトにアタッチしていけば、任意のオブジェクトを引き継ぐことができます。

なお、親オブジェクトにスクリプトを設定すれば子スクリプトすべてが残るので、テキストを残したければキャンバスにだけアタッチすればOKです。

DontDestroyOnLoadの欠点

ただし、上のやりかたには欠点があります。こうやってシーンを行ったり来たりした場合、
Scene2からScene3に移動するたびにいくつかのオブジェクトが保持されるため、同じオブジェクトがどんどん増えていきます。
なので、実際には上のような形で行ったり来たりする構成の場合、DontDestroyOnLoadをむやみに使うのは考え物です(使えないわけではない)。
背景などを引き継ぐだけならスクリプトは使わず、共通して使いたいオブジェクトを空のオブジェクトにまとめて入れて、空のオブジェクト単位でコピーし、
最初から別のシーンに貼り付けするなどの方法を取るほうが簡単です。アイテムの入手状況など、前のシーンの状態はStatic変数で引き継ぐことができます。

それでも往復環境で使うのであれば、この記事(Qiita)などが参考になるかと思います。

やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント

モバイルバージョンを終了