unity全局总的音频管理器

这篇博客介绍一个unity的总的音频管理器
可以有效避免音频错乱的问题
我们把它挂在场景中 可以使用跨场景保存的方法来实现场景跳转之后的存在
首先 这篇博客会用到我之前介绍的知识
我下面把链接先给大家贴出来
unity音频管理器(AudioMixer)
unity的代码可视化

然后就进入正题了
直接给出音频管理器的代码

public class AudioManager : MonoBehaviour
{
    //音频管理器 存储所有的音频并且可以播放和停止
    [Serializable]
    public class Sound
    {
        [Header("音频剪辑")]
        public AudioClip clip;

        [Header("音频分组")]
        public AudioMixerGroup outputGroup;

        [Header("音频音量")]
        [Range(0, 1)]
        public float volume;

        [Header("音频是否自启动")]
        public bool PlayOnAwake;

        [Header("音频是否要循环播放")]
        public bool loop;
    }

    public List<Sound> sounds;//存储所有音频的信息

    private Dictionary<string, AudioSource> audioDic;//每一个音频的名称组件

    private static AudioManager instance;

    public static AudioManager Instance { get => instance; set => instance = value; }



   
    private void Awake()
    {
        audioDic = new Dictionary<string, AudioSource>();
        instance = this;
    }
    private void Start()
    {
        foreach(var sound in sounds)
        {
            GameObject obj = new GameObject(sound.clip.name);
            obj.transform.SetParent(transform);

            AudioSource source = obj.AddComponent <AudioSource>();
            source.clip = sound.clip;
            source.volume = sound.volume;
            source.playOnAwake = sound.PlayOnAwake;
            source.loop = sound.loop;
            source.outputAudioMixerGroup = sound.outputGroup;


            if (sound.PlayOnAwake)
            {
                source.Play();
            }
            audioDic.Add(sound.clip.name, source);
        }
    }


    //播放某个音频的方法 iswait为是否等待
    public static void PlayAudio(string name,bool iswait = false)
    {
        if(!instance.audioDic.ContainsKey(name))
        {
            //不存在次音频
            Debug.LogError("不存在" + name + "音频");
            return;
        }
        if (iswait)
        {
            if(!instance.audioDic[name].isPlaying)
            {
                //如果是等待的情况 不在播放
                instance.audioDic[name].Play();
            }
        }
        else
        {
            //直接播放
            instance.audioDic[name].Play();
        }
    }


    //停止音频的播放
    public static void StopMute(string name)
    {
        
        if (!instance.audioDic.ContainsKey(name))
        {
            //不存在次音频
            Debug.LogError("不存在" + name + "音频");
            return;
        }
        else
        {
            instance.audioDic[name].Stop();

        }
    }

}

使用方法就是 通过单例 然后调用里边写的方法 实时随心所欲的播放音频

在这里插入图片描述
在这里插入图片描述
下面是两个音乐(实例化出来的)

然后就是控制全局的音频混响器的代码

public class SettingManager : MonoBehaviour
{
    [Header("音频混响器")]
    public AudioMixer mixer;//音频混响器

    public void SetBGMbolume(float Value)
    {
        //调整BGM的音量
        mixer.SetFloat("BGM", Value);

    }
}

在这里插入图片描述

如果你开发过项目 就能感觉到这个真的是好用
希望我所写的对大家有所帮助
主页有我的联系方式如果有问题 或者是合作可以联系我(知无不答)

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/107905210
今日推荐