読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

ぼくがかんがえたさいきょうのAudioManager【Unity】

Unity

このエントリーをはてなブックマークに追加

タイトルに特に意味はありません。ただAudioManagerじゃつまらんなと思って付けただけです。
すいませんすいません。

2も書きました。

AudioManagerとは

読んで字の如く、BGMやSEなどのオーディオファイルの再生や停止を管理するクラスです。
「音が鳴る物にAudioSouce付けて、全シーン毎にAudioListenerを用意して、オーディオファイルを追加する度にAudioClip付けて」ってのがめんどくさかったので、全シーン、どのスクリプトからもBGMとSEを操作出来るようにしたかったため作りました。


シングルトンとは

どこからでも呼び出せると便利で、でも2つ以上あったら変なもの。

じゃーどうすんの?って調べてると大体シングルトンっていう考え方に行き着くと思う。
シングルトンとは→Wikipedia
ようするにインスタンスを1個しか作らなければいいだけ。

上記の通りです!!!!説明がメンドクサイ
またうちのAudioManagerは、上記にあるSingletonMonoBehaviour.csを継承していますのでSingletonMonoBehaviour.cs必須となります。


AudioManager.cs

それでは早速コードです。


使い方

上記のAudioManager.csを空のゲームオブジェクトに付け、さらにそのオブジェクトにAudio Source二つAudio Listenerを付け、二つのAudio SourceをAudioManager.csのAttach〜にドラック&ドロップします。この時、Loopにチェックが付いてる方をBGMSourceにします。
Audio Sourceが二つあるのはBGMとSEでボリュームを変えたかったからです。

f:id:kan_kikuchi:20141116154045p:plain

また、このAudioManager.csを使う場合は前回紹介したAudioNameCreator.cs及びAUDIO.csを使うとさらに便利に使えます!

実際に他のスクリプトから使う時は以下のようにします。

//SE再生。AUDIO.SE_BUTTONがSEのファイル名
AudioManager.Instance.PlaySE (AUDIO.SE_BUTTON);

//BGM再生。AUDIO.BGM_BATTLEがBGMのファイル名
AudioManager.Instance.PlayBGM (AUDIO.BGM_BATTLE, AudioManager.BGM_FADE_SPEED_RATE_HIGH);

//BGMフェードアウト
AudioManager.Instance.FadeOutBGM ();

コード説明

ではではコード説明です。

DontDestroyOnLoad

DontDestroyOnLoad (this.gameObject);

上記のようにする事でこのスクリプトを付けたゲームオブジェクトはシーンを跨いでも消える事がありません

Resources.LoadAll

AudioNameCreatorの記事でも紹介しましたが、
Resources以下にあるファイルを全て取得する事が出来ます。
また、今回のようにパスを指定する事でそのパス以下の(さらに下のファルダ内も含めた)全ファイルを取得します。

_bgmDic = Resources.LoadAll("Audio/BGM");
_seDic  = Resources.LoadAll("Audio/SE");

これまた、AudioNameCreatorの記事でも紹介しましたが、
記事では分かりやすさのため、"Audio/BGM"とパスを指定しましたが、実際のコードではDATA.BGM_PATHというようにDATAというstaticクラスにパスをまとめています。
パスを直書きしない事によってミスを無くす寸法ですはい。

Dictionary< string, AudioClip >

stringが配列のキーでAudioClipが格納されているモノの型です。

foreach (AudioClip bgm in bgmList) {
  _bgmDic [bgm.name] = bgm;
}

stringをAudioClipの名前で登録する事によって、オーディオファイルの名前で再生出来るようにしています。

dic.ContainsKey(key)

そのdicという配列にkeyという名前でキーが登録されているかをbool値で返します。
以下のように登録されていない(ファイルが無い)ファイル名が指定された時はエラーを返さず、ログだけはくようにしています。

if (!_seDic.ContainsKey (seName)) {
  Debug.Log (seName + "という名前のSEがありません");
  return;
}

そもそもAudioNameCreatorを使えば存在しないファイル名を指定するという事自体無くなりますが…


Source.clip = dic [name] as AudioClip;

BGMまたはSEのオーディオソースにあらかじめ取得しておいたAudioClipをセットしています。
Inspector上で言うとAudio Clipの欄にオーディオファイルをドラック&ドロップするのと同じです。

f:id:kan_kikuchi:20141116160707p:plain

このように設定する事で、複数のAudio Clipを設定する必要が無くなります.

ChangeVolume

BGMまたはSEのオーディオソースの音量を調整します。
Volumeの値は0〜1で、スライダーを作ってそこから調節しています。
現状、iPhoneでミュージックで流している音楽を聞きながらゲームをするって方法がUnityでは分からないので、BGMだけ消せるようにしました。


最後に

最強とは言えずとも、そこそこ使えるAudioManagerになったのでは無いでしょうか?
エディタ拡張を併用すると色々と楽になりますね〜