ひばりログ

Apple関連やプログラミングなど趣味を書き綴る。

DontDestroyOnLoadで特定のシーンだけ破壊されないObjectを作る

方法

OnLevelWasLoadedというイベント関数を使う。

docs.unity3d.com

Sceneが切り替わった際に呼び出されるようイベント関数です。

このイベント関数は非推奨のようですが

2019.1では使うことができました。

その内、使えなくなる可能性があります。

DontDestroyObjectを使うと、ずっと残り続けてしまうため、

例えばリトライ(同じシーンの再読み込み)するときに、

BGMは継続したい、といったときに、こういった工夫が必要になります。

コード

やっていることは単純で、シーンが読み込まれた際に、

インスペクタで設定した_sceneNameと現在のシーンの名前が同じならば、

新しくできてしまったObjectをDestroyしているだけです。

OnLevelWasLoadedは引数にlevelを取っているので、

名前でなくて、シーンレベルでも良いと思います。

public class TargetSceneDontDestroy : MonoBehaviour
{
    public string _sceneName;
    private static GameObject _thisObject;

    // Start is called before the first frame update
    void Awake()
    {
        DontDestroyOnLoad(gameObject);

        if (_thisObject != null)
            Destroy(gameObject);
        else
            _thisObject = gameObject;
       
    }

    private void OnLevelWasLoaded(int level)
    {
        if (SceneManager.GetActiveScene().name != _sceneName)
            Destroy(gameObject);
    }
}

なぜAwakeで処理しないのか

始め、AwakeやOnEnableのイベント関数で処理していたのですが、

どうやらシーン切り替え時には呼ばれないようです。

(インスタンス生成時に呼ばれるので、今考えれば当然なのですが)

そこでOnLevelWasLoadedを使うことで、

シーンの読み込み時にオブジェクトを削除することができるようになります。

もはやPythonAppleも関係なしです。