Audio Source音频使用与优化
本文章 Unity 皆为5.3版本。Audio Source音频使用与优化。
# 一、Unity面板:Audio Source
音频源(Audio Source)在场景中播放音频剪辑(Audio Clip)。如果音频剪辑(AudioClip)是一个3D剪辑,音频源是在一个给定的位置,并会随距离衰减这样的方式进行播放。音频可以在扬声器之间传播扩散Spread和可以在3D和2D平衡调整级别PanLevel之间进行转换。这是可以控制的随距离衰减曲线。此外,如果侦听器是在1个或多个混响区中,回响将会应用到音频源。 单独的过滤器可以应用到每个音频源,可以得到更丰富的音频体验。
- Audio Clip 声音原文件,可以在代码中去动态的截取音乐文件。
- Output
- Mute 是否静音(bool类型)。
- Bypass Effects 是否打开音频特效
- Bypass Listener Effects 音频特效器
- Bypass Reverb Zones 是否直通混响器
- Play On Awake 如果启用,则声音会在场景启动的时候开始播放。如果禁用,则需要从脚本中使用的play()命令来启动它。
- Loop 循环
- Priority 优先权,确定场景所有并存的音频源之间的优先权。(0=最重要的优先权。256 =最不重要。默认为128。)
- Volume 音量。音频源的音量(0.0 ~ 1.0)。
- Pitch 播放速度。速度范围(-3~3)
- Stereo Pan 以立体声方式声像一个正播放的声音(左或右),这仅用于单声道或立体声。
- Reverb Zone Mix 全局混响的数量
- Doppler Level 多普勒级别,决定了多少多普勒效应将被应用到这个音频信号源(如果设置为0,就是无效果)。
- Min Distance 最小距离,在最小距离(MinDistance)之内,声音会保持最响亮。 在最小距离(MinDistance)之外,声音就会开始衰减。增加声音的最小距离(MinDistance),可以使声音在3D世界"更响亮",减少最小距离(MinDistance)可使声音在一个三维世界"安静"。
- Max Distance 最大距离,声音停止衰减距离。超过这一点,它将在距离侦听器最大距离(MaxDistance)单位,保持音量,并不会作任何衰减。
- Volume Rolloff 衰减模式: Logarithmic Rolloff对数衰减、 Linear Rolloff线性衰减、Custom Rolloff 自定义衰减。
- Logarithmic Rolloff对数衰减:当你接近的音频源,声音响亮,但是当你远离对象,声音下降显着快。
- Linear Rolloff线性衰减:越是远离音频源的,你可以听到的声音越小。
- Custom Rolloff自定义衰减: 根据你设置的衰减图形,来自音频源的声音行为。
# 二、常用参数
- AudioSource.Play
- AudioSource.Pause C# ⇒ public void Pause();
- AudioSource.Stop C# ⇒ public void Stop();
- AudioSource.pitch
- AudioSource.volume C# ⇒ public float volume; The volume of the audio source (0.0 to 1.0).
- AudioSource.loop C# ⇒ public bool loop;
- AudioSource.mute
- AudioSource.playOnAwake C# ⇒ public bool playOnAwake;
# 三、SoundManager实现方式
- 建立一个空物体,为每一个音乐或音效添加AudioSource,给每个AudioSource添加相应的声音剪辑,播放时,获取各个AudioSource组件来播放声音。
- 建立一个空物体,添加一个AudioSource用来播放背景音乐;再添加一个Audiosource,用来播放音效,该组件的Audio Clip属性,在运行时根据需要播放的声音,赋予不同的声音剪辑,以此实现一个AudioSource,播放多个音效。这种方法的问题是,当有多个音效需要同时播放时,后播放的音效会终止先播放的音效。解决办法:给所有音效分组,不可能同时播放的音效为一组,再为每一组音效添加一个AudioSource。
- static void PlayClipAtPoint(AudioClip clip,Vector3 position, float volume = 1.0F); 使用AudioSource.PlayClipAtPoint播放声音,会自动生成一个名为"One shot audio"的物体,并自动添加了AudioSource和相应的audioclip,同时播放多个声音时会生成多个同名的物体,各声音的播放互不影响,但缺点是只能设置音量,位置,不能设置loop(当然也不是不能实现的,只是比较麻烦),还有一些特殊的声音效果也不易实现,只能播放一次,播放完成后,One shot audio自动销毁。
- 将音频做成预设Prefab,然后加入对象池中,然后调用,可以避免音乐经常的实例化。
int index=0;
public AudioClip[] clips;
void Start()
{
index=0;
InvokeRepeating("PlaySound",2.0f,0.5f);
}
void PlaySound()
{
if(index<clips.Length)
{
AudioSource.PlayClipAtPoint(clips[index],Vector3.zero,1.0f);
index++;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
所以可以看出,在只需要播放简单的音效时,可以使用PlayClipAtPoint来播放,不需要添加AudioSource,不需要获取各个AudioSource的引用,就可以直接播放声音。
# 四、打包优化
生成 Android Build 的时候记得把 Development Build 和 Auto Connect Profiler 勾选上,如下图所示:
在你手机上开始游戏,你有发现到什么奇怪的事情吗,加载游戏花了多少时间? 对于我,从Unity的默认界面加载到游戏界面我大约花了10-15秒,我的游戏中大概有15个背景音乐和40个SFX声音片段。
现在观察“Total Audio Memory”的数据,我这里显示了147.7MB!!就声音资源就占了147.7MB的内存,这么说手机的RAM(随机存取存储器)小于521MB的就没得玩了?
# 步骤一:在Audio Clips修改一些设置
现在选择所有的背景音乐资源。在Inspector中的设置将会如下图所示:
如上图所示,让我们取消Preload Audio Data(预加载音频数据)选项。然后把Override for Android选项勾上,并且设置Load Type为Streaming。
# 步骤二:准备Android Build
所有Building的步骤都和上面的一样。你有看到什么不同嘛?在我这边,我的游戏加载时间从15秒变为了2秒!这将比原来的加载时间快了5-7倍!
Total Audio Memory居然从147.7MB降到了5.8MB!!这便优化了25倍的内存使用。
# 原理:
在案例中,我们禁用了预加载音频(Preload Audio Data),因此就没有必要在开始的时候加载所有的音频剪辑,这便减少了加载时间!这将会在需要用到音频的时候才会去加载它。也许你现在会想,一旦我加载和使用了所有的音频剪辑,它们会不会占用内存呢?你是否还记得我们把Load Type设置为Streaming,音频剪辑将放入缓存区中,并且从缓存区中播放,一旦播放完后,便被卸载掉,这便释放了内存。因此便优化了内存的使用。
你可能会有另一个问题,“为什么不为SFX声音做同样的操作呢?”因为SFX声音在游戏运行中会经常使用到,因此会有一点小延迟是无关紧要的。事实上,我推荐将Load Type设置为Decompress on Load(在加载时解压)会运行的更流畅(并不是使用于任何的音频,只是使用于频繁使用的音频)。