zoukankan      html  css  js  c++  java
  • 04、Unity_声音管理器

    1、分享一个Unity中用于管理声音的声音管理器,适合于中小型项目。

    2、借鉴了很多的源码,最后修改完成,吸取百家之长,改为自己所用。

    3、源码如下:

      1 /*
      2  * 
      3  *  开发时间:2018.11.20
      4  * 
      5  *  功能:用来对项目中的所有音频做同一的管理
      6  *  
      7  *  描述:
      8  *      1、挂载该脚本的游戏物体上要挂载三个AudioSouce[可以修改脚本,动态挂]
      9  *      2、建议大的背景音乐不要加入AudioClip[],对内存消耗大。而是哪里用到,单独使用PlayBackground函数播放
     10  *      3、小的音效片段可以将其加入AudioClip[]中,可以很方便的管理,可以通过声音剪辑、声音剪辑名称来进行音乐的播放
     11  *      4、该声音管理可以进行背景音乐的播放、音效的播放、背景音乐的音调改变、音效的音调改变、停止播放
     12  *      
     13  */
     14 using UnityEngine;
     15 using System.Collections;
     16 using System.Collections.Generic;
     17 
     18 namespace Kernal
     19 {
     20     public class AudioManager : MonoBehaviour
     21     {
     22         public AudioClip[] AudioClipArray;                               //剪辑数组
     23 
     24         public static float AudioBackgroundVolumns = 1F;                 //背景音量
     25         public static float AudioEffectVolumns = 1F;                     //音效音量
     26         public static float AudioBackgroundPitch = 1f;                   //背景音乐的音调
     27         public static float AudioEffectPitch = 1.0f;                     //音效的音调
     28 
     29 
     30         private static Dictionary<string, AudioClip> _DicAudioClipLib;   //音频库,将声音名字和声音资源进行关联
     31 
     32         private static AudioSource[] _AudioSourceArray;                  //音频源数组
     33 
     34         private static AudioSource _AudioSource_BackgroundAudio;         //背景音乐
     35         private static AudioSource _AudioSource_AudioEffectA;            //音效源A
     36         private static AudioSource _AudioSource_AudioEffectB;            //音效源B
     37         //......可以按需求进行添加
     38 
     39         /// <summary>
     40         /// 音效库资源加载
     41         /// </summary>
     42         void Awake()
     43         {
     44             //音频库加载[初始化,将音乐剪辑和名字联系起来]
     45             _DicAudioClipLib = new Dictionary<string, AudioClip>();
     46 
     47             foreach (AudioClip audioClip in AudioClipArray)
     48             {
     49                 _DicAudioClipLib.Add(audioClip.name, audioClip);
     50             }
     51 
     52 
     53             //处理音频源,也就是得到用来播放声音的音乐播放器
     54             _AudioSourceArray = this.GetComponents<AudioSource>();
     55             _AudioSource_BackgroundAudio = _AudioSourceArray[0];               //其中一个用来播放背景音乐
     56             _AudioSource_AudioEffectA = _AudioSourceArray[1];                  //其中一个用来播放音乐1
     57             _AudioSource_AudioEffectB = _AudioSourceArray[2];
     58 
     59 
     60             //从数据持久化中得到音量数值
     61             if (PlayerPrefs.GetFloat("AudioBackgroundVolumns") >= 0)
     62             {
     63                 AudioBackgroundVolumns = PlayerPrefs.GetFloat("AudioBackgroundVolumns");
     64                 _AudioSource_BackgroundAudio.volume = AudioBackgroundVolumns;
     65             }
     66 
     67             if (PlayerPrefs.GetFloat("AudioEffectVolumns") >= 0)
     68             {
     69                 AudioEffectVolumns = PlayerPrefs.GetFloat("AudioEffectVolumns");
     70                 _AudioSource_AudioEffectA.volume = AudioEffectVolumns;
     71                 _AudioSource_AudioEffectB.volume = AudioEffectVolumns;
     72             }
     73 
     74             //设置音乐的音效
     75             if (PlayerPrefs.HasKey("AudioBackgroundPitch"))
     76             {
     77                 AudioBackgroundPitch = PlayerPrefs.GetFloat("AudioBackgroundPitch");
     78             }
     79             if (PlayerPrefs.HasKey("AudioEffectPitch"))
     80             {
     81                 AudioEffectPitch = PlayerPrefs.GetFloat("AudioEffectPitch");
     82             }
     83 
     84             _AudioSource_BackgroundAudio.pitch = AudioBackgroundPitch;
     85             _AudioSource_AudioEffectA.pitch = AudioEffectPitch;
     86             _AudioSource_AudioEffectB.pitch = AudioEffectPitch;
     87 
     88         }
     89 
     90         /// <summary>
     91         /// 播放背景音乐
     92         /// 传入的参数是背景音乐的AudioClip
     93         /// </summary>
     94         /// <param name="audioClip">音频剪辑</param>
     95         public static void PlayBackground(AudioClip audioClip)
     96         {
     97             //防止背景音乐的重复播放。
     98             if (_AudioSource_BackgroundAudio.clip == audioClip)
     99             {
    100                 return;
    101             }
    102 
    103             //处理全局背景音乐音量
    104             _AudioSource_BackgroundAudio.volume = AudioBackgroundVolumns;
    105             _AudioSource_BackgroundAudio.pitch = AudioBackgroundPitch;
    106             if (audioClip)
    107             {
    108                 _AudioSource_BackgroundAudio.loop = true;                      //背景音乐是循环播放的
    109                 _AudioSource_BackgroundAudio.clip = audioClip;
    110                 _AudioSource_BackgroundAudio.Play();
    111             }
    112             else
    113             {
    114                 Debug.LogWarning("[AudioManager.cs/PlayBackground()] audioClip==null !");
    115             }
    116         }
    117 
    118         /// <summary>
    119         /// 播放背景音乐
    120         /// 传入的参数是声音片段的名字,要注意,其声音片段要加入声音数组中
    121         /// </summary>
    122         /// <param name="strAudioName"></param>
    123         public static void PlayBackground(string strAudioName)
    124         {
    125             if (!string.IsNullOrEmpty(strAudioName))
    126             {
    127                 PlayBackground(_DicAudioClipLib[strAudioName]);
    128             }
    129             else
    130             {
    131                 Debug.LogWarning("[AudioManager.cs/PlayBackground()] strAudioName==null !");
    132             }
    133         }
    134 
    135         /// <summary>
    136         /// 播放音效_音频源A
    137         /// </summary>
    138         /// <param name="audioClip">音频剪辑</param>
    139         public static void PlayAudioEffectA(AudioClip audioClip)
    140         {
    141             //处理全局音效音量
    142             _AudioSource_AudioEffectA.volume = AudioEffectVolumns;
    143             _AudioSource_AudioEffectA.pitch = AudioEffectPitch;
    144 
    145             if (audioClip)
    146             {
    147                 _AudioSource_AudioEffectA.clip = audioClip;
    148                 _AudioSource_AudioEffectA.Play();
    149             }
    150             else
    151             {
    152                 Debug.LogWarning("[AudioManager.cs/PlayAudioEffectA()] audioClip==null ! Please Check! ");
    153             }
    154         }
    155         /// <summary>
    156         /// 播放音效_音频源A
    157         /// </summary>
    158         /// <param name="strAudioEffctName">音效名称</param>
    159         public static void PlayAudioEffectA(string strAudioEffctName)
    160         {
    161             if (!string.IsNullOrEmpty(strAudioEffctName))
    162             {
    163                 PlayAudioEffectA(_DicAudioClipLib[strAudioEffctName]);
    164             }
    165             else
    166             {
    167                 Debug.LogWarning("[AudioManager.cs/PlayAudioEffectA()] strAudioEffctName==null ! Please Check! ");
    168             }
    169         }
    170         /// <summary>
    171         /// 播放音效_音频源B
    172         /// </summary>
    173         /// <param name="audioClip">音频剪辑</param>
    174         public static void PlayAudioEffectB(AudioClip audioClip)
    175         {
    176             //处理全局音效音量
    177             _AudioSource_AudioEffectB.volume = AudioEffectVolumns;
    178             _AudioSource_AudioEffectB.pitch = AudioEffectPitch;
    179             if (audioClip)
    180             {
    181                 _AudioSource_AudioEffectB.clip = audioClip;
    182                 _AudioSource_AudioEffectB.Play();
    183             }
    184             else
    185             {
    186                 Debug.LogWarning("[AudioManager.cs/PlayAudioEffectB()] audioClip==null ! Please Check! ");
    187             }
    188         }
    189 
    190         /// <summary>
    191         /// 播放音效_音频源B
    192         /// </summary>
    193         /// <param name="strAudioEffctName">音效名称</param>
    194         public static void PlayAudioEffectB(string strAudioEffctName)
    195         {
    196             if (!string.IsNullOrEmpty(strAudioEffctName))
    197             {
    198                 PlayAudioEffectB(_DicAudioClipLib[strAudioEffctName]);
    199             }
    200             else
    201             {
    202                 Debug.LogWarning("[AudioManager.cs/PlayAudioEffectB()] strAudioEffctName==null ! Please Check! ");
    203             }
    204         }
    205 
    206 
    207         /// <summary>
    208         /// 停止播放音效A
    209         /// </summary>
    210         public static void StopPlayAudioEffectA()
    211         {
    212             _AudioSource_AudioEffectA.Stop();
    213         }
    214 
    215         /// <summary>
    216         /// 停止播放音效B
    217         /// </summary>
    218         public static void StopPlayAudioEffectB()
    219         {
    220             _AudioSource_AudioEffectB.Stop();
    221         }
    222 
    223         /// <summary>
    224         /// 停止播放背景音乐
    225         /// </summary>
    226         public static void StopPlayAudioBackGround()
    227         {
    228             _AudioSource_BackgroundAudio.Stop();
    229         }
    230 
    231         /// <summary>
    232         /// 改变背景音乐音量
    233         /// </summary>
    234         /// <param name="floAudioBGVolumns"></param>
    235         public static void SetAudioBackgroundVolumns(float floAudioBGVolumns)
    236         {
    237             _AudioSource_BackgroundAudio.volume = floAudioBGVolumns;
    238             AudioBackgroundVolumns = floAudioBGVolumns;
    239             //数据持久化
    240             PlayerPrefs.SetFloat("AudioBackgroundVolumns", floAudioBGVolumns);
    241         }
    242 
    243 
    244         /// <summary>
    245         /// 改变音效音量
    246         /// </summary>
    247         /// <param name="floAudioEffectVolumns"></param>
    248         public static void SetAudioEffectVolumns(float floAudioEffectVolumns)
    249         {
    250             _AudioSource_AudioEffectA.volume = floAudioEffectVolumns;
    251             _AudioSource_AudioEffectB.volume = floAudioEffectVolumns;
    252             AudioEffectVolumns = floAudioEffectVolumns;
    253             //数据持久化
    254             PlayerPrefs.SetFloat("AudioEffectVolumns", floAudioEffectVolumns);
    255         }
    256 
    257         /// <summary>
    258         /// 改变背景音乐的音调
    259         /// </summary>
    260         /// <param name="floAudioBGPichs">改变的音调值</param>
    261         public static void SetAudioBackgroundPitch(float floAudioBGPitchs)
    262         {
    263             _AudioSource_BackgroundAudio.pitch = floAudioBGPitchs;
    264 
    265             //数据持久化
    266             PlayerPrefs.SetFloat("AudioBackgroundPitch", floAudioBGPitchs);
    267         }
    268 
    269         /// <summary>
    270         /// 改变音效的音调
    271         /// </summary>
    272         /// <param name="floAudioEffectPitchs">音效的音调值</param>
    273         public static void SetAudioEffectPitch(float floAudioEffectPitchs)
    274         {
    275             _AudioSource_AudioEffectA.pitch = floAudioEffectPitchs;
    276             _AudioSource_AudioEffectB.pitch = floAudioEffectPitchs;
    277 
    278             //数据持久化
    279             PlayerPrefs.SetFloat("AudioEffectPitch", floAudioEffectPitchs);
    280         }
    281 
    282     }
    283 }
  • 相关阅读:
    c++ 异常处理 assert | try
    c++ 容器类
    protobuf 向前兼容向后兼容
    命名空间和模块化编程,头文件
    对象3:继承
    动态内存 this指针
    对象2 构造,析构
    对象 1 作用域解析符 ::
    hibernate-criteria查询
    oracle报错:ORA-28000: the account is locked
  • 原文地址:https://www.cnblogs.com/zhh19981104/p/9991636.html
Copyright © 2011-2022 走看看