Unity音效播放管理

1.主摄像头上挂载几个AudioSource 

  这个可以根据需要挂载不同的个数,做一个池子 

2.代码编写

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

/// <summary>
/// 音效类型枚举
/// </summary>
public enum SoundType
{
    SoundTyp_click,//按钮点击
}

public class AudioController : Singleton<AudioController>,IController
{
    // 背景音乐播放器
    private AudioSource backMusicAudioSource;
    // 音效播放器
    private List<AudioSource> soundAudioSources =  new List<AudioSource>();

    private Dictionary<string, AudioClip> audioDic;
    
    static private string soundKey = "soundKey";
    
    static private string musicKey = "musicKey";
    
    // //音效是否静音
    public bool soundMute
    {
        get
        {
            string sound = PlayerPrefs.GetString(soundKey);
            return sound.Equals("true"); 
        }

        set
        {
            PlayerPrefs.SetString(soundKey,value ? "true" : "false");
            PlayerPrefs.Save();
        }
    }

    private bool startFadeInBgMusic = false;
    private bool startFadeOutBgMusic = false;
    private float timer = 0;
    
    //背景音乐是否静音
    public bool musicMute
    {
        get
        {
            string sound = PlayerPrefs.GetString(musicKey);
            return sound.Equals("true"); 
        }

        set
        {
            PlayerPrefs.SetString(musicKey,value ? "true" : "false");
            PlayerPrefs.Save();
            timer = 0;
            startFadeInBgMusic = value;
            startFadeOutBgMusic = !value;
            if (!value)
            {
                backMusicAudioSource.mute = false;
            }
        }
   
    }

    // 把播放器重新分类
   public void Init()
   {
       audioDic = new Dictionary<string, AudioClip>();
       AudioSource[] audioSources = Camera.main.GetComponents<AudioSource>();
       if (audioSources.Length > 0)
       {
           backMusicAudioSource = audioSources[0];
           backMusicAudioSource.loop = true;
           backMusicAudioSource.mute = musicMute;
           //背景音乐
           // AssetLoader.LoadAddressableAsync<AudioClip>("december_raining", handle =>
           // {
           //     backMusicAudioSource.clip = handle.Result;
           // });
           for (int i = 1; i < audioSources.Length; i++)
           {
               audioSources[i].loop = false;
               soundAudioSources.Add(audioSources[i]);
           }
       }
   }
    
    
    private AudioSource getFreeAudioSource()
    {
        AudioSource audioSource = null;
        for (int i = 0; i < soundAudioSources.Count; i++)
        {
            AudioSource tmpAudioSource = soundAudioSources[i];
            if (!tmpAudioSource.isPlaying)
            {
                audioSource = tmpAudioSource;
                break;
            }
        }
        return audioSource;
    }
    

    public void Update()
    {
        if (startFadeInBgMusic)
        {
            timer += Time.deltaTime;
            float p = Mathf.Clamp01(timer / 2f) ;
            backMusicAudioSource.volume = 1 - p;
            if (timer > 2f)
            {
                startFadeInBgMusic = false;
                timer = 0;
                backMusicAudioSource.mute = true;
            }
        }

        if (startFadeOutBgMusic)
        {
            timer += Time.deltaTime;
            float p = Mathf.Clamp01(timer / 2f) ;
            backMusicAudioSource.volume = p;
            if (timer > 2f)
            {
                startFadeOutBgMusic = false;
                timer = 0;
            }
        }
    }
    
    /// <summary>
    /// 播放和停止背景音乐
    /// </summary>
    /// <param name="isPlay"></param>
    public void playBackMusic(bool isPlay)
    {
        if (isPlay)
        {
            if (!backMusicAudioSource.isPlaying)
            {
                backMusicAudioSource.Play();
            }
           
        }
        else
        {
            if (backMusicAudioSource.isPlaying)
            {
                backMusicAudioSource.Stop();
            }
        }
    }

    /// <summary>
    /// 播放音效
    /// </summary>
    /// <param name="type"></param>
    public void playSound(SoundType type)
    {

        if (!soundMute)
        {
            string soundFileName = "click";
            switch (type)
            {
                case SoundType.SoundTyp_click :
                    soundFileName = "click";
                    break;
            }

            if (audioDic.TryGetValue(soundFileName, out AudioClip ac))
            {
                AudioSource audioSource = getFreeAudioSource();
                if (audioSource != null)
                {
                    audioSource.clip = ac;
                    audioSource.Play(); 
                }
                return;
            }
            
            AssetLoader.LoadAddressableAsync<AudioClip>(soundFileName, handle =>
            {
                AudioSource audioSource = getFreeAudioSource();
                if (audioSource != null)
                {
                    audioSource.clip = handle.Result;
                    audioSource.Play();
                    audioDic[soundFileName] = handle.Result;
                }
            });
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值