UnityUnityメモ

Unityでシーンを移動してもBGMを止めない方法!初心者向け解説

Unity

1. はじめに

Unity でゲームを作るとき、シーンを切り替えると BGM(バックグラウンドミュージック)が止まってしまうことがあります。たとえば、タイトル画面からゲームシーンに移動したときや、ステージをクリアして次のステージに進んだとき、BGM が最初から再生されてしまうのはちょっと不自然ですよね。

そこで、この記事では シーンを移動しても BGM を止めずに鳴らし続ける方法 を解説します!
Unity には DontDestroyOnLoad という機能があり、これを使えば シーンが切り替わっても特定のオブジェクトを削除せずに維持することができます。この仕組みを使って、BGM を管理するオブジェクトを作成し、シーンを移動しても音楽が途切れないようにしましょう。

「Unity のシーン遷移で BGM が止まるのを防ぎたい!」
「ゲームの雰囲気を壊さずに、シームレスな音楽再生を実現したい!」

そんな人にピッタリの内容になっています。初心者の方でも簡単に実装できるよう、手順を一つずつ詳しく説明していくので、一緒にやってみましょう!




2. シーンの準備

まず、Unityでシーン遷移を実装するために、2つのシーンを用意します。
1つ目のシーン(Scene1)でプレイヤーがオブジェクトに接触すると、2つ目のシーン(Scene2)に切り替わるようにします。

では、順番に設定していきましょう!


① Scene1 を作成

1. シーン名を変更

最初に、デフォルトのシーンを Scene1 に変更します。

  1. Unityの [File](ファイル) メニューから [Save As](名前を付けて保存) を選択
  2. シーン名を Scene1 に変更し、保存

すると、シーン名が Scene1 になります。


② Cube(プレイヤー)と Sphere(ゴール)を作成

次に、プレイヤーとゴールとなるオブジェクトを作成します。

1. Cube(プレイヤー)の作成

  1. [ヒエラルキー](Hierarchy) ウィンドウを開く
  2. 右クリック → [3D Object] → [Cube] を選択
  3. 名前を Cube に変更

このCubeがプレイヤーとして移動するオブジェクトになります。


2. Sphere(ゴール)の作成

  1. [ヒエラルキー](Hierarchy) ウィンドウで、
    右クリック → [3D Object] → [Sphere] を選択
  2. 名前を Sphere に変更
  3. Cube と Sphere を少し離して配置

このSphereにCubeがぶつかると、シーンを切り替える仕組みを作ります。


③ CubeにRigidbodyを追加

Cubeをプレイヤーとして移動させるために、Rigidbody(リジッドボディ) を設定します。

  1. [Cube] を選択
  2. [インスペクター](Inspector) ウィンドウで [Add Component](コンポーネントを追加) をクリック
  3. “Rigidbody” を検索して追加
  4. [Use Gravity](重力を使用) のチェックを外す

こうすることで、Cubeが物理的に影響を受けずに、スクリプトで自由に移動できるようになります。


④ Scene2 を作成

次に、シーン遷移先となる Scene2 を作成します。

  1. [File] → [New Scene] をクリックし、新しいシーンを作成
  2. [File] → [Save As] を選択し、名前を Scene2 に変更
  3. [ヒエラルキー](Hierarchy) ウィンドウが空になっていることを確認

⑤ シーンをビルド設定に追加

シーン遷移をスムーズに行うために、ビルド設定に追加しておきます。

  1. [File](ファイル) → [Build Settings](ビルド設定) を開く
  2. [Add Open Scenes](開いているシーンを追加) をクリックし、Scene1 を追加
  3. Scene2 をダブルクリックして開き、再び [Add Open Scenes] をクリックして Scene2 も追加
  4. Scene1 を一番上に配置(ドラッグで変更可)

これで、シーン遷移の準備が整いました!
次のステップでは、プレイヤー(Cube)が Sphere にぶつかったら Scene2 に切り替わるスクリプト を作成していきます。




3. シーン遷移のスクリプト

シーンを移動するには SceneManager.LoadScene() を使います。ここでは、プレイヤー(Cube)が Sphere にぶつかったら Scene2 に遷移する仕組みを作ります。


① CubeMove.cs の作成

まず、シーン遷移を管理するスクリプトを作成しましょう。

  1. プロジェクトウィンドウを右クリック
  2. 「Create」 → 「C# Script」 を選択
  3. 新しいスクリプトの名前を CubeMove に変更

次に、作成した CubeMove.csCube にドラッグ&ドロップ してアタッチします。


② CubeMove.cs を記述

スクリプトを開き、以下のコードを入力してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class CubeMove : MonoBehaviour
{
private float speed = 3.0f;

void Start()
{
DontDestroyOnLoad(gameObject);
}

void Update()
{
float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;
transform.position = new Vector3(
transform.position.x + moveX, 0, transform.position.z + moveZ);
}

void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "Sphere")
{
SceneManager.LoadScene("Scene2");
}
}
}

③ スクリプトの解説

このスクリプトでは、以下の処理を行っています。

  1. DontDestroyOnLoad(gameObject);
    • Start() 内で、オブジェクトがシーン移動時に削除されないように設定。
    • これにより、シーンを切り替えても Cube が消えずに残る
  2. Update() で Cube を移動
    • Input.GetAxis("Horizontal")左右(X軸) の移動を取得。
    • Input.GetAxis("Vertical")前後(Z軸) の移動を取得。
    • Time.deltaTime を掛けることで、フレームレートに依存しないスムーズな動きを実現。
  3. OnCollisionEnter(Collision other) でシーン遷移
    • Cube が Sphere にぶつかったら、 SceneManager.LoadScene("Scene2"); で Scene2 に移動。

④ 動作確認

  1. Unity を再生
  2. 矢印キー(← → ↑ ↓)で Cube を操作
  3. Sphere にぶつかると Scene2 に移動する

これで、プレイヤーが Sphere に触れるとシーンが変わるようになりました!
次は シーン遷移後も BGM を鳴らし続ける 仕組みを作ります。




4. シーンが変わってもBGMを鳴らし続ける

シーンを移動すると BGM が途切れてしまう問題を解決するために、DontDestroyOnLoad を活用します。この設定を行うことで、BGM を再生するオブジェクトがシーンを切り替えても削除されず、音楽が途切れなくなります。


① 空の GameObject にオーディオソースを追加

まず、BGM を再生するための 空の GameObject を作成し、オーディオソースを追加します。

  1. Hierarchy ウィンドウで右クリックCreate Empty を選択し、名前を SoundManager に変更
  2. SoundManager を選択した状態で、Inspector ウィンドウから Add Component をクリック
  3. Audio Source を追加
  4. Audio Source の設定を変更
    • 「Play On Awake」(ゲーム開始時に再生)✅ チェックを入れる
    • 「Loop」(繰り返し再生)✅ チェックを入れる
    • Audio Clip に BGM 用の音楽ファイルをドラッグ&ドロップして設定

これで、ゲーム開始時に BGM が再生されるようになります。


② SoundManager.cs を作成して BGM を維持する

次に、BGM をシーン遷移後も消えないようにするためのスクリプトを作成します。

  1. Project ウィンドウ で右クリックCreateC# Script を選択
  2. スクリプトの名前を SoundManager に変更
  3. SoundManagerSoundManager オブジェクトにドラッグ&ドロップ してアタッチ
  4. スクリプトを開き、以下のコードを入力する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundManager : MonoBehaviour
{
void Start()
{
DontDestroyOnLoad(gameObject);
}
}

③ スクリプトの解説

このスクリプトの Start() 内で DontDestroyOnLoad(gameObject); を実行しています。

  • DontDestroyOnLoad(gameObject);
    • このオブジェクト(SoundManager)は、シーンを変更しても削除されない
    • そのため、BGM が再生されたままシーンを移動できる

④ 実際に動作を確認しよう

  1. Scene1 を再生
    • BGM が流れることを確認
  2. Cube を操作して Sphere に触れる
    • Scene2 に切り替わる
  3. Scene2 に移動しても BGM が止まらないことを確認
    • BGM が途切れずに続いていたら成功!

⑤ 注意点:BGM が二重に再生される問題

もし、シーンが変わるたびに BGM が重なって聞こえる 場合は、SoundManager が複数生成されている可能性があります。その場合、次のように修正しましょう。

  1. SoundManager.cs を次のように変更
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundManager : MonoBehaviour
{
private static SoundManager instance;

void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}

⑥ まとめ

  • Audio Source を持つ SoundManager を作成し、BGM を設定
  • SoundManager.csDontDestroyOnLoad を記述し、シーン遷移時にオブジェクトを削除しない
  • Awake()SoundManager が 1 つだけになるように 修正すれば、BGM の二重再生も防げる

これで、シーンを移動しても BGM を鳴らし続ける仕組み が完成しました!




6. まとめ

今回は、シーンを移動してもBGMを止めない方法を解説しました。
重要なポイントを振り返りましょう!

DontDestroyOnLoad() を活用する
BGMが再生されるオブジェクト(SoundManager)に DontDestroyOnLoad(gameObject); を設定することで、シーンが切り替わっても削除されずに音楽を鳴らし続けられます。

シーン遷移のスクリプトを適切に管理する
プレイヤー(Cube)が Sphere に触れたら SceneManager.LoadScene("Scene2"); を実行し、シーンを切り替える処理を作成しました。これにより、シームレスなシーン遷移が可能になります。

オーディオソースの設定を忘れずに!
BGMをループ再生するために、「Play On Awake」「Loop」 にチェックを入れることが大切です。

BGMの重複再生を防ぐ
シーンごとに新しく SoundManager が作成されると、BGMが二重に流れる問題が発生します。これを防ぐため、シーン切り替え時に 同じオブジェクトが存在していないかチェックする処理 を追加するとよいでしょう。




よくある質問(FAQ)

Q
シーン遷移後もBGMを鳴らし続けるために DontDestroyOnLoad を適用するオブジェクトは?
A

BGMを管理するGameObject(SoundManager)に適用するのがベスト。そうすることで、シーンを移動しても消えずに音楽を再生し続ける。

Q
シーン遷移後に BGM が二重に再生されるのはなぜ?
A

シーンが変わるたびに新しい SoundManager が作成されている可能性があるGameObject.Find("SoundManager") で既存のオブジェクトを確認し、重複を防ぐ。

Q
他の音(SEなど)も DontDestroyOnLoad にするべき?
A

基本的にSEは各シーンごとに設定した方がいい。BGMと違って、シーンごとに異なるSEがあるため、必要なものだけ DontDestroyOnLoad する。

タイトルとURLをコピーしました