【Unity】DontDestroyOnLoadとは?シーンが変わっても破壊しない処理

DontDestroyOnLoadメソッド Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのDontDestroyOnLoadってどういうものなのか?」

「DontDestroyOnLoadの使い方を知りたい!」

というお悩みの方に向けた内容となっています。

Unityでは、別のシーンを読み込むと、前のシーンのオブジェクトは全て破壊されて消去されてしまいます。

DontDestroyOnLoadメソッドは、このシーン切り替えの際に、オブジェクトを破壊せず次のシーンにも残すように処理することができます。

特に、シーンを切り替えても変数などのデータを保持させたい場合に、DontDestroyOnLoadメソッドを使うことが多いです。

そこで、このページでは、DontDestroyOnLoadメソッドについて、どんな特徴や仕様なのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

DontDestroyOnLoadメソッドとは?

まずは、Unityで使えるDontDestroyOnLoadメソッドがどういう仕様になっているのかを紹介していきます。

シーン遷移後も特定のオブジェクトを破壊させない

DontDestroyOnLoadメソッドとは、シーン遷移した後も特定のオブジェクトを破壊させないようにするための処理を行ってくれます。

もう少し具体的に説明すると、Unityでシーンを切り替えたり読み込んだりすると、元のシーンが消えるため、通常は元のシーン内のオブジェクトは破壊されて消えてしまいます。

しかし、ゲーム内にはDontDestroyOnLoadというstaticなシーンがあり、このシーンは常にゲーム中に存在していて、他のシーンの切り替えなどでも破壊されることがありません。

このDontDestroyOnLoadというシーン内に、特定のオブジェクトを移動させることができるのがDontDestroyOnLoadメソッドになっています。

そのため、オブジェクトに対して、DontDestroyOnLoadメソッドを使うことで、シーン遷移してもそのオブジェクトが破壊されなくなります。

なお、シーン遷移については、以下のページでもまとめていますので、参考にしてみてください。

GameManagerなど変数を維持したい時に使える

DontDestroyOnLoadメソッドは、シーン遷移後も維持させたい変数などを管理するオブジェクトに使うことが良くあります。

例えば、ゲーム内でのスコアライフといった変数を管理する役割のGameManagerなどがあります。

スコアやライフは、ゲームシーンだけでなく、その後のリザルトシーンやクリアシーンでも表示させたいデータになるので、シーン遷移後も変数を保持させておく必要があります。

このようなシーン切り替え後も、その変数のデータを使う場合に、DontDestroyOnLoadメソッドを利用することで、常にゲーム内でデータを扱うことができます。

DontDestroyOnLoadメソッドの使い方

ここからは、実際にDontDestroyOnLoadメソッドの使い方について紹介していきます。

引数にオブジェクトを指定するだけ

DontDestroyOnLoadメソッドは、引数GameObject型のオブジェクトを指定してあげることで、そのオブジェクトをDontDestroyOnLoadのシーンに移動させることができます。

DontDestroyOnLoad(特定のオブジェクト);

例えば、Scene1Scene2を作り、Scene1にオブジェクトAB、Scene2にオブジェクトCDを配置していた場合、オブジェクトAのスクリプトとして以下のように記述しておきます。

using UnityEngine;

public class ObjectA : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

ゲームを実行すると、Scene1が読み込まれますが、オブジェクトAがDontDestroyOnLoadシーンの方に移動しているのが分かります。

この状態で、Scene2に遷移させると、オブジェクトのBは消えますが、Aは破壊されずにそのまま残っています。

これで、シーン切り替えを行っても、オブジェクトを残したままにすることができました。

なお、DontDestroyOnLoadメソッドをゲーム実行時に必ず処理したいのであれば、Startメソッドよりも早いAwakeメソッドに記述しておくのが良いでしょう。

DontDestroyOnLoadを解除する方法

DontDestroyOnLoadメソッドを使って、DontDestroyOnLoadシーンに移動したオブジェクトを解除して、シーン切り替えで破壊させるようにするためには、MoveGameObjectToSceneメソッドというものを使います。

このMoveGameObjectToSceneは、特定のオブジェクトを別のシーンに移動させるという処理を行います。

MoveGameObjectToSceneを使う際は、SceneManagerクラスで定義されているメソッドなので、

SceneManager.MoveGameObjectToScene(特定のオブジェクト, 移動させたいシーン);

上のように、第一引数GameObject型でオブジェクトを指定して、第二引数移動させたいシーンを選択します。

この第二引数のシーンには、現在ゲーム内でアクティブになっているシーンを設定したいので、GetActiveSceneを使って指定してあげます。

例えば、先ほどのオブジェクトAをDontDestroyOnLoadメソッドから、アクティブなシーンに戻す場合、

using UnityEngine;
using UnityEngine.SceneManagement;

public class ObjectA : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Return))
        {
            SceneManager.MoveGameObjectToScene(this.gameObject, SceneManager.GetActiveScene());
        }
    }
}

のように書くことで、Enterキーを押すとオブジェクトAがScene1に移動します。

そして、シーンを切り替えるとオブジェクトのAもBも削除される、という状態になります。

まとめ

このページでは、Unityで使えるDontDestroyOnLoadメソッドについて、仕様や特徴、また使い方までを紹介していきましたが、いかがでしたでしょうか?

DontDestroyOnLoadメソッドは、シーンを切り替えても、特定のオブジェクトを破壊せずにゲーム内で保持させることができるメソッドです。

GameManagerなどに使うことで、ゲーム内で管理する変数をシーンが切り替わっても保持することができるので、非常に便利なメソッドです。

また、DontDestroyOnLoadメソッドで破壊させないようにしたオブジェクトは、MoveGameObjectToSceneメソッドでアクティブなシーンに戻してあげることで、シーン切り替え時に破壊させるようにすることもできます。

最後までお読みいただきまして、ありがとうございました!

コメント