Unity设计模式09_音效管理模块

1.思路
游戏中的声音主要分为两种:一种是背景音乐,一种是音效(频繁切换)

对于两种声音这样进行管理
背景音乐:由一个空物体上的一个AudioSource进行控制,我们只需对它进行暂停、停止、开始等操作。
音效:在游戏中,音效往往需要频繁切换,我们也用一个空物体进行控制,只不过不只用一个AudioSource,而是动态的进行增加和减少AudioSource组件,当有音效需要播放时,在空物体上增加一个AudioSource组件播放,停止时或者播放完则移除该组件,下一次播放也一样。

2.代码

public class MusicManager : SingeCaseBase<MusicManager>
{
     //BGM部分
     AudioSource BgmAudio = null;
     float BgmVolume = 1;

    //Sound音效部分
    GameObject SoundAudioHolder = null;
    List<AudioSource> SoundAudios=null;
    float SoundVolume = 1;

     public MusicManager()
    {
        //实时监测有无播放完的音效,进行销毁
        MonoManager.GetInstance().AddUpdateAction(CheckSound);
    }

    //BGM部分
    public void StartBgm(string BgmName)
    {
        //创建一个空物体挂载Bgm的AudioSource
        if(BgmAudio == null)
        {
            GameObject bgmHolder = new GameObject("bgmHolder");
            BgmAudio = bgmHolder.AddComponent<AudioSource>();
        }
           //异步加载BGM资源,并播放
            ResourcesManager.GetInstance().LoadResourceAsync<AudioClip>("Music/" + BgmName,(bgmClip)=> {
            BgmAudio.clip = bgmClip;
            BgmAudio.loop = true;
            BgmAudio.volume = BgmVolume;
            BgmAudio.Play();
        });
    }
    /// <summary>
    /// 暂停BGM
    /// </summary>
    public void PauseBgm()
    {
        if (BgmAudio != null)
        {
            BgmAudio.Pause();
        }
    }
    /// <summary>
    /// 停止BGM
    /// </summary>
    public void StopBgm()
    {
        if (BgmAudio != null)
        {
            BgmAudio.Stop();
        }
    }
    /// <summary>
    /// 调整BGM音量大小
    /// </summary>
    /// <param name="v"></param>
    public void ChangeBgmVolume(float v)
    {
        if (BgmAudio == null)
            return;
        BgmVolume = v;
        BgmAudio.volume = v;
    }
    /// <summary>
    /// 播放音效
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public AudioSource StartSound(string name)
    {
        if(SoundAudioHolder == null)
        {
            SoundAudioHolder = new GameObject("SoundAudioHolder");
            SoundAudios = new List<AudioSource>();
        }
        AudioSource source = SoundAudioHolder.AddComponent<AudioSource>();
        ResourcesManager.GetInstance().LoadResourceAsync<AudioClip>("Clips/" + name, (clip) =>
        {
            source.clip = clip;
            source.loop = false;
            source.volume = SoundVolume;
            source.Play();
            SoundAudios.Add(source);
        });
        return source;
    }
    /// <summary>
    /// 停止音效
    /// </summary>
    /// <param name="source"></param>
    public void StopSound(AudioSource source)
    {
        if(SoundAudios.Contains(source))
        {
            source.Stop();
            SoundAudios.Remove(source);
            GameObject.Destroy(source);
        }
    }
    /// <summary>
    /// 改变音效音量
    /// </summary>
    /// <param name="v"></param>
    public void ChangeSoundVolum(float v)
    {
        if (SoundAudios != null && SoundAudios.Count >= 0)
        {
            SoundVolume = v;
            foreach (AudioSource source in SoundAudios)
            {
                source.volume = SoundVolume;
            }
        }
    }
    /// <summary>
    /// 检测有无播放完的音效组件并销毁
    /// </summary>
    public void CheckSound()
    {
        if(SoundAudios!=null&&SoundAudios.Count > 0)
        { 
          for(int i = SoundAudios.Count-1; i >= 0;i--)
          {
              if (!SoundAudios[i].isPlaying)
              {
                  AudioSource term = SoundAudios[i];
                  SoundAudios.Remove(SoundAudios[i]);
                  GameObject.Destroy(term);
              }
          }
        }
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值