公開日:2023/07/08  更新日:2023/07/08

Unityでのサウンド管理

 Unityのゲーム制作ではBGMや効果音のサウンド管理を行っていく必要がある。
 やり方は色々あるが一例を紹介していく。またサウンド管理に役立つアセットについても紹介していく。
 AudioSourceなどオーディオ関係の基本操作がわからない場合は先に以下の記事を確認してほしい。
オーディオ設定の基本
 また、ScriptableObjectを使うのでわからない場合は以下の記事を確認してほしい。
ステータス管理
アイテム管理

Unityでのサウンド管理システム目次

サウンド管理システムの仕様
BGM管理システムの作り方
SE管理システムの作り方
目次にもどる

サウンド管理システムの仕様

 今回は3Dゲームを作る場合を想定してScriptableObjectを使ったサウンド管理システムを制作する。
 BGMについてはBGMを管理するゲームオブジェクトのAudioSourceから流す。
 効果音については、3D効果音と2D効果音を区別し、3D効果音(敵の足音・吠え声などを想定)については敵オブジェクトにAudioSourceを作成して流すようにする。一方で2D効果音(メニュー選択音などを想定)についてはBGMとほぼ同様の方法で流すようにしていく。

目次にもどる

BGM管理システムの作り方

 ScriptableObjectを使った以下のスクリプトを書く。

 これでプロジェクトビューで右クリック→Create→Data→Create BGMDataと選択すればBGMのAssetファイルを作成できる。
 名前、指定するAudioClip、ボリュームの3つを記述可能。好きなだけAssetファイルを作ろう。


 続いてBGMのAssetファイルをデータベースとしてまとめられるようにしていく。新たなスクリプトを作成し以下のように記述しよう。
 このように記述することで、Create→Data→Create BGMDataBaseと作成することでデータベース用のAssetファイルを作れる。
 +マークを押すことで要素数を増やせる。先ほど作ったBGMdataのAssetファイルをドラッグアンドドロップして放り込んでセットする。


 呼び出したいBGMがあったら、そのBGMdataのBGMデータベースの要素番号を値渡ししつつ、PlayBGMのメソッド(後述する)を呼び出すようにする。呼び出し例は以下の通り。
 シリアル化している。BGMkanriobjectには後述するゲームオブジェクト「BGMkanri」をセットする。
 今回はBGMdatabaseの0番のBGMdataを再生したいので、BGMscript.PlayBGM(0);と記述している。


 BGMkanriという空のゲームオブジェクトを作成し、AudioSourceをアタッチする。
 BGMはループさせたいので、AudioSourceのLoopにチェックをつける。


 BGMkanriに以下のようなスクリプト(名前はBGMkanri)をアタッチする。
 シリアル化しているので、以下のようにBGMDataBaseと先ほどアタッチしたAudioSourceをドラッグ&ドロップして指定しておく。

 PlayBGMが呼び出されたら値渡しされた値を使ってBGMdataを取得し、再生するaudioClipやボリュームなどを指定して、再生する。

目次にもどる

SE管理システムの作り方

 SE管理システムもBGMと基本的な構造は同じ。
 ScriptableObjectを使った以下のスクリプトを書く。
 BGMの時と同様にプロジェクトビューで右クリック→Create→Data→Create SEDataと選択することで効果音のAssetファイルを作れる。
 インスペクター欄で各項目を記述。異なるのはSE3dの項目を追加している点。trueであれば3D効果音、falseであれば2D効果音とする。


 効果音をまとめる効果音データベースを作るためのスクリプトを書く。
 BGMの時と同様にプロジェクトビューで右クリック→Create→Data→Create SEDataBaseと選択することで効果音データベースのAssetファイルを作れるようになる。
 +マークを押して要素を増やし、作成した効果音のSEDataをドラッグ&ドロップして指定しよう。


 呼び出したい効果音があったら、そのSEdataのSEデータベースの要素番号を値渡ししつつ、ObjectSEとPlaySEのメソッド(後述する)を呼び出すようにする。呼び出し例は以下の通り。
 シリアル化している。SEkanriobjectには後述するゲームオブジェクト「SEkanri」をセットする。
 SEscript.ObjectSE(this.gameObject);でこのゲームオブジェクトを値渡しする。
 続いて、SEdatabaseの0番のSEdataを再生したいので、SEscript.PlaySE(0);と記述している。


 SEkanriという空のゲームオブジェクトを作成し、AudioSourceをアタッチする(2D効果音管理用)。

 SEkanriに以下のようなスクリプト(名前はSEkanri)をアタッチする。
 シリアル化している。以下のようにSEのデータベースと2D効果音再生用AudioSourceをアタッチする。


 呼び出されたのが3D効果音だった場合には、このメソッドを呼び出したゲームオブジェクトにAudioSourceがあるかどうかを確認。ないならAudioSourceを15個作成する。
 3D効果音の場合は効果音が重なることも想定される。今再生中の効果音を止めてはならない。よってメソッドを呼び出したゲームオブジェクトのAudioSourceを全て取得して配列に代入している。そして、それらを一つずつisPlayingで再生中か調べて、再生中ではない場合に再生処理を行うようにしている。
 再生処理では、spatialBlendはデフォルトで0なので1にして3Dで音が流れるようにし、ボリュームの設定も行った後に再生を行っている。

 呼び出されたのが2D効果音だった場合には、SEkanriゲームオブジェクトにアタッチしたAudioSourceで音を流す。
 ボリュームを設定し、PlayOneShotでAudioClipを指定して再生している。

 おすすめのBGMや効果音のアセットは以下。
BGM・効果音のおすすめアセット

Unityのゲーム制作まとめへ戻る

page top