Unity 音頻管理器SoundManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
[LuaCallCSharp]
public class SoundManager : MonoBehaviour
{
    private float bgmVolumScale = 1f; //背景音樂聲音大小比例
    private float effVolumScale = 0.5f; //音效聲音大小比例
    public List<AudioSource> audioSourceList = new List<AudioSource>();  //音效播放器
    private AudioSource musicAudio;   //背景音樂播放器
    GameObject thisObj;
    Transform thisTrans;
    // Start is called before the first frame update
    public static SoundManager Init()
    {
        GameObject obj = new GameObject("SoundManager");
        SoundManager soundManager = obj.AddComponent<SoundManager>();
        obj.AddComponent<AudioListener>();
        return soundManager;
    }
    private void Awake()
    {
        thisObj = gameObject;
        thisTrans = transform;
        //存儲關閉時的音量比例
        if (PlayerPrefs.HasKey("bgmVolumScale"))
            bgmVolumScale = PlayerPrefs.GetFloat("bgmVolumScale");
        if (PlayerPrefs.HasKey("effVolumScale"))
            effVolumScale = PlayerPrefs.GetFloat("effVolumScale");

        musicAudio = gameObject.AddComponent<AudioSource>();
        musicAudio.playOnAwake = false;
        musicAudio.loop = true;
        musicAudio.volume = bgmVolumScale;
        //FadeVolumeScale = FadeVolume / FadeDistance;
        InitAudioSources();
        DontDestroyOnLoad(gameObject);
    }
    //增加as組件播放器
    void InitAudioSources()
    {
        for (int i = 0; i < 20; i++)
        {
            GameObject obj = new GameObject("AudioSource" + (i + 1));
            obj.transform.SetParent(thisTrans);
            AudioSource audio = obj.AddComponent<AudioSource>();
            audio.playOnAwake = false;
            audio.loop = false;
            audioSourceList.Add(audio);
        }
    }
    //解暫停
    public void UnPause()
    {
        musicAudio.UnPause();
        foreach (var item in audioSourceList)
            item.UnPause();
    }
    //暫停所有聲音
    public void Pause()
    {
        musicAudio.Pause();
        foreach (var item in audioSourceList)
            item.Pause();
    }
    //停止所有聲音
    public void Stop()
    {
        musicAudio.Stop();
        foreach (var item in audioSourceList)
            item.Stop();
    }
    //設置靜音
    public void SetMute(bool isMute)
    {
        musicAudio.mute = isMute;
        for (int i = 0, imax = audioSourceList.Count; i < imax; i++)
        {
            audioSourceList[i].mute = isMute;
        }
    }
    /// <summary>
    /// set the bgm scale [0,1]
    /// </summary>
    /// <param name="scale"></param>
    public void SetBGMVolumScale(float scale)
    {
        bgmVolumScale = scale;
        musicAudio.volume = bgmVolumScale;
        PlayerPrefs.SetFloat("bgmVolumScale", bgmVolumScale);
    }
    /// <summary>
    /// set the soundeff scale [0,1]
    /// </summary>
    /// <param name="scale"></param>
    public void SetEFFVolumScale(float scale)
    {
        effVolumScale = scale;
        PlayerPrefs.SetFloat("effVolumScale", effVolumScale);
    }
    //獲取背景音樂音量0-1
    public float GetBGMVolumScale()
    {
        return bgmVolumScale;
    }

    //獲取音效音量0-1
    public float GetEFFVolumScale()
    {
        return effVolumScale;
    }

    //播放背景音樂
    public void PlayMusic(string music, bool isLoop = false)
    {
        if (IsPlayMusic(music))
            return;
        AudioClip clip = GetClipByName(music);
        PlayMusic(clip);
    }

    public void StopMusic()
    {
        musicAudio.Stop();
    }
    //是否正在播放music
    private bool IsPlayMusic(string music)
    {
        if (musicAudio.isPlaying)
        {
            return musicAudio.clip.name == music;
        }

        return false;
    }

    //是否正在播放音效
    public bool IsPlaySoundEff(string eff)
    {
        for (int i = 0; i < audioSourceList.Count; i++)
        {
            var audio = audioSourceList[i];
            if (audio.isPlaying && audio.clip.name == eff)
                return true;
        }
        return false;
    }

    //播放背景音樂
    private void PlayMusic(AudioClip clip)
    {
        musicAudio.loop = true;
        musicAudio.clip = clip;
        musicAudio.Play();
    }

    //播放2d音效  eff  loop 是否循環
    public void PlaySoundEff2D(string eff, bool loop = false)
    {
        AudioClip clip = GetClipByName(eff);
        PlaySoundEff2D(clip, loop);
    }

    //播放2d音效  clip  loop 是否循環
    private void PlaySoundEff2D(AudioClip clip, bool loop = false)
    {
        if (clip == null)
            return;
        AudioSource audioSrc = GetCurrentAudioSource();
        audioSrc.loop = loop;
        audioSrc.clip = clip;
        audioSrc.volume = effVolumScale;
        audioSrc.Play();
    }

    public void StopAllSoudEff()
    {
        foreach (var item in audioSourceList)
        {
            item.Stop();
        }
    }

    public void PlayMusicEx(string asset)
    {
  
        AudioClip clip = GetClipByName(asset);
        PlayMusic(clip);
    }

    public void PlaySoundEff2DEx(string asset, bool loop = false)
    {
        AudioClip clip = GetClipByName(asset);
        PlaySoundEff2D(clip, loop);
    }

    public void StopSoundEffEx(string asset)
    {
        int posLeft = asset.LastIndexOf('/');
        int posRight = asset.LastIndexOf('.');
        string name = asset.Substring(posLeft + 1, posRight - posLeft - 1);

        foreach (var item in audioSourceList)
        {
            if (item.isPlaying && item.clip.name == name)
            {
                item.Stop();
            }
        }
    }

    //停止某音效
    public void StopSoundEff(string eff)
    {
        foreach (var item in audioSourceList)
        {
            if (item.isPlaying && item.clip.name == eff)
            {
                item.Stop();
            }
        }
    }

    //停止某音效
    private void StopSoundEff(AudioClip clip)
    {
        StopSoundEff(clip.name);
    }

    //獲取當前可用播放器
    private AudioSource GetCurrentAudioSource()
    {
        AudioSource audioSrc = null;
        for (int i = 0, imax = audioSourceList.Count; i < imax; i++)
        {
            if (audioSourceList[i].isPlaying == false)
            {
                audioSrc = audioSourceList[i];
            }
        }
        if (audioSrc == null)
        {
            audioSrc = audioSourceList[0];
        }

        return audioSrc;
    }
    public AudioClip GetClipByName(string name)
    {
        return GameEntry.ResManager.GetAudioClip(name);
    }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章