【Unity】RPGを作るチュートリアルその115 マップのBGMを再生する機能を実装
- 2025.08.14
- RPGチュートリアル
- RPG, Unity, ゲーム開発, チュートリアル

シンプルなRPGをUnityで作るチュートリアルシリーズの115回目です。
第114回ではオーディオの再生や停止を管理するクラスを作成しました。
今回はマップのBGMを再生する機能を実装します。
制作環境
MacBook Pro 2023 Apple M2 Max
Unity6 (6000.0.30f1) Silicon
作業内容と順序
シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。
チュートリアルの一覧
このシリーズ全体の一覧は以下のページにまとめています。
前回の内容
前回はオーディオの再生や停止を管理するクラスを作成しました。
マップのBGMの再生
タイトル画面ではコード内からBGM名を指定して再生しましたが、マップで再生するBGMは直接コード内から指定するのは難しいため、コード外からBGMを指定できるようにしたいと思います。
簡易的ではありますが、各マップの情報を保持する「MapDataRecord」を作成してあるので、こちらにBGM名を文字列として持たせるようにしたいと思います。マップを切り替える「MapManager」ではこの定義データを元にBGMを再生するようにしていきます。
また、マップの切り替え時に前のマップのBGMをフェードアウトしたいのですが、これはイベントとして実装したいと思います。マップの切り替えはイベントから行なっているので、画面をフェードアウトさせるタイミングでBGMもフェードアウトさせるようにします。若干手間ですが今回のチュートリアルではこの形式で進めていきます。
マップの定義データの変更
まずはマップの定義データから変更していきます。
「MapDataRecord」のクラスにて、BGM名を保持するフィールドを作成します。
既存のフィールドの下に「bgmName」のフィールドを追加しました。このフィールドの値を確認してBGMを再生するようにします。
また、作成済みのScriptableObjectに以下のように値を設定していきましょう。
Map Id | Name | Bgm Name |
0 | テストマップ | Village |
1 | 村 | Village |
2 | フィールド | Field |
3 | ダンジョン | Dungeon |
MapManagerの変更
マップの切り替えを行う「MapManager」の内容を変更します。
マップの切り替え処理を行うShowMap()のメソッドにて、BGMを切り替えるかどうかのフラグを引数として追加しました。デフォルトではtrueで切り替えを行うようにしています。
イベントの確認後、「switchBgm」のフラグがtrueの場合は、マップIDに対応する定義データを取得して、そのBGM名を使ってBGMを再生するようにします。
オーディオ関連のイベントプロセスの追加
マップのBGMを停止するため、イベントを追加します。ついでにBGMや効果音を再生/停止するイベントプロセスを一気に作成したいと思います。Projectウィンドウの「Assets/Scripts/Event/Process」のフォルダを開き、以下の4つのスクリプトファイルを作成します。
スクリプトファイル名 | 概要 |
EventProcessPlayBgm |
指定したBGMを再生する |
EventProcessPlaySe | BGMを停止する |
EventProcessStopBgm | 指定した効果音を再生する |
EventProcessStopSe | 効果音を停止する |

BGMを再生するイベントプロセス
イベントプロセスからBGMを再生できるようにするため、
- BGM名
- 前回の再生位置から再生するかのフラグ
- ループするかのフラグ
をInspectorウィンドウで設定できるようにして、BGM再生の処理を呼び出すようにします。
これに沿って、先ほど作成した「EventProcessPlayBgm」の中身は以下のように記載しました。
イベントプロセスのInspectorウィンドウにてBGMを指定して再生できるようにしています。続きから再生するかどうかの「_isResume」はデフォルトでfalse、BGMなのでループ再生はデフォルトでtrueにしています。
効果音を再生するイベントプロセス
同様にイベントプロセスから効果音を再生できるようにするため、
- 効果音名
- ループするかのフラグ
をInspectorウィンドウで設定できるようにして、効果音再生の処理を呼び出すようにします。
これに沿って、先ほど作成した「EventProcessPlaySe」の中身は以下のように記載しました。
効果音名を指定して再生します。効果音ではループ再生のフラグはデフォルトでfalseにしています。
BGMを停止するイベントプロセス
BGMを停止させる際には、フェードアウトにかかる時間を指定できるようにします。
先ほど作成した「EventProcessStopBgm」の中身は以下のように記載しました。
停止時は特定のBGMを停止するか、全てのBGMを停止するかを選べるようにしています。「_isStopAll」がtrueなら全てのBGMを停止するStopAllBgm()を呼び出し、「_isStopAll」がfalseならBGM名を指定するStopBgm()を呼び出します。
効果音を停止するイベントプロセス
効果音を停止させる際にも、フェードアウトにかかる時間を指定できるようにします。
先ほど作成した「EventProcessStopSe」の中身は以下のように記載しました。
効果音に関しては特定の効果音を停止させるのではなく、全ての効果音を停止するようにします。
BGMのフェードアウトのイベントプロセスを組み込み
マップから移動する際のBGMのフェードアウトについて、Prefab内のイベントオブジェクト内に組み込んでいきます。対象となるのはマップ移動のイベントで、BGMの停止と足音の効果音の再生の2つを組み込んでいきたいと思います。
まずはHierarchyウィンドウから「Map_0001_Village」の中にある「Event_MoveMap」のゲームオブジェクト内にて、「Processes」の下に2つのゲームオブジェクトを作成します。名前はそれぞれ [StopBgm] と [PlaySe] にして、子オブジェクト内で先頭になるようにします。

「StopBgm」のゲームオブジェクトでは「EventProcessStopBgm」のスクリプトをアタッチします。「Fade Time」、「Is Stop All」ともにデフォルトの値にしておきます。

「PlaySe」のゲームオブジェクトでは「EventProcessPlaySe」のスクリプトをアタッチします。「Se Name」では移動時の効果音である [Move] を指定します。

イベントプロセスのつながりは以下のように変更します。
ゲームオブジェクト名 | フィールド名 | 対象のゲームオブジェクト名 |
EventPage | Start Process | StopBgm |
StopBgm | Next Process | PlaySe |
PlaySe | Next Process | FadeOut |
画面のフェードアウトを行う前にBGMを停止させ、移動時の効果音を再生するようにします。
これと同様に、以下のゲームオブジェクトについてもBGMの停止と効果音の再生のイベントプロセスを追加します。
Prefab名 | イベントのゲームオブジェクト名 |
Map_0002_Field | Event_MoveMap_Village |
Map_0002_Field | Event_MoveMap_Dungeon |
Map_0003_Dungeon | Event_MoveMap |
変更が終わったら、各PrefabのInspectorウィンドウにて「Overrides」のプルダウンから [Apply All] を選択して変更を反映します。
動作確認
シーンを保存したら動作を確認していきましょう。
「Title」シーンを開いてゲームを実行して、「はじめから」あるいは「つづきから」を選択してゲームを開始した際に、タイトル画面から対象のマップのBGMに切り替わることを確認します。また、村からフィールド、フィールドからダンジョンなど、マップ移動をした時に、
- 前のマップのBGMがフェードアウトすること
- 移動の効果音が再生されること
- 新しいマップのBGMが再生されること
を確認しましょう。
なお、現時点ではエンカウントが発生した時のBGM切り替え機能を入れていないので、マップのBGMがそのまま流れます。この部分は次回実装していきます。
今回のブランチ
まとめ
今回はマップのBGMを再生する機能を実装しました。BGMを停止させるためにオーディオを操作するイベントプロセスについても実装しています。
次回は戦闘画面のBGMや効果音など、オーディオ関連の機能を実装します。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその114 オーディオの再生や停止を管理するクラスの作成 2025.08.13
-
次の記事
記事がありません
コメントを書く