Unity 6で「シーンが切り替わってもBGMを止めない」方法

広告

Unity でゲーム制作をしていると、

  • タイトル画面
  • ゲーム画面
  • リザルト画面

など、複数のシーンを切り替える構成になっていきます。

その時、よく起きるのがこの問題です。

シーンが切り替わるたびにBGMが止まる

今回は、

シーンが変わってもBGMを流し続ける方法

を整理します。


なぜBGMが止まるのか

Unityでは、シーン切り替え時に、

そのシーンに存在しているGameObjectが破棄される

という仕組みになっています。

つまり、

TitleScene
 └ BGMManager

から、

GameScene

へ移動すると、

TitleSceneにあったBGMManagerも消える

ため、BGMも停止します。


解決方法

Unityには、

DontDestroyOnLoad(gameObject);

という仕組みがあります。

これを使うと、

シーン切り替え後もGameObjectを残せる

ようになります。


今回の完成コード

using UnityEngine;

public class BGMManager : MonoBehaviour
{
    private static BGMManager instance;

    [SerializeField]
    private AudioClip bgmClip;

    private AudioSource audioSource;

    private void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }

        instance = this;

        DontDestroyOnLoad(gameObject);

        audioSource = GetComponent<AudioSource>();

        audioSource.clip = bgmClip;
        audioSource.loop = true;

        audioSource.Play();
    }
}

GameObjectの準備

Hierarchyで空のGameObjectを作成します。

BGMManager

そこに、

  • AudioSource
  • BGMManagerスクリプト

を追加します。


AudioSourceの設定

Inspectorでは以下を確認します。

項目設定
Play On AwakeON
LoopON
Audio Resource / ClipBGMファイル

コード解説

BGMManagerを1つだけにする

private static BGMManager instance;

これは、

BGMManagerを1個だけ存在させる

ために使っています。


重複生成を防ぐ

if (instance != null)
{
    Destroy(gameObject);
    return;
}

もし各シーンにBGMManagerを置いていると、

BGMが二重に再生される

ことがあります。

そのため、

すでに存在していたら、新しい方を削除

しています。


シーン切り替えでも消さない

DontDestroyOnLoad(gameObject);

これが今回の最重要ポイントです。

通常はシーン切り替えで消えるGameObjectを保持します。


AudioSourceを取得する

audioSource = GetComponent<AudioSource>();

同じGameObjectについている AudioSource を取得しています。


BGMを設定する

audioSource.clip = bgmClip;
audioSource.loop = true;

clip

再生する音楽ファイル。

loop

曲をループ再生します。


再生開始

audioSource.Play();

これでBGMが再生されます。


Unity 6で少し変わった点

Unity 6ではInspectorの表示が少し変わっています。

以前は:

AudioClip

という表示でした。

最近は:

Audio Resource

や、

Clip

という表記になっている場合があります。

ですが、

内部では今もAudioClip型

です。

つまりコードは現在も、

[SerializeField]
private AudioClip bgmClip;

で問題ありません。


今回の内容で重要なこと

今回学習した内容は、BGMだけではありません。

Unityでは、

シーンをまたいで残したい情報

によく使われます。

例えば:

  • サウンド管理
  • スコア管理
  • 設定情報
  • プレイヤーデータ

などです。


まとめ

Unityでシーン切り替え後もBGMを継続するには、

  • DontDestroyOnLoad
  • Singleton化
  • AudioSource管理

を組み合わせます。

特に重要なのは、

シーン切り替え時には通常GameObjectが消える

というUnityの基本動作を理解することです。

この考え方は、今後のゲーム制作でも非常によく登場します。

訪問数 7 回, 今日の訪問数 7回

広告