今回はシーン遷移しても残したい(かつ、ひとつだけ存在させたい)オブジェクトを、シングルトンというデザインパターンを使って作ってみました。

コード

さっそくコード。こんな感じ。(C#6 の記法を使っている箇所があります。エラーになる場合は こちら 参照)


シーン遷移しても残す

まずは上記コードの 23行目 で DontDestroyOnLoad メソッドを使って、このオブジェクトをシーン遷移しても残すようにしています。

オブジェクトがどんどん増えていくのを避ける

DontDestroyOnLoad を使って破棄されないオブジェクトを作るだけでは問題が生じることがあります。最初にそのオブジェクトを配置したシーンに戻ると、同じオブジェクトが増えていってしまうのです。
これを避けるため、シングルトンというデザインパターンに則ってスクリプトを編集しています。

シングルトンとは

シングルトンとは「インスタンス(実体)が一つしか生成されない事を保証する」もののようです。
上記コードではこんな感じで実装されてます。
  • static(静的)なインスタンスのフィールド変数を作る(上記コードの7行目)
  • 初回参照時(=実体が存在しないとき)、実体の登録を行う(10~11行目)
  • 再び呼び出されたときは実体が自分であるかをチェックし、もし実体が自分でないなら自らを破棄する。これによって実体をひとつに保つ(16~20行目)
  • static なインスタンスは放っておくと残り続けてしまうので、適切に登録解除する(26~30行目)

シーン遷移しても残り、ひとつだけ存在するようになった

ということで、無事に作ることができました。
動画はこんな感じ。Hierarchy ビューで、GameControllerオブジェクトがそのように動作していることを確認してみてください。

(なおシングルトンの考え方も万能ではなく、ほかの実装方法に置き換えたほうがよいという説もあるようです。少し調べて試してみたりしたのですが、なかなかうまくできませんでした。理解出来たらまた別途記事にしたいと思います)

参考資料

こちらの記事と、コメントの方の実装方法を参考にさせていただきました。


今回は以上です。
この記事の使用環境: Unity 2018.1.0b13 Personal (.NET 4.x Equivalent), Visual Studio Community 2017, Windows10 ]