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

table IT

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

スポンサーリンク

成果物

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

DontDestroyOnLoadの使い方

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

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

DontDestroyOnLoadの欠点

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

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

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

コメント