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

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

シンプルな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」ともにデフォルトの値にしておきます。

BGMを停止するイベントプロセス
BGMを停止するイベントプロセス

 

「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や効果音など、オーディオ関連の機能を実装します。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!