Esempio n. 1
0
    //停止撥放的特殊效果
    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; //狀態=完全靜止
    }
Esempio n. 2
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; //狀態=完全停止
    }