【Unity】RPGを作るチュートリアルその116 戦闘時のオーディオ関連機能を実装

【Unity】RPGを作るチュートリアルその116 戦闘時のオーディオ関連機能を実装

シンプルなRPGをUnityで作るチュートリアルシリーズの116回目です。

第115回ではマップのBGMを再生する機能を実装しました。BGMを停止させるためにオーディオを操作するイベントプロセスについても実装しています。

今回は戦闘画面のBGMや効果音など、オーディオ関連の機能を実装します。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回はマップのBGMを再生する機能を実装しました。BGMを停止させるためにオーディオを操作するイベントプロセスについても実装しています。

 

戦闘画面のオーディオ

戦闘画面ではBGMと効果音の再生機能を実装していきます。

BGMに関しては戦闘開始時に再生します。戦闘開始のきっかけはエンカウント、イベントプロセスの両方があるので、どちらもコードを変更していきます。また、戦闘勝利時、または敗北時には戦闘時のBGMを停止しつつ、対応する効果音(ジングル)を再生します。

コマンドの選択、各アクションに関しても効果音を入れていきましょう。

 

戦闘画面のBGMの実装

エンカウント時、イベントからの呼び出し時の両方で処理を入れていきます。どちらも戦闘前に再生されていたBGMを同じ位置から再生できるようにしたいので、マップの定義データからBGMを取得する機能を追加したいと思います。

 

MapDataManagerの変更

まずは「MapDataManager」のクラスにて、BGM名を取得するメソッドを追加します。

既存のGetMapName()のメソッドの下に、マップIDからBGM名を取得するGetMapBgmName()のメソッドを追加します。このメソッドを使って、戦闘機能を呼び出すクラスにてBGM名を取得します。

 

EncounterManagerの変更

「EncounterManager」では戦闘時のBGMを再生する機能、戦闘後にBGMを戻す機能などを実装します。

BGMのフェードアウトの時間を待つためにコルーチンを使います。そのため「using System.Collections;」のusingディレクティブを追加しました。

 

既存の「_loseEvent」のフィールドの下に、戦闘時のBGM名を指定できる「_battleBgmName」のフィールドを追加しています。デフォルトでは「BgmNames」に定義された戦闘用のBGM名を指定しています。

 

CheckEncounter()のメソッドでは、エンカウント発生時の処理をコルーチンに移し、そのコルーチンを起動するようにしました。StartBattleProcess()のコルーチンではフィールドのBGMをフェードアウトさせつつ、戦闘発生の効果音を再生しています。効果音の再生を待った後、戦闘用のBGMを再生するようにしています。

 

戦闘終了時に呼ばれるOnFinishedBattle()では、今いるマップのBGM名を取得し、「isResume」の引数をtrueとして渡すことで、戦闘前に再生していた位置から再生するようにします。勝っても負けても、戦闘が終了するタイミングで戦闘用BGMを停止させます。この処理は「BattleResultManager」に実装します。

 

EventProcessBattleの変更

「EventProcessBattle」でも同様に、戦闘時のBGMを再生する機能、戦闘後にBGMを戻す機能などを実装します。

こちらでもBGMのフェードアウトの時間を待つためにコルーチンを使います。そのため「using System.Collections;」のusingディレクティブを追加しました。

 

こちらも同様に既存の「_loseEvent」のフィールドの下に、戦闘時のBGM名を指定できる「_battleBgmName」のフィールドを追加しています。デフォルトでは「BgmNames」に定義された戦闘用のBGM名を指定しています。

 

Execute()の中に記載していた処理をStartBattleProcess()のコルーチンに移しました。戦闘開始時の効果音を再生する前に、「BattleManager」がいるかどうかを確認していて、もしいない場合はイベントを抜けるようにしています。「EncounterManager」ではInspectorウィンドウから参照をアサインしていますが、こちらでは動的に取得することから念の為この形にしています。

イベントによる戦闘ではBGMが変わる可能性も考慮して、フィールドとして設定できるようにしています。イベント単位で変更できるのでボスのBGMなども実現できます。

OnFinishedBattle()では「EncounterManager」と同様に「MapManager」への参照を取得して、BGM名を取得できたら元のBGMを再生する流れになります。

 

BattleResultManagerの変更

「BattleResultManager」では勝利時と敗北時にBGMを停止した後、対応するジングルを再生します。また、レベルアップ時に効果音を再生するようにしたいと思います。

WinMessageProcess()のコルーチンの冒頭で戦闘用BGMの停止を行います。BGMと効果音では使っているAudioSourceが異なるので、待ち時間を入れずに再生してもフェードアウトされることなく「SeNames.BattleWin」の効果音を鳴らすことができます。

経験値とゴールドを表示する際はページ送り用のアイコンを表示するので、決定ボタンを押したタイミングで選択時の効果音を再生します。

また、レベルアップした場合には「SeNames.LevelUp」の効果音を再生します。

 

戦闘画面の効果音の実装

続いて戦闘画面の効果音再生の機能を実装していきます。

  • 項目の選択
  • 攻撃時
  • 魔法使用時
  • アイテム使用時

にそれぞれ効果音を再生します。

 

項目の選択の効果音

コマンド画面や魔法/アイテム選択画面で項目を選択した際の効果音を再生するようにします。また、魔法/アイテム選択画面ではキャンセルするケースもあるので、キャンセル時の効果音についても再生します。

 

CommandWindowControllerの変更

「CommandWindowController」では項目選択時の効果音を再生します。

既存のSelectCommand()の分岐にて、決定ボタンを押した時の処理としてPlaySe()を呼び出しています。決定した時の効果音なので「SeNames.OK」を指定しています。

 

SelectionWindowControllerの変更

「SelectionWindowController」では項目選択時、キャンセル時の効果音をそれぞれ再生します。

決定ボタンを押した時の処理はOnPressedConfirmButton()に記載されているので、こちらで項目選択時の効果音を再生します。

キャンセルボタンを押した時の処理はOnPressedCancelButton()のメソッドなので、こちらはキャンセル時の効果音を再生します。

 

攻撃時の効果音

各アクションに対応したクラスを変更していきましょう。攻撃時の効果音については「BattleActionProcessorAttack」のクラスを変更していきます。

メッセージ表示のタイミングに合わせて効果音を再生するため、ShowAttackMessage()のコルーチンに再生処理を追加します。

攻撃する時のメッセージに合わせて「SeNames.Attack」で攻撃時の効果音を再生します。

ダメージのメッセージに合わせて「SeNames.Damage」でダメージ音を再生します。

今回は固定の効果音として実装していますが、装備している武器に応じて攻撃音やダメージ音を変えるのも良いかもしれません。

 

魔法使用時の効果音

魔法使用時の効果音については「BattleActionProcessorMagic」のクラスを変更していきます。

魔法詠唱に「SeNames.Magic」の効果音を再生しています。詠唱は1回で複数の効果があるケースを考慮し、ProcessMagicActionCoroutine()の冒頭で効果音の再生処理を呼び出します。

 

ShowMagicHealMessage()のコルーチンでは回復時のメッセージに合わせて「SeNames.Heal」の効果音を再生します。魔法の効果は複数あるケースを想定しているので、効果の種別ごとに効果音を再生するようにすると良いかと思います。

 

アイテム使用時の効果音

アイテム使用時の効果音については「BattleActionProcessorItem」のクラスを変更していきます。

ShowItemHealMessage()のコルーチンにて、回復のメッセージに合わせて「SeNames.Heal」の効果音を再生します。

アイテムに関しては、初期のドラクエでアイテムを使った際に効果音がなかったような気がするので、それに合わせてアイテム効果の方の効果音を再生する形にしています。

 

動作確認

スクリプトを保存したら動作を確認しましょう。

「Title」シーンを開いてゲームを実行して、「はじめから」あるいは「つづきから」を選択してゲームを開始したらフィールドに進んで戦闘を開始します。

  • 戦闘開始の効果音が再生されること
  • 戦闘のBGMが再生されること
  • コマンド選択時、項目選択時に効果音が再生されること
  • 戦闘勝利時に戦闘のBGMが停止して勝利時の効果音が再生されること
  • 戦闘敗北時に戦闘のBGMが停止して敗北時の効果音が再生されること
  • レベルアップ時に効果音が再生されること
  • 戦闘終了後、元のマップのBGMが再生されること

を確認しましょう。また、ダンジョンの奥でボスゴブリンと戦った際にも同様に戦闘のBGMや効果音が再生されることを確認します。

戦闘時のオーディオ関連部分を確認
戦闘時のオーディオ関連部分を確認

 

今回のブランチ

 

まとめ

今回は戦闘画面のBGMや効果音など、オーディオ関連の機能を実装します。オーディオが充実してくるとゲームらしさがグッと増しますね。

次回はタイトル画面の効果音、メニュー画面の効果音を実装します。効果音に関しては対象が多いので順番に実装していきましょう。

 

     

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

CTA-IMAGE

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


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


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