【Unity】RPGを作るチュートリアルその113 BGMや効果音のオーディオファイルのインポート

【Unity】RPGを作るチュートリアルその113 BGMや効果音のオーディオファイルのインポート

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

第112回ではタイトル画面の動作のうち、「つづきから」の動作を実装しました。

今回はBGMや効果音のオーディオファイルをインポートしていきます。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はタイトル画面の動作のうち、「つづきから」の動作を実装しました。

 

オーディオの再生や停止を管理する機能

作業内容や順序のページに書いておきながら、しばらく触れないでいたオーディオ関連の機能ですが、一通りゲーム全体の動作を実装できたのでいよいよ導入していきたいと思います。

AddressablesでBGMや効果音のオーディオファイルを読み込めるようにしておいて、ファイルを指定するための名前を定義値クラスに記載しておきたいと思います。Addressablesの名前として設定されているBGM名や効果音名を指定することで再生できるようにしていきます。

なお、BGMや効果音に関しては自力で作るには量が多かったのでフリー音源を使う流れで進めようかとも思いましたが、プロジェクトをgithubで公開している関係で、フリー音源をコミットしてしまうと再配布になって規約違反になる可能性があるため、悩んだ結果頑張って自力で作りました(白目)

とりあえず鳴っていればいいやの精神で作ったため質に関してはお察しくださいという感じなので、適宜フリー音源などと差し替えて使用していただいても問題ありません。

オーディオの再生に関してはAudioSourceのコンポーネントを使用します。BGM用に2つのAudioSourceを用意して、チャンネル1と2のように分けて利用していきます。再生中のBGMがない場合はチャンネル1から利用して、フェードアウトさせてからの再生といったときには、チャンネル1に対してフェードアウト処理を行いつつ、チャンネル2でAudioClipをセットして再生、みたいな形で利用していきたいと思います。今回のチュートリアルの中では実装しませんが、チャンネルを複数用意しておくことで、チャンネル1をフェードアウトさせつつ、チャンネル2をフェードインさせる、いわゆるクロスフェードにも対応できます。

マップの移動中に戦闘が発生、戦闘後にマップBGMの同じ位置から再生、といったときには、再生中のAudioSourceから再生位置を取得して、戦闘後にその位置から再生する機能も入れておきます。

効果音に関してはチャンネル数を絞らず、必要なタイミングでAudioSourceを持ったゲームオブジェクトを作成していきます。毎回作成するとパフォーマンスに影響が出るので、生成済みのAudioSourceに関しては管理クラスからリストとして参照できるようにしておいて、停止中のAudioSourceがあればそのAudioClipを切り替えて再生、なければ新しくAudioSourceのゲームオブジェクトを作成、といった形でオブジェクトプールを作成しておきます。

これらのBGMや効果音の動作を管理するクラスを用意して、他のクラスからはこの管理クラスを通してオーディオの再生や停止を行います。

 

チュートリアルで使用するオーディオ

チュートリアルでは以下の種類のオーディオを使用します。場面に対応するオーディオファイルはこちらで用意してありますが、プロジェクトにインポートする際は任意のオーディオファイルに差し替えていただいて構いません。

こちらで用意したファイルについてはogg形式にしてあります。また、以下のファイルをまとめてzip形式でまとめているのでこちらもお使いください。

Audio.zip

 

BGM

BGMは全部で5ファイルです。初期のドラクエのイメージでチュートリアルを作っているので、ファミコンの音源に合わせて矩形波2チャンネル、三角波1チャンネル、ノイズ1チャンネルの4チャンネルで作りました。

素材配布サイト様によくある曲の解説に憧れていたので、それも入れています。曲を作るのはとても楽しいですね(小並感)

場面 ファイル名 ループ処理 解説という名の余談
タイトル Title.ogg ファミコンのタイトル画面で流れていそうな感じをイメージしました。カノン進行でそれっぽくしています。
フィールド Field.ogg フィールド曲といえばメインテーマのアレンジだよね、というFFから学んだ点を導入しました。タイトル画面の曲のコードとリズムを変えてアレンジしています。

勇者っぽさをイメージしたらなんだかクロノトリガーのカエルのテーマのような成分が含まれていました。

Village.ogg 安定のカノン進行。メロディは笛のようにしたかったので、多くの場合ベースとして使われる三角波にしています。
ダンジョン Dungeon.ogg ダンジョンってどんな感じだったっけ……? と悩みに悩んでベース音でゴリ押しすることにしました。
戦闘 Battle.ogg ザ・難産。ロマサガ風やメガテン風からスタートして、ドラクエ、FF、ペルソナ、世界樹風を経由しつつ何回も没にした結果ロックマン風味になりました。

1対1のバトルなのでそんなに長くなくて良いはずが、作っているうちに楽しくなって1分以上の曲になってしまい、我に返ってコンパクトにまとめました。

 

どんな場面で使うか、曲はどんなイメージか、テンポはどのくらいか、といった点を事前に頭の中でまとめておけると、他の方に曲を作ってもらう場合にすり合わせがしやすくなります。フリー素材を使う時にも、イメージを持っておくと選曲しやすくなります。

 

効果音

効果音は全部で13ファイルです。敗北時はBGMではなく効果音で、レベルアップも効果音として、といった形でジングルもこちらに入れています。こちらもファミコンの音源に合わせて矩形波2チャンネル、三角波1チャンネル、ノイズ1チャンネルの4チャンネルで作りました。ノイズを使ってイメージした音を作るのは楽しい反面、なかなか思うようにならないことも多く、先人たちの苦労が忍ばれます。

場面 ファイル名 音のイメージ 解説という名の余談
決定 OK.ogg ピッ たくさん再生されるのでシンプルにいきました。
キャンセル Cancel.ogg ティロッ 決定と反対になるイメージです。
移動 Move.ogg ザッザッザッザッ ここはどうしてもドラクエっぽくしたかったんです。
宝箱 Treasure.ogg パカッ 開ける感じの音って難しいですね。
宿 Inn.ogg 短めのジングル ドラクエの宿やポケモンセンターみたいなイメージです。
戦闘開始 BattleStart.ogg シパーン サガ2とかFF2とかFF3のイメージで。フィールドとの切り替わりを分かりやすくするためノイズで表現しました。
攻撃 Attack.ogg シャシャシャ 攻撃している時の勢いをイメージしました。難しい……。
魔法の使用 Magic.ogg ピロリロ 不思議なことが起こっているイメージで。ドラクエをめっちゃ意識しています。
回復 Heal.ogg ピロリロリ 回復音も難しかったです。先人たちの偉大さを感じます。
ダメージ Damage.ogg バシバシ この辺りからノイズのチューニングが楽しくなりました。
勝利 BattleWin.ogg 短めのジングル 短く、勝った感を出すのは中々難しいですね。
レベルアップ LevelUp.ogg 短めのジングル ポケモンくらいシンプルにしました。
ゲームオーバー Gameover.ogg 短めのジングル ドラクエ1やテリーのワンダーランドを参考に。

 

なんで自分で作ろうとしてしまったのか……。でも限られた音源の中で表現する勉強としては非常に良いものでした。ノイズはチューニング次第で色々な音に変化するので、8bit風のゲームを作る際には便利かもしれません。

 

オーディオのインポート

上記のオーディオをインポートしていきましょう。オーディオを配置するフォルダから作成していきます。Projectウィンドウの「Assets」にて、新しくフォルダを作成し、名前を [Audio] にします。

Audioフォルダの作成
Audioフォルダの作成

 

作成した「Audio」フォルダに移動し、ダウンロードしたzipを解凍した中にある「BGM」と「SE」のフォルダをドラッグ&ドロップしてインポートします。

zip内のフォルダをインポート
zip内のフォルダをインポート

 

インポートしたBGMと効果音(SE)のインポート設定を入れていきましょう。「BGM」のフォルダに移動し、5つのファイルを全て選択した状態で、Inspectorウィンドウから設定を行います。

上部の「Load In Background」にチェックを入れておきます。チェックを入れておくと、ゲーム開始時に非同期でオーディオをロードするようになり、メインスレッドの負荷が軽減されます。

「Load Type」では [Compressed In Memory] を選択します。メモリ上に圧縮された状態でロードされ、再生時に展開されます。多少CPU負荷はありますが、メモリ効率とのバランスが良いのでこちらにしています。デフォルトの「Decompress On Load」はメモリ使用率が大きく、「Streaming」はCPU負荷と音質への影響が大きいため、今回の短めのBGMでは3種類のうち一番バランスが良い設定かと思います。

「Preload Audio Data」はシーンのロード後にオーディオファイルをロードしておくかどうかのフラグで、Trueなら事前にロードしておき、Falseなら再生時にロードするようになります。今回はBGM数も少ないのでTrueにしておきます。もしゲーム内のBGM数が多い場合には、シーン開始直後に使用するBGMなどに絞ってTrueにしておくなど、調整しておくと良いかと思います。

「Quality」は品質を調整してファイルサイズを調整する項目で、値を下げるとファイルサイズも小さくなっていきます。その分品質も下がっていくので、聞いていてノイズが多くなったりする手前くらいに調整するとファイルサイズとのバランスも良くなります。今回はファミコン風の音源で音質は重視しないので、 [50] にしました。

インポート設定
インポート設定

 

設定し終わったら [Apply] をクリックします。

また、「SE」のフォルダに移動して、効果音のファイルを全て選択し、同じ設定を行います。リリースするゲームであれば効果音の種類(ノイズが主体かどうかなど)によって細かく調整していくと良いのですが、まずはオーディオ部分の実装を進めていきたいのでBGMと同様の設定にしています。

 

Addressablesへの登録

インポートしたオーディオファイルをAddressablesのグループに登録します。グループとしては、BGMのグループ、効果音のグループを追加しましょう。これらのグループに関しても対応するラベルを作成しますが、実際にロードする際にはAddressables名を使って個別にオーディオファイルを指定してロードしたいと思います。

ラベル名の定義は既存クラスに追加、Addressables名の定義は新しくクラスを作って管理したいと思います。コードからオーディオを指定する場合も、イベントプロセスからオーディオを指定する場合も、文字列で指定するようにします。

 

グループの作成と登録

「Addressables Groups」のウィンドウを表示して、グループを2つ追加します。名前は [BGM][SE] にしました。ドラッグ&ドロップで並び順を変更できるので、一番下に持ってきました。

グループの作成
グループの作成

 

インポートしたBGMのファイルを「BGM」のグループにドラッグ&ドロップし、効果音のファイルを「SE」のグループにドラッグ&ドロップします。複数選択した状態でコンテキストメニューの [Simplify Addressable Names] からAddressables名をシンプルにします。

グループへの追加
グループへの追加

 

続いてラベルを設定します。「Labels」のプルダウンから [Manage Labels…] を選択し、[BGM][SE] のラベルを追加します。ラベル管理ウィンドウを閉じたら、BGMを複数選択して「Labels」のプルダウンから [BGM] を選択し、続いて効果音を複数選択して同様に [SE] を選択します。

ラベルの設定
ラベルの設定

 

定義クラスの設定

次にAddressables関連の定義値を追加していきます。先にラベルを定義している「AddressablesLabels」のクラスから変更していきます。既存の「Flag」のフィールドの下に、今回追加した「BGM」と「SE」のラベルに対応する文字列を追加します。

 

また、BGM名と効果音名を定義するクラスをそれぞれ作成します。まずはBGM名を定義するクラスから作成していきます。Projectウィンドウから「Assets/Scripts/Consts」のフォルダを開き、空のスクリプトファイルを作成します。名前は [BgmNames] にしました。

BGMの名前の定義クラス
BGMの名前の定義クラス

 

作成した「BgmNames」の中身は以下のように記載しました。

どこからでもアクセスできるようにstaticなクラスにしています。今回は使用する場面をBGMのファイル名およびAddressables名にしているので、同様に定義値としても指定します。もし別のサイトからダウンロードしたBGM素材を使う場合は、ファイル名やAddressables名を文字列として定義して、フィールド名だけこのチュートリアルと合わせるとスムーズに統合できるかと思います。

 

同様に効果音名を定義するクラスも作成します。Projectウィンドウから「Assets/Scripts/Consts」のフォルダにて、空のスクリプトファイルを作成します。名前は [SeNames] にしました。

効果音の名前の定義クラス
効果音の名前の定義クラス

 

作成した「SeNames」の中身は以下のように記載しました。

こちらも同様にstaticなクラスとして作成しています。効果音のファイル数は多くなることが多いので、Addressablesのグループを取得して、その名前からコードを生成するようなエディタ拡張を作っておくと楽かもしれません。

 

動作確認に関しては、オーディオ管理のクラスを作成したタイミングで行いたいと思います。今回はコンパイルエラーがなければOKです。

 

今回のブランチ

(8/12追記) コミットしたままブランチ切ってなくてすみませんでしたァ!

 

まとめ

今回はBGMや効果音のオーディオファイルをインポートしました。再生するBGMや効果音を指定するために、何らかの定義値を用意しておくとコード内でも変更に強くなるかと思います。

次回はオーディオの再生や停止を管理するクラスを作成していきます。

     

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

CTA-IMAGE

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


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


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