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 Awake | ON |
| Loop | ON |
| Audio Resource / Clip | BGMファイル |
コード解説
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の基本動作を理解することです。
この考え方は、今後のゲーム制作でも非常によく登場します。


ディスカッション
コメント一覧
まだ、コメントがありません