【Unity】シーンをまたいでBGMを鳴らし続ける

f:id:s44511173:20190718113740g:plain

machokoさんゲームは、タイトルからエンディングまで、一貫して同じBGMが流れ続けています。

ゲームシーンは①タイトル②チュートリアル③ゲーム④エンディングの4つありますが、同じBGMを途切れさせずに流し続ける方法をご紹介します。

DontDestroyOnLoad指定する

BGMを途絶えさせたくない場合、BGMのAudioSourceを持つGameObjectをシーン切り替え時に削除しなければ良いわけです。

GameObjectを削除しないようにするには、DontDestroyOnLoadメソッドを使用します。

private void Awake() {
    DontDestroyOnLoad(this.gameObject);
}

こんな感じに実装してやります。

ところが、これだけだとGameObjectが削除されないために、同じシーンを再度ロードした際にGameObjectがもう1個生成されてしまいます。

static変数を活用する

この現象を避けるために、static変数を利用します。

static変数とは、プログラム内で唯一の実態を持つ変数です。たとえば、staticなフィールドを持つクラスを複数作成したとします。クラスが複数できてもstaticなフィールド自体は実態が1つしか存在しないため、 クラス全員で同じ唯一の値を参照できることになります。

 static変数を使って、GameObjectがすでに生成されていた場合に自らを破棄するプログラムを書いてみます。

private static bool isLoad = false;// 自身がすでにロードされているかを判定するフラグ
private void Awake() {
    if (this.isLoad ) { // すでにロードされていたら
        Destroy(this.gameObject); // 自分自身を破棄して終了
            return;
        }
    this.isLoad = true; // ロードされていなかったら、フラグをロード済みに設定する
    DontDestroyOnLoad(this.gameObject); 
}

 

こうすることで、シーンをまたいでBGMを鳴らし続けることができます。

これはAudioSourceに限らず、シーンをまたいでGameObjectを使用したい場合に有効な手段となります。

 

結論

  • 新しいシーンのロード時にGameObjectを破棄したくない場合、DontDestroyOnLoadを使う
  • DontDestroyOnLoadを使う際は、シーン再ロードでGameObjectが増殖しないようにする必要がある
  • static変数は、プログラム内で唯一の実態を持つ変数