Unity AudioSourceManager (一行代码播放指定BGM)

此脚本是继上次发布的管理脚本新增的一些内容

可以 现在可以播放长音效, 

比如BGM 创建不销毁 自动循环

短音效如 按键声音 播放完毕自动删除 等功能


第一版本连接 点击打开链接


using System.Collections;
using System.Collections.Generic;
using DevelopEngine;
using UnityEngine;

/// <summary>
/// 音频管理脚本
/// </summary>
public class AudioSourceManager : MonoBehaviour
{
    private static AudioSourceManager _instance;

    private static AudioSourceManager Instance
    {
        get { return _instance; }
    }

    private void Awake()
    {
        _instance = this;
    }

    private AudioSource audioSource;
    private List<AudioSource> audioSourceList = new List<AudioSource>();

    /// <summary>
    /// 调用测试
    /// </summary>
    private void Test()
    {
        //TODO 音频文件需要放在  Resources/Music  下方  BMG为文件名  
        PlayAudio("BGM");
    }


    /// <summary>
    /// 调整音效时更新音量
    /// </summary>
    public void UpdateAudioVal()
    {
        foreach (AudioSource val in audioSourceList)
        {
            //便利所有的Bgm ,设置音量
            if (val)
            {
                val.volume = PlayerPrefs.GetFloat("BgmVal");
            }
           
        }
    }

    /// <summary>
    /// 删除指定音效
    /// </summary>
    /// <param name="audioName">被删除的音乐</param>
    public void DeleteAudio(string audioName)
    {
        foreach (AudioSource val in audioSourceList)
        {
            if (val&& val.clip.name == audioName)
            {
                //audioSourceList.Remove(val);
                Destroy(val.gameObject);
                
            }
        }
    }

    /// <summary>
    /// 音乐暂停
    /// </summary>
    /// <param name="isStop">是否暂停</param>
    public void StopAudio(bool isStop)
    {
        foreach (AudioSource val in audioSourceList)
        {
            if (isStop && val)
            {
                val.Pause();
            }
            else if (val)
            {
                val.Play();
            }
        }

    }

    /// <summary>
    /// 判断当前音乐是否存在
    /// </summary>
    /// <param name="audioName">音乐名字</param>
    /// <returns></returns>
    public bool AudioIsTrue(string audioName)
    {
        foreach (AudioSource val in audioSourceList)
        {
            if (val && val.clip.name == audioName)
            {
                return true;
            }
       
        }
        return false;
    }


    /// <summary>
    /// 音乐播放方法
    /// </summary>
    /// <param name="name">音乐名字</param>
    /// <param name="type">1是短音效 0是背景音乐</param>
    /// <param name="DontDestroy">是否不删除</param>
    public void PlayAudio(string name, int type = 1,bool DontDestroy = false)
    {
        //创建一个空物体
        GameObject obj = new GameObject();
        if (DontDestroy)
        {
            DontDestroyOnLoad(obj);
        }
        //给空物体添加音效
        audioSource = obj.AddComponent<AudioSource>();
        //加载音效
        AudioClip au = Resources.Load<AudioClip>("Music/" + name);
        //赋值
        audioSource.clip = au;
        //如果是Bgm
        if (type == 0) 
        {
            audioSource.loop = true;
            audioSource.volume = PlayerPrefs.GetFloat("BgmVal");
            //如果是长音效 将音效添加到List里
            audioSourceList.Add(audioSource);
        }
        else
        {
            //获取音量
            audioSource.volume = PlayerPrefs.GetFloat("SoundVal");
            //如果是短音效播放完销毁自己
            StartCoroutine(RemoAudio(obj, audioSource));
        }

        //开始播放音效
        audioSource.Play();
        
    }
    /// <summary>
    /// 销毁音效
    /// </summary>
    /// <param name="obj"></param> 
    /// <param name="audioClip"></param>
    private IEnumerator RemoAudio(GameObject obj, AudioSource audioClip)
    {
        if (audioClip && obj)
        {
            yield return new WaitForSeconds(audioClip.clip.length);
            Destroy(obj);
        }
       
    }



发布了40 篇原创文章 · 获赞 36 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/yzx5452830/article/details/78733289