//停止撥放的特殊效果 private IEnumerator Corou_StopPlaying(AudioSourceUnit audioSourceUnit) { if (!audioSourceUnit.source.isPlaying || AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] == 2) { yield break; //若已經停止, 或是正在停止中, 則中止程序 } AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] = 2; //狀態=停止中 AudioSource source = audioSourceUnit.source; if (audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.無) //無特殊效果則直接停止 { source.Stop(); yield return(new WaitUntil(() => !audioSourceUnit.source.isPlaying)); //待音源停止 AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] = 0; //狀態=完全靜止 yield break; } float t = 0; float iniVolume = audioSourceUnit.source.volume; float iniPitch = audioSourceUnit.source.pitch; while (t < audioSourceUnit.GetFadeDuration[1] && audioSourceUnit.source.isPlaying) { if (audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音量淡化 || audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音調漸快且淡化 || audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音調漸慢且淡化) { audioSourceUnit.source.volume = iniVolume - (iniVolume * (t / audioSourceUnit.GetFadeDuration[1])); } if (audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音調漸快 || audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音調漸快且淡化) { audioSourceUnit.source.pitch = iniPitch + (((audioSourceUnit.GetFastRate + 1.0f) - iniPitch) * (t / audioSourceUnit.GetFadeDuration[1])); } if (audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音調漸慢 || audioSourceUnit.GetFadeOutEffectMode == AudioEffectMode.音調漸慢且淡化) { audioSourceUnit.source.pitch = iniPitch - ((iniPitch - (1.0f - (audioSourceUnit.GetLowerRate))) * (t / audioSourceUnit.GetFadeDuration[1])); } t += Time.deltaTime; yield return(new WaitForEndOfFrame()); } source.Stop(); yield return(new WaitUntil(() => !audioSourceUnit.source.isPlaying)); //待音源停止 AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] = 0; //狀態=完全靜止 }
//撥放音訊 private IEnumerator Corou_PlayAudioClip(List <AudioClip> clips, AudioSourceUnit audioSourceUnit, float volumeScale, bool canCover) { if (audioSourceUnit.source == null) { Debug.Log("[ERROR]空的AudioSource"); yield break; } if (audioSourceUnit.GetOutputMethod == OutputMethod.OneShot) //OneShot模式可以同時撥放複數Clip, 也不會有因為指定同個AudioSource而導致撥放衝突的問題 { if (AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] == 2) { yield break; //即使是OneShot, 若AudioSource狀態為2(停止中)則必須等完全停止才可撥放 } audioSourceUnit.source.pitch = 1.0f; //音調初始化 audioSourceUnit.source.volume = AudiosPack.Instance.initialVolumeDict[audioSourceUnit.source]; //音量初始化 for (int i = 0; i < clips.Count; i++) { audioSourceUnit.source.PlayOneShot(clips[i], volumeScale); } yield break; } if (clips.Count > 1) //Play模式不可撥放複數Clip { Debug.Log("[ERROR]不可使用複數Clip"); yield break; } if (!canCover && AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] != 0) { yield break; //音源尚未撥放完畢, 無法再度撥放 } if (canCover && AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] != 0) //覆蓋撥放 { audioSourceUnit.source.Stop(); yield return(new WaitUntil(() => AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] == 0)); } AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] = 1; //狀態=撥放中 audioSourceUnit.source.pitch = 1.0f; //音調初始化 audioSourceUnit.source.volume = AudiosPack.Instance.initialVolumeDict[audioSourceUnit.source]; //音量初始化 audioSourceUnit.source.clip = clips[0]; audioSourceUnit.source.volume = Mathf.Clamp(audioSourceUnit.source.volume * volumeScale, 0.0f, 1.0f); //音量調整 audioSourceUnit.source.Play(); float t = 0; float volumeLimit = audioSourceUnit.source.volume; //音量淡入時的目標音量 float basePitch = new float(); //音調基數 if (audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸快 || audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸快且淡化) { basePitch = 1.0f * (1.0f - audioSourceUnit.GetFastRate); } if (audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸慢 || audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸慢且淡化) { basePitch = 1.0f * (1.0f + audioSourceUnit.GetLowerRate); } while (t < audioSourceUnit.GetFadeDuration[0] && audioSourceUnit.source.isPlaying && audioSourceUnit.GetFadeInEffectMode != AudioEffectMode.無 && AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] != 2) { if (audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音量淡化 || audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸快且淡化 || audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸慢且淡化) { audioSourceUnit.source.volume = volumeLimit * (t / audioSourceUnit.GetFadeDuration[0]); } if (audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸快 || audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸快且淡化) { audioSourceUnit.source.pitch = basePitch + ((1.0f - basePitch) * (t / audioSourceUnit.GetFadeDuration[0])); } if (audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸慢 || audioSourceUnit.GetFadeInEffectMode == AudioEffectMode.音調漸慢且淡化) { audioSourceUnit.source.pitch = basePitch - ((basePitch - 1.0f) * (t / audioSourceUnit.GetFadeDuration[0])); } t += Time.deltaTime; if (t >= audioSourceUnit.GetFadeDuration[0]) //效果結束, 設定為目標值 { audioSourceUnit.source.volume = volumeLimit; audioSourceUnit.source.pitch = 1.0f; } yield return(new WaitForEndOfFrame()); } yield return(new WaitUntil(() => !audioSourceUnit.source.isPlaying)); //待音源停止 AudiosPack.Instance.audioSourceStateDict[audioSourceUnit.source] = 0; //狀態=完全停止 }