/// <summary> /// /// </summary> void Update() { for (int j = 0; j < fadeInOut.Count; ++j) { soundAudioInfo soundInfo = fadeInOut[j]; if (soundInfo.fadeCheck) { soundInfo.initailTime += Time.deltaTime; AudioSource tempAudioSouce = null; //! 尋找audioSource if (bgmAudios.ContainsKey(soundInfo.name)) { tempAudioSouce = bgmAudios[soundInfo.name]; } else { for (int i = 0; i < soundAudios.Count; i++) { if (soundInfo.audioClip.name == soundAudios[i].clip.name) { soundAudios[i].volume = (soundInfo.initailTime / soundInfo.fadeTime) * soundInfo.audioVolume; tempAudioSouce = soundAudios[i]; break; } } } //! 取失敗 if (tempAudioSouce == null) { Debug.LogError(" Fade Sound Fail"); return; } //! 淡入 if (soundInfo.inOrOut) { tempAudioSouce.volume = (soundInfo.initailTime / soundInfo.fadeTime) * soundInfo.audioVolume; } //! 淡出 else { tempAudioSouce.volume = soundInfo.audioVolume - (soundInfo.initailTime / soundInfo.fadeTime) * soundInfo.audioVolume; } //! 結束 if (soundInfo.initailTime >= soundInfo.fadeTime) { //! 淡出停止 if (!soundInfo.inOrOut) { tempAudioSouce.Stop(); } soundInfo.fadeCheck = false; fadeInOut.Remove(soundInfo); } } } }
/// <summary> /// Load跨場景BGM /// 目前assetbundle有一個bug,audioclip如果放在場景中,有被don't destroy on load /// 的物件參考到,在第2次進都同樣場景時,場景結束會把audioclip實體刪除,導致error, /// 所以跨場景BGM改用resource load. /// </summary> void LoadAudioClipFromResource() { for (int i = 0; i < loadFromResourcedAudioInfos.Count; i++) { string audioName = loadFromResourcedAudioInfos[i].name; string groupName = loadFromResourcedAudioInfos[i].group; if (SoundMgr.Singleton.IsBgmExist(audioName)) { continue; } AudioClip audioClip = Resources.Load <AudioClip>(loadFromResourcedAudioInfos[i].resourcePath); if (audioClip != null) { soundAudioInfo audioInfo = new soundAudioInfo(); audioInfo.name = audioName; audioInfo.group = groupName; audioInfo.audioClip = audioClip; soundAudioInfos.Add(audioInfo); } } }
/// <summary> /// 聲音淡入 /// </summary> /// <param name="time">淡入時間</param> /// <param name="name">音效名子</param> /// <param name="valueVolume">最終音量</param> /// <param name="loop">背景音樂LOOP</param> public void FadeIn(float time, string name, float valueVolume = 1.0f, bool loop = true) { //!如果在字典裏面 if (audioDic.ContainsKey(name)) { soundAudioInfo tempAudioSource = audioDic[name]; tempAudioSource.inOrOut = true; tempAudioSource.fadeCheck = true; //! 結束音量 tempAudioSource.audioVolume = valueVolume; //! 淡入時間 tempAudioSource.fadeTime = time; //! 起始值 tempAudioSource.initailTime = 0.0f; //! 播放音樂 if (bgmAudios.ContainsKey(name)) { if (!bgmAudios[name].isPlaying) { PlayBGM(name, loop); } } else if (!bgmAudios.ContainsKey(name)) { PlayBGM(name, loop); } else { bool check = false; for (int i = 0; i < soundAudios.Count; i++) { if (audioDic[name].audioClip.name == soundAudios[i].clip.name) { if (!soundAudios[i].isPlaying) { PlaySound(audioDic[name].audioClip.name); } check = true; break; } } if (!check) { PlaySound(audioDic[name].audioClip.name); } } //! 加入淡入淡出 fadeInOut.Add(audioDic[name]); } else { Debug.LogWarning("cant find audio by name => " + name); } }
/// <summary> /// 抽卡測試規格使用 /// </summary> /// <param name="soundAudioInfos"></param> public void DeleteAudioSourceByRootScene(soundAudioInfo soundAudioInfos) { if (audioDic.ContainsKey(soundAudioInfos.name)) { audioDic.Remove(soundAudioInfos.name); } else { Debug.LogError("No Key in the dictionary !! : " + soundAudioInfos.name); } }
/// <summary> /// other Scene one audio regist /// </summary> /// <param name="soundAudioInfos"></param> public void RegisterAudioSourceByRootScene(soundAudioInfo soundAudioInfos) { if ((soundAudioInfos.name == "") && (soundAudioInfos.audioClip != null)) { soundAudioInfos.name = soundAudioInfos.audioClip.name; } if (!audioDic.ContainsKey(soundAudioInfos.name)) { audioDic[soundAudioInfos.name] = soundAudioInfos; } else { Debug.LogError("Same Key in dictionary !! : " + soundAudioInfos.name); } }