(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

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


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


------------追記------------

5年ぶりに最新版作りました!



------------追記おわり------------

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

上記記事の続編となります。記事を書いた後に改善案を思い付いたので実装してみました。
改善内容は
■オーディオリスナーおよびオーディオソースをスクリプトから追加する。
■同時にSEを複数鳴らせるように。
■BGMをフェードではなく、すぐに停止させるメソッド追加。
です。

AudioManager.cs

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


使い方

前回とは違い、上記の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管理してないのでまぁいいかという状態です。
また改善案が思い付いたら記事にします!