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

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

3、源码如下:

 /*
*
* 开发时间:2018.11.20
*
* 功能:用来对项目中的所有音频做同一的管理
*
* 描述:
* 1、挂载该脚本的游戏物体上要挂载三个AudioSouce[可以修改脚本,动态挂]
* 2、建议大的背景音乐不要加入AudioClip[],对内存消耗大。而是哪里用到,单独使用PlayBackground函数播放
* 3、小的音效片段可以将其加入AudioClip[]中,可以很方便的管理,可以通过声音剪辑、声音剪辑名称来进行音乐的播放
* 4、该声音管理可以进行背景音乐的播放、音效的播放、背景音乐的音调改变、音效的音调改变、停止播放
*
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic; namespace Kernal
{
public class AudioManager : MonoBehaviour
{
public AudioClip[] AudioClipArray; //剪辑数组 public static float AudioBackgroundVolumns = 1F; //背景音量
public static float AudioEffectVolumns = 1F; //音效音量
public static float AudioBackgroundPitch = 1f; //背景音乐的音调
public static float AudioEffectPitch = 1.0f; //音效的音调 private static Dictionary<string, AudioClip> _DicAudioClipLib; //音频库,将声音名字和声音资源进行关联 private static AudioSource[] _AudioSourceArray; //音频源数组 private static AudioSource _AudioSource_BackgroundAudio; //背景音乐
private static AudioSource _AudioSource_AudioEffectA; //音效源A
private static AudioSource _AudioSource_AudioEffectB; //音效源B
//......可以按需求进行添加 /// <summary>
/// 音效库资源加载
/// </summary>
void Awake()
{
//音频库加载[初始化,将音乐剪辑和名字联系起来]
_DicAudioClipLib = new Dictionary<string, AudioClip>(); foreach (AudioClip audioClip in AudioClipArray)
{
_DicAudioClipLib.Add(audioClip.name, audioClip);
} //处理音频源,也就是得到用来播放声音的音乐播放器
_AudioSourceArray = this.GetComponents<AudioSource>();
_AudioSource_BackgroundAudio = _AudioSourceArray[]; //其中一个用来播放背景音乐
_AudioSource_AudioEffectA = _AudioSourceArray[]; //其中一个用来播放音乐1
_AudioSource_AudioEffectB = _AudioSourceArray[]; //从数据持久化中得到音量数值
if (PlayerPrefs.GetFloat("AudioBackgroundVolumns") >= )
{
AudioBackgroundVolumns = PlayerPrefs.GetFloat("AudioBackgroundVolumns");
_AudioSource_BackgroundAudio.volume = AudioBackgroundVolumns;
} if (PlayerPrefs.GetFloat("AudioEffectVolumns") >= )
{
AudioEffectVolumns = PlayerPrefs.GetFloat("AudioEffectVolumns");
_AudioSource_AudioEffectA.volume = AudioEffectVolumns;
_AudioSource_AudioEffectB.volume = AudioEffectVolumns;
} //设置音乐的音效
if (PlayerPrefs.HasKey("AudioBackgroundPitch"))
{
AudioBackgroundPitch = PlayerPrefs.GetFloat("AudioBackgroundPitch");
}
if (PlayerPrefs.HasKey("AudioEffectPitch"))
{
AudioEffectPitch = PlayerPrefs.GetFloat("AudioEffectPitch");
} _AudioSource_BackgroundAudio.pitch = AudioBackgroundPitch;
_AudioSource_AudioEffectA.pitch = AudioEffectPitch;
_AudioSource_AudioEffectB.pitch = AudioEffectPitch; } /// <summary>
/// 播放背景音乐
/// 传入的参数是背景音乐的AudioClip
/// </summary>
/// <param name="audioClip">音频剪辑</param>
public static void PlayBackground(AudioClip audioClip)
{
//防止背景音乐的重复播放。
if (_AudioSource_BackgroundAudio.clip == audioClip)
{
return;
} //处理全局背景音乐音量
_AudioSource_BackgroundAudio.volume = AudioBackgroundVolumns;
_AudioSource_BackgroundAudio.pitch = AudioBackgroundPitch;
if (audioClip)
{
_AudioSource_BackgroundAudio.loop = true; //背景音乐是循环播放的
_AudioSource_BackgroundAudio.clip = audioClip;
_AudioSource_BackgroundAudio.Play();
}
else
{
Debug.LogWarning("[AudioManager.cs/PlayBackground()] audioClip==null !");
}
} /// <summary>
/// 播放背景音乐
/// 传入的参数是声音片段的名字,要注意,其声音片段要加入声音数组中
/// </summary>
/// <param name="strAudioName"></param>
public static void PlayBackground(string strAudioName)
{
if (!string.IsNullOrEmpty(strAudioName))
{
PlayBackground(_DicAudioClipLib[strAudioName]);
}
else
{
Debug.LogWarning("[AudioManager.cs/PlayBackground()] strAudioName==null !");
}
} /// <summary>
/// 播放音效_音频源A
/// </summary>
/// <param name="audioClip">音频剪辑</param>
public static void PlayAudioEffectA(AudioClip audioClip)
{
//处理全局音效音量
_AudioSource_AudioEffectA.volume = AudioEffectVolumns;
_AudioSource_AudioEffectA.pitch = AudioEffectPitch; if (audioClip)
{
_AudioSource_AudioEffectA.clip = audioClip;
_AudioSource_AudioEffectA.Play();
}
else
{
Debug.LogWarning("[AudioManager.cs/PlayAudioEffectA()] audioClip==null ! Please Check! ");
}
}
/// <summary>
/// 播放音效_音频源A
/// </summary>
/// <param name="strAudioEffctName">音效名称</param>
public static void PlayAudioEffectA(string strAudioEffctName)
{
if (!string.IsNullOrEmpty(strAudioEffctName))
{
PlayAudioEffectA(_DicAudioClipLib[strAudioEffctName]);
}
else
{
Debug.LogWarning("[AudioManager.cs/PlayAudioEffectA()] strAudioEffctName==null ! Please Check! ");
}
}
/// <summary>
/// 播放音效_音频源B
/// </summary>
/// <param name="audioClip">音频剪辑</param>
public static void PlayAudioEffectB(AudioClip audioClip)
{
//处理全局音效音量
_AudioSource_AudioEffectB.volume = AudioEffectVolumns;
_AudioSource_AudioEffectB.pitch = AudioEffectPitch;
if (audioClip)
{
_AudioSource_AudioEffectB.clip = audioClip;
_AudioSource_AudioEffectB.Play();
}
else
{
Debug.LogWarning("[AudioManager.cs/PlayAudioEffectB()] audioClip==null ! Please Check! ");
}
} /// <summary>
/// 播放音效_音频源B
/// </summary>
/// <param name="strAudioEffctName">音效名称</param>
public static void PlayAudioEffectB(string strAudioEffctName)
{
if (!string.IsNullOrEmpty(strAudioEffctName))
{
PlayAudioEffectB(_DicAudioClipLib[strAudioEffctName]);
}
else
{
Debug.LogWarning("[AudioManager.cs/PlayAudioEffectB()] strAudioEffctName==null ! Please Check! ");
}
} /// <summary>
/// 停止播放音效A
/// </summary>
public static void StopPlayAudioEffectA()
{
_AudioSource_AudioEffectA.Stop();
} /// <summary>
/// 停止播放音效B
/// </summary>
public static void StopPlayAudioEffectB()
{
_AudioSource_AudioEffectB.Stop();
} /// <summary>
/// 停止播放背景音乐
/// </summary>
public static void StopPlayAudioBackGround()
{
_AudioSource_BackgroundAudio.Stop();
} /// <summary>
/// 改变背景音乐音量
/// </summary>
/// <param name="floAudioBGVolumns"></param>
public static void SetAudioBackgroundVolumns(float floAudioBGVolumns)
{
_AudioSource_BackgroundAudio.volume = floAudioBGVolumns;
AudioBackgroundVolumns = floAudioBGVolumns;
//数据持久化
PlayerPrefs.SetFloat("AudioBackgroundVolumns", floAudioBGVolumns);
} /// <summary>
/// 改变音效音量
/// </summary>
/// <param name="floAudioEffectVolumns"></param>
public static void SetAudioEffectVolumns(float floAudioEffectVolumns)
{
_AudioSource_AudioEffectA.volume = floAudioEffectVolumns;
_AudioSource_AudioEffectB.volume = floAudioEffectVolumns;
AudioEffectVolumns = floAudioEffectVolumns;
//数据持久化
PlayerPrefs.SetFloat("AudioEffectVolumns", floAudioEffectVolumns);
} /// <summary>
/// 改变背景音乐的音调
/// </summary>
/// <param name="floAudioBGPichs">改变的音调值</param>
public static void SetAudioBackgroundPitch(float floAudioBGPitchs)
{
_AudioSource_BackgroundAudio.pitch = floAudioBGPitchs; //数据持久化
PlayerPrefs.SetFloat("AudioBackgroundPitch", floAudioBGPitchs);
} /// <summary>
/// 改变音效的音调
/// </summary>
/// <param name="floAudioEffectPitchs">音效的音调值</param>
public static void SetAudioEffectPitch(float floAudioEffectPitchs)
{
_AudioSource_AudioEffectA.pitch = floAudioEffectPitchs;
_AudioSource_AudioEffectB.pitch = floAudioEffectPitchs; //数据持久化
PlayerPrefs.SetFloat("AudioEffectPitch", floAudioEffectPitchs);
} }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

04、Unity_声音管理器的更多相关文章

  1. Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  2. 电脑没有声音,显示“未插入耳机或扬声器”,检测不到Realtek高清晰音频管理器

    2018-7-16,电脑彻夜未关,早上发现已经死机了.关机重启之后,就发现没有声音了,提示“未插入耳机或扬声器”,并且检测不到Realtek高清晰音频管理器,只能检查到显卡音频输出.首先,音箱在其他电 ...

  3. 故障解决 | win10没声音及找不到Realtek高清音频管理器

    重装 win10 系统后,电脑没声音,更新驱动以及万不得已下载驱动精灵都没有解决. 后来发现在“硬件和声音”中没有Realtek高清音频管理器,之后找到解决办法如下: 1. 找到Realtek高清音频 ...

  4. Ubuntu 18.04图形化软件包管理器

    1.ubuntu软件这个管理工具提供了一种管理您系统中软件的好方法,通过他可以很直观的查找软件安装很简单,打开终端,输入以下命令:----------------------------------- ...

  5. 04 Vue Router路由管理器

    路由的基本概念与原理 Vue Router Vue Router (官网: https://router.vuejs.org/zh/)是Vue.js 官方的路由管理器. 它和vue.js的核心深度集成 ...

  6. 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  7. Oracle 11g 中恢复管理器RMAN介绍

    这是我平时摘录的笔记,从管理艺术那本书上摘录出来的,放到这里 RMAN 可在数据库服务器的帮助下从数据库内备份数据文件,可构造数据文件映像副本.控制文件和控制文件映像.对当日志 SPFILE 和RMA ...

  8. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  9. AudioManager音频管理器

    AudioManager音频管理器提供了如下几种常用方法来控制手机音频: 1.adjustStreamVolume(int StreamType,int direction,int flgs):调整手 ...

随机推荐

  1. Item 1----------考虑用静态工厂方法代替构造器

    读书,有时候,我感觉总是有点绕和不具体.我阅读了代码,理解代码后,才有一种理解和把握的感觉. 优点三.   把某个对象的构建放给客户端来实现. 比如下面的实现,客户端Test,获取Service的实例 ...

  2. [LA3135]node形式的优先队列

    n个触发器,每个触发器每period秒就产生一个编号为qnum的事件,求前k个事件. n<=1000  k<=10000 node形式的优先队列 主要在于重载小于号,确定优先顺序. #in ...

  3. 【NOIP】提高组2013 火柴排队

    [题意]两列n个火柴,分别有高度ai和bi(同一列高度互不相同),每次可以交换一列中的两个相邻火柴,定义距离为∑(ai-bi)^2,求使距离最小的最少交换次数,n<=10^5. [算法]逆序对 ...

  4. HDU 2546 饭卡 (dp)

    题目链接 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上 ...

  5. vue-cli proxyTable中跨域中pathRewrite 怎么用

    问:proxyTable 里面的pathRewrite里面的‘^/iclient’:'' 什么意思? 答:用代理, 首先你得有一个标识, 告诉他你这个连接要用代理. 不然的话, 可能你的 html, ...

  6. ES6新增的let与const

    1.const 声明常量,一旦声明必须立马赋值,否则报错 const PI = 3.14 const PI; //报错:Uncaught SyntaxError: Missing initialize ...

  7. 通过实例来学习XML DTD

    使用DTD的原因: 注意:由于它自身的一些缺点,DTD终将被淘汰,但是它还是要学习的.学习完DTD后,后面继续学习XML Schema. 1,通过 DTD,您的每一个 XML 文件均可携带一个有关其自 ...

  8. parse_str

    之前没有遇到过parse_str,其意思就是“把查询字符串解析到变量中”也就是$str会被解析为变量. <?php $data = "a=1&b=2";parse_s ...

  9. 如何才可以干掉Cortana进程,开机不启动

    直接禁用即可WIN——设置——隐私——语音.墨迹书写和键入——停止收集有关我的信息——关闭

  10. tcp窗口机制(写的最简单精炼的文章)

    tcp窗口机制(写的最简单精炼的文章) http://blog.csdn.net/occupy8/article/details/48468445