Unity3d声音管理器AudioManager

播放背景音乐、播放提示音、播放音效。成组播放、声音源复用、音量控制、音效播放位置等等。

写差不多了,发现不是自己想要的风格。没完善呢就过时的感觉。先放着吧。。。

#if UNITY_EDITOR
//#define Sirenix_OdinInspector
#endif

#if Sirenix_OdinInspector
using Sirenix.OdinInspector;
#endif
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;

/// <summary>
/// 声音管理器
/// (目前不保证稳定,出现问题可尝试"try{}catch{AudioManager.ForceReset();}")
/// </summary>
public class AudioManager :

#if Sirenix_OdinInspector
    SerializedMonoBehaviour
#else
    MonoBehaviour
#endif
{
    public static AudioManager Instance
    {
        get
        {
            CreatAudioManager();
            return instance;
        }
    }
#if Sirenix_OdinInspector
#elif UNITY_EDITOR
    [Header("注意!不要在面板上修改任何值!面板仅为方便观察"),Space(10)]
#endif
    public const int ID_WHEN_NULL = -1;

    #region 设置项
    /// <summary>
    /// 读取默认配置
    /// </summary>
    private void LoadConfig()
    {
        MuteSound = PlayerPrefs.GetInt("MuteSound") > 0 ? true : false;
        SoundVolume = PlayerPrefs.GetFloat("SoundVolume");
        MuteMusic = PlayerPrefs.GetInt("MuteMusic") > 0 ? true : false;
        MusicVolume = PlayerPrefs.GetFloat("MuteSound");
    }
    private void SaveConfig()
    {
        PlayerPrefs.SetInt("MuteSound", MuteSound ? 1 : 0);
        PlayerPrefs.SetFloat("SoundVolume", SoundVolume);
        PlayerPrefs.SetInt("MuteSound", MuteMusic ? 1 : 0);
        PlayerPrefs.SetFloat("MuteSound", MusicVolume);
        PlayerPrefs.Save();
    }
    /// <summary>
    /// 音效静音
    /// </summary>
    public bool MuteSound
    {
        get
        {
            return muteSound;
        }

        set
        {
            if (muteSound == value)
                return;
            needSave = true;
            saveTime = 0;
            muteSound = value;
            if (!muteSound)
                return;
            for (int i = 0; i < playingAudio.Count; i++)
            {
                if (playingAudio != null
                    && !playingAudio[i].IsMusic)
                {
                    playingAudio[i].Stop(0, true);
                }
            }
        }
    }
    /// <summary>
    /// 音效音量
    /// </summary>
    public float SoundVolume
    {
        get
        {
            return soundVolume;
        }

        set
        {
            if (soundVolume == value)
                return;
            needSave = true;
            saveTime = 0;
            soundVolume = value;
        }
    }
    /// <summary>
    /// 背景音乐静音
    /// </summary>
    public bool MuteMusic
    {
        get
        {
            return muteMusic;
        }

        set
        {
            if (muteMusic == value)
                return;
            needSave = true;
            saveTime = 0;
            muteMusic = value;
            if (!muteMusic)
                return;
            for (int i = 0; i < playingAudio.Count; i++)
            {
                if (playingAudio != null
                    && playingAudio[i].IsMusic)
                {
                    playingAudio[i].Stop(2, false);
                }
            }
        }
    }
    /// <summary>
    /// 背景音乐声音大小
    /// </summary>
    public float MusicVolume
    {
        get
        {
            return musicVolume;
        }

        set
        {
            if (musicVolume == value)
                return;
            needSave = true;
            saveTime = 0;
            musicVolume = value;
        }
    }
    #endregion 设置项

    #region 全局工具
    public void Init()
    {
        idPointer = 0;
        AudioControllerDic.Clear();
        LoadConfig();
        OnInit();
        //PerLoad();
    }
    /// <summary>
    /// 重置
    /// </summary>
    public void ForceReset()
    {
        while (sourceCachePool.Count > 0)
        {
            sourceCachePool.Dequeue().Release();
        }
        playingMusic = null;
        playingBGSound = null;
        for (int i = 0; i < playingAudio.Count; i++)
        {
            if (playingAudio[i] != null)
                playingAudio[i].Release();
        }
        playingAudio.Clear();
        audioClipPool.Clear();

        poolTotalCount = 0;
        audioTotalCount = 0;
        recordTimes = 0;
        lastRecordTime = 0;
        Init();
    }
    /// <summary>
    /// 停止所有声音
    /// </summary>
    public void StopAll()
    {
        for (int i = 0; i < playingAudio.Count; i++)
        {
            if (playingAudio[i] != null)
            {
                playingAudio[i].Stop(1, false);
            }
        }
    }
    /// <summary>
    /// 让某声音控制器停止播放
    /// </summary>
    /// <param name="id">声音控制器ID</param>
    /// <param name="transitionTime">过渡时间</param>
    /// <param name="waitFinished">是否等待播放完成</param>
    public void StopAudio(int id, float transitionTime = 0, bool waitFinished = false)
    {
        if (id == ID_WHEN_NULL)
            return;
        if (!AudioControllerDic.ContainsKey(id))
            return;
        if (AudioControllerDic[id] == null)
            return;
        AudioControllerDic[id].Stop(transitionTime, waitFinished);
    }
    #endregion 全局工具

    #region 背景音乐相关接口
    /// <summary>
    /// 播放背景音乐
    /// </summary>
    /// <param name="clipName">音频文件名</param>
    /// <param name="transitionTime">过渡时间</param>
    /// <returns>声音控制器ID</returns>
    public int PlayBackGroundMusic(string clipName, float transitionTime = 1)
    {
        if (MuteMusic)
            return ID_WHEN_NULL;

        if (clipName == null)
            return ID_WHEN_NULL;

        if (IsPlayingBGM(clipName))
            return playingMusic.ID;

        if (transitionTime < 0)
            transitionTime = 0;

        if (playingMusic != null)
            playingMusic.Stop(transitionTime, false);

        playingMusic = GetController();
        playingMusic.SetMusic(transitionTime, false, true, GetClip(clipName));
        return playingMusic.ID;
    }
    /// <summary>
    /// 是否正在播放
    /// </summary>
    /// <returns></returns>
    public bool IsPlayingBGM()
    {
        if (MuteMusic)
            return false;
        if (playingMusic == null)
            return false;
        return playingMusic.IsPlaying();
    }
    /// <summary>
    /// 是否正在播放背景音乐
    /// </summary>
    /// <returns></returns>
    public bool IsPlayingBGM(string clipName)
    {
        if (MuteMusic)
            return false;
        if (playingMusic == null)
            return false;
        return playingMusic.IsPlaying(clipName);
    }
    /// <summary>
    /// 停止播放
    /// </summary>
    /// <param name="waitEnd">是否等待播放完成再停止</param>
    public void StopBGM(bool waitEnd = false)
    {
        if (playingMusic == null)
            return;
        playingMusic.Stop(2, waitEnd);
    }
    /// <summary>
    /// 得到当前正在播放的背景音乐
    /// </summary>
    /// <returns></returns>
    public string GetCurrBGM()
    {
        if (MuteMusic)
            return null;
        if (playingMusic == null)
            return null;
        if (!playingMusic.IsPlaying())
            return null;
        if (playingMusic.audioClips == null)
            return null;
        if (playingMusic.CurrIdex >= playingMusic.audioClips.Length)
            return playingMusic.audioClips[0].name;
        return playingMusic.audioClips[playingMusic.CurrIdex].name;
    }

    /// <summary>
    /// 加入背景音乐播放队列
    /// </summary>
    /// &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值