シーン遷移で破棄されない&1つしか存在しないオブジェクトの作成方法

複数のシーンで必要なオブジェクトは、各シーンに存在しているよりも最初のシーンのものを使い続けた方が良かったりします。
例えばBGMを再生するオブジェクトなんかは、各シーンでそれぞれ使っているとシーン遷移時にいちいちBGMが途切れてしまうので、同一のものをシーンを越えて使い続ける方が便利です。

そんなときに使うのが、DontDestroyOnLoad関数。
これを記述したスクリプトをアタッチしておけば、シーン遷移時に削除されず、複数シーンをまたいで使用できます。

しかし、これにはある問題が。

最初のシーンでDontDestroyOnLoadのオブジェクトを作成し、他のシーンに遷移した時には問題ないのですが、また最初のシーンに戻ってしまうと2つ目のオブジェクトが生成されてしまいます。
最初のシーンに遷移するたびにDontDestroyOnLoadのオブジェクトが増え続けてしまうのです。

さらに、DontDestroyOnLoadのオブジェクトは最初のシーンに配置しているので、エディタで作成しているときは編集中のシーンにDontDestroyOnLoadのオブジェクトがありません。
BGMぐらいならあまり問題ないですが、Playerオブジェクトだったりカメラだったりすると、作成しづらいです。

しかし全てのシーンにDontDestroyOnLoadのオブジェクトを配置してしまうと、先ほど言ったようにシーン遷移するたびにどんどん複製されてしまう。。。

シーン遷移で破棄されない&1つしか存在しないオブジェクトの作成方法

そこで、タイトルにもあるようにシーン遷移で破棄されない&1つしか存在しないオブジェクトの作成方法です。

以下のスクリプトをアタッチしましょう。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroySingleObject : MonoBehaviour {

	public static DontDestroySingleObject Instance {
		get; private set;
	}

	void Awake(){
		if (Instance != null) {
			Destroy (gameObject);
			return;
		}
		Instance = this;
		DontDestroyOnLoad (gameObject);
	}
}

このスクリプトをアタッチすれば、シーン遷移で破棄されない&1つしか存在しないオブジェクトが実現できます。
BGMオブジェクトやデータ管理オブジェクトなんかにオススメ。

コメント