Audio Source音频使用与优化

2016/4/16 Unity游戏开发

本文章 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自定义衰减: 根据你设置的衰减图形,来自音频源的声音行为。

# 二、常用参数

  1. AudioSource.Play
  2. AudioSource.Pause C# ⇒ public void Pause();
  3. AudioSource.Stop C# ⇒ public void Stop();
  4. AudioSource.pitch
  5. AudioSource.volume C# ⇒ public float volume; The volume of the audio source (0.0 to 1.0).
  6. AudioSource.loop C# ⇒ public bool loop;
  7. AudioSource.mute
  8. AudioSource.playOnAwake C# ⇒ public bool playOnAwake;

# 三、SoundManager实现方式

  1. 建立一个空物体,为每一个音乐或音效添加AudioSource,给每个AudioSource添加相应的声音剪辑,播放时,获取各个AudioSource组件来播放声音。
  2. 建立一个空物体,添加一个AudioSource用来播放背景音乐;再添加一个Audiosource,用来播放音效,该组件的Audio Clip属性,在运行时根据需要播放的声音,赋予不同的声音剪辑,以此实现一个AudioSource,播放多个音效。这种方法的问题是,当有多个音效需要同时播放时,后播放的音效会终止先播放的音效。解决办法:给所有音效分组,不可能同时播放的音效为一组,再为每一组音效添加一个AudioSource。
  3. static void PlayClipAtPoint(AudioClip clip,Vector3 position, float volume = 1.0F); 使用AudioSource.PlayClipAtPoint播放声音,会自动生成一个名为"One shot audio"的物体,并自动添加了AudioSource和相应的audioclip,同时播放多个声音时会生成多个同名的物体,各声音的播放互不影响,但缺点是只能设置音量,位置,不能设置loop(当然也不是不能实现的,只是比较麻烦),还有一些特殊的声音效果也不易实现,只能播放一次,播放完成后,One shot audio自动销毁。
  4. 将音频做成预设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++;
		}

	}
1
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倍的内存使用。

# 原理:

  1. 在案例中,我们禁用了预加载音频(Preload Audio Data),因此就没有必要在开始的时候加载所有的音频剪辑,这便减少了加载时间!这将会在需要用到音频的时候才会去加载它。也许你现在会想,一旦我加载和使用了所有的音频剪辑,它们会不会占用内存呢?你是否还记得我们把Load Type设置为Streaming,音频剪辑将放入缓存区中,并且从缓存区中播放,一旦播放完后,便被卸载掉,这便释放了内存。因此便优化了内存的使用。

  2. 你可能会有另一个问题,“为什么不为SFX声音做同样的操作呢?”因为SFX声音在游戏运行中会经常使用到,因此会有一点小延迟是无关紧要的。事实上,我推荐将Load Type设置为Decompress on Load(在加载时解压)会运行的更流畅(并不是使用于任何的音频,只是使用于频繁使用的音频)。

Last Updated: 2022/1/8 04:00:18