Edited at

[Unity]DontDestroyOnLoadでオブジェクトが増えていく

More than 3 years have passed since last update.


環境

下記の環境を使用しています。

1. Unity 5.4.0

2. C#


起きたこと

ゲーム開発時にシーンを頻繁に移動するような構成で開発が進んでいた。

しかし、どうしても恒常的に使いたいオブジェクトがある。ということで


DontDestroy.cs

void Awake()

{
DontDestroyOnLoad(this.gameObject);
}

このようなコードを記述し、使用していた。

最初は使い勝手がとてもよく感じていたのだがある時とんでもないことに気付く。

1.png

同じオブジェクトがめっちゃ増えてるやんけ!!

思い切りホニャララコントローラーだのに使っていたので本当に酷い気持ちになりました。


原因


  1. 編集中のscene1の中にDontDestroyになるオブジェクトがある

  2. 実行時DontDestroyOnLoadが呼び出され専用のシーンに突っ込まれる。

  3. その後scene1に戻ってきたとき(2.)と同じことが起こる。

と、だいたいこんな感じの流れで往復するほど増えていく。

非常によろしくない。


解決方法1

(解決方法2がオススメです)

例えばプロジェクトが下記のようなシーン構成だった場合



  • title(ここにDontDestroyにしたいオブジェクトがいる)

  • game

  • ending


これを、下記のような構成に変える




  • preload (ここにDontDestroyにしておきたいオブジェクトをおく)

  • title(こちらのDontDestroyは削除しておく)

  • game

  • ending


preloadはゲーム起動時に1度だけ通りそれ以降は読み込まないようにする。

と言う対応にするのが一番楽だった。


解決方法2(2016/09/22追記)

コメントで「常にたったひとつだけしか存在しないシングルトンという扱いになる」という回答とコードを頂きました。

僕の場合は下記のURLの一番下に乗っているコードを参考にシングルトンとして使っていたのですが、

テラシュールブログ:Unityで少しだけ高速なシングルトン(Singleton)


SingletonBehaviour.cs

    protected bool CheckInstance()

{
...省略

Destroy(this);
return false;
}


だとオブジェクト自体は残っていたので


SingletonBehaviour.cs

    protected bool CheckInstance()

{
...省略

Destroy(this.gameObject);
return false;
}


に変更してオブジェクトごとDestroyするようにしました。


課題点


  • Unityで各シーンを編集、実行してみるときにpreloadから持ってくるべきオブジェクトを一々追加しなくてはならない(予め読み込んでおけば解決出来そう・・・?)

  • そもそもDontDestroyなオブジェクトが必要な構成が悪い?