------------追記------------
5年ぶりに最新版作りました!
------------追記おわり------------
ぼくがかんがえたさいきょうのAudioManager
上記記事の続編となります。記事を書いた後に改善案を思い付いたので実装してみました。
改善内容は
■オーディオリスナーおよびオーディオソースをスクリプトから追加する。
■同時にSEを複数鳴らせるように。
■BGMをフェードではなく、すぐに停止させるメソッド追加。
です。
AudioManager.cs
それでは早速コードです。
コード説明
ではではコード説明です。
AudioSourceとAudioListener
//オーディオリスナーおよびオーディオソースをSE+1(BGMの分)作成 gameObject.AddComponent<AudioListener>(); for(int i = 0; i < SE_SOURCE_NUM + 1; i++){ gameObject.AddComponent<AudioSource>(); } //作成したオーディオソースを取得して各変数に設定、ボリュームも設定 AudioSource[] audioSourceArray = GetComponents<AudioSource> (); _seSourceList = new List<AudioSource> (); for(int i = 0; i < audioSourceArray.Length; i++){ audioSourceArray [i].playOnAwake = false; if(i == 0){ audioSourceArray [i].loop = true; _bgmSource = audioSourceArray [i]; _bgmSource.volume = PlayerPrefs.GetFloat (BGM_VOLUME_KEY, BGM_VOLUME_DEFULT); } else{ _seSourceList.Add (audioSourceArray [i]); audioSourceArray [i].volume = PlayerPrefs.GetFloat (SE_VOLUME_KEY, SE_VOLUME_DEFULT); } }
前回はAudioSourceとAudioListenerをUnity上で追加してましたが、上記の通り、スクリプトから追加するように変更しました。
SE同時再生
上記のAudioSourceを追加する際にSE用を複数個用意することで、複数のSEを同時に再生出来るようにしました。
foreach(AudioSource seSource in _seSourceList){ if(!seSource.isPlaying){ seSource.PlayOneShot (_seDic [_nextSEName] as AudioClip); return; } }
他の音を再生していないAudioSourceを探し、そのAudioSourceに再生をさせるようにしています。
BGMを停止させるメソッド追加。
public void StopBGM () { _bgmSource.Stop (); }
前回時点では何故かBGMをフェードアウトさせるメソッドしかなかったので、即座に停止させるメソッドも追加しました。
最後に
最強とは言えずとも、そこそこ使えるAudioManagerになったのでは無いでしょうか?(2回目)
こういうのこそGitHubに載せればいいのでは?と思いつつもAudioManager単体ではgit管理してないのでまぁいいかという状態です。
また改善案が思い付いたら記事にします!