「シーンを切り替えたらBGMが途切れた」「スコアがリセットされた」——シーンをロードすると、古いシーンのオブジェクトはすべて破棄される。これがUnityの標準動作です。でも、BGMプレイヤーやゲームマネージャーのように「こいつだけは生き残ってほしい」オブジェクトが必ず出てきます。
そのための仕組みが DontDestroyOnLoad() です。この記事では基本的な使い方から、初心者が必ずハマる「重複生成」の落とし穴、そして定番の解決策である シングルトンパターン との組み合わせまでを解説します。
この記事でわかること
- シーン切り替えでオブジェクトが消える仕組みと
DontDestroyOnLoadの役割- 基本の使い方(
Awakeで呼ぶだけ)- 定番の落とし穴「重複生成」が起きる理由
- シングルトンパターンによる安全な永続化の実装
DontDestroyOnLoadの基本概念
DontDestroyOnLoadは、Objectクラスの静的メソッドです。このメソッドにGameObjectを渡すと、そのオブジェクトは「DontDestroyOnLoadシーン」と呼ばれる特殊な内部シーンに移動し、以降のシーン切り替えの影響を受けなくなります。
DontDestroyOnLoadシーンは、通常のシーンとは異なり、ゲームが終了するまで破棄されません。これにより、BGMやゲームマネージャーといった、ゲーム全体で永続的に存在する必要があるオブジェクトを簡単に管理できるようになります。

コード例1:基本的な使い方
最もシンプルな使い方は、永続化したいオブジェクトにアタッチされたスクリプトのAwake()メソッド内でDontDestroyOnLoad(this.gameObject)を呼び出すことです。
以下の例は、BGMを再生するオブ ジェクトにアタッチすることを想定したスクリプトです。
using UnityEngine;
public class BgmPlayer : MonoBehaviour
{
void Awake()
{
// このGameObjectをシーン切り替え時に破棄されないように設定します
DontDestroyOnLoad(this.gameObject);
// BGMの再生を開始する処理などをここに追加します
Debug.Log("BGMプレイヤーが生成され、DontDestroyOnLoadが適用されました。");
}
}
このスクリプトをアタッチしたGameObjectがシーンに配置されていれば、シーンを何度切り替えても、そのGameObjectは破棄されずに残り続けます。
初心者が躓きやすいポイント:オブジェクトの重複生成
DontDestroyOnLoadを使う際に、初心者が最も陥りやすい間違いは「オブジェクトの重複生成」です。
例えば、上記のBgmPlayerがシーンAに配置されており、シーンBにも同じBgmPlayerが配置されているとします。シーンAからシーンBへ移動すると、以下のようになります。
- シーンAの
BgmPlayerにDontDestroyOnLoadが適用され、永続化されます。 - シーンBがロードされると、シーンBに配置されていた新しい
BgmPlayerが生成されます。 - 結果として、ゲーム内に
BgmPlayerが2つ存在し、BGMが二重に再生されてしまう、といった問題が発生します。
