Unity声音系统
1.概述
- Audio Clip 声音剪辑
声音导入Unity,Unity自动生成的一种文件格式
- Audio Source 声源信息
控制声音片段的播放、暂停、停止、继续等一系列操作
- Audio Listener 接收者
可以用它来接听声音
- Reverb Zones 混响区域
模拟声音在山洞、水下的混响效果
- Audio Filters 音频滤波器
高通滤波、低通滤波、回声、和声等效果
- Audio Effects 音频特效
音频特效,需结合Audio Mixer使用
- Audio Mixer 音频混合器
2.Unity中的声音
声音格式
- .aiff/.aif, .wav, .mp3, .ogg 标准声音格式
- .xm, .mod, .it, .s3m 使用Tracker模块播放声音
Tracker module 和主流的 PCM 格式(.aif, .wav, .mp3, and .ogg) 的区别在于,文件不仅小,音质也好.
这适用于需要大量音乐的游戏
目前主流的音轨编辑工具Tracker Modules 比如 OSX的 MilkyTracker ,OpenMPT for Windows.
For more information and discussion, please see the blog post .mod in Unity from June 2010.
导入设置
- 声音文件在Unity中的默认存储方式:PCM, ADPCM, Compressed。默认方式是压缩的
- 在PC和手机短以动平台的压缩方式为Vorbis或者MP3, PS Vita和Xbox平台的压缩方式为HEVAG或者XMA
系统设置
Edit -》Project Setting -》Audio
Global Volume: 全局音量设置,设为0就听不到声音了
Volume Rolloff Scale: 音量衰减因子,值越大,音量衰减越快。主要针对3D音乐效果,默认1,模拟真实情况,一般情况下不需要更改
Doppler Factor:,物体辐射的波长因为波源和观测者的相对运动而产生变化。在运动的波源前面,波会被压缩,波长就会变的较短,频率也会变得较高。在运动的波源后面会产生相反的效应。例子:当一辆车迎面驶来的时候,听到的声音会比原来的高,当车离去的时候,声音会比原来的低
Default Speaker Mode: 扬声器模式
System Sample Rate: 输出采样率,0采用系统的采样率,这个值只是个参考值,只有某些特定的平台才能对其进行修改
DSP Buffer Size: 混合器的缓存区大小
Default:默认的缓存大小
Best Latency:用性能换取延迟,延迟较低,性能不一定高
Good Latency:在延迟和性能之间取得平衡
Best performance:提高性能放弃延迟
Max Virtual Voices: 系统管理的虚拟声音的数量,该值应总是比我们游戏播放的声音数量大
Max Real Voices: 可以同时播放的真实声音的数量
Spatializer Plugin: 声音的定位插件
Ambisonic Decoder Plugin: 解码器插件
Disable Unity Audio: unity声音系统的禁止选项,勾选声音不生效
Virtualize Effects: 虚拟声音特效开关、默认不关
3.AudioClip声音剪辑
声音属性
加载的时候解压,i性能开销大,不适用于较大的文件
把声音压缩再内存,再播放时进行解压,开销较小,使用于较大文件
动态解码、使用流数据,从磁盘增量读取
注:MP3压缩格式只有在安卓平台下有
4.控制声音播放
Audio Listener
- 声音接收者,一般挂在Main Camera上,无属性
- 一个场景中只有一个
Audio Source
- 一个组件只能同时对应一个AudioClip,当重新赋值时会被替换
动态修改音频
audioSource.clip = audioClip;
代码控制音频
添加音频对象
添加音频控制脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioSourceControl : MonoBehaviour
{
public AudioSource audioSource;
private void OnGUI()
{
if(GUILayout.Button("Play", GUILayout.Width(100)))
{
//播放
if(!audioSource.isPlaying)
{
audioSource.Play();
}
}
if(GUILayout.Button("Stop", GUILayout.Width(100)))
{
//停止
audioSource.Stop();
}
if (GUILayout.Button("Pause", GUILayout.Width(100)))
{
//暂停
audioSource.Pause();
}
if (GUILayout.Button("Continue", GUILayout.Width(100)))
{
//继续
audioSource.UnPause();
}
}
}
5.AudioSource属性
6.Reverb Zone
7.Audio Filter
8.Audio Mixer初识
音频信号线路
一个AudioSource可以直接被AudioListener接听
也可以经过一个或多个AudioMixer处理后再被AudioListener接听
AudioMixer View
- The Asset - 包含所有的AudioGroups 和AudioSnapshots 作为子层级
- The Hierarchy view - 它包含AudioMixer中AudioGroups的整个混合层次结构
- The Mixer Views -这里面缓存 mixer的可见设置列表. 每个视图仅在main mixer window主混合窗口中显示整个层次结构的一个子集合。
- Snapshots -这是一个AudioMixer资产中的所有AudioSnapshots的列表. Snapshots捕获所有在AudioMixer中的参数设置状态,并且能够在运行时切换
- The Output AudioMixer -可以将AudioMixers规划到其他AudioMixers的AudioGroups中.这个属性可以单独定义一个 output AudioGroup 然后把这个AudioMixer的音频效果导入进去,也就是AudioMixer可以嵌套
- AudioGroup Strip View - 展示的是一个 AudioGroup的视图,包括当前的 VU 等级, 音量attenuation (volume) 设置, Mute, Solo and Effect Bypass 设置和 这个组的DSP effects 效果
- Edit In Play Mode - 这是按钮允许你在播放模式下编辑AudioMixer,或者防止编辑并允许游戏运行时控制AudioMixer的状态。
- Exposed Parameters - 这是一个 Exposed Parameters列表 ( AudioMixer 的任意参数可以通过一个string 名字暴露出来,然后让脚本访问) and 相应的字符串名称.
9.Audio Groups使用
AudioGroup作为AudioSource的输出
10.发送单元 和 接收单元
11.SnapShot 快照切换
快照可以再游戏运行的时候进行切换
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio; //需引用
public class SnapShotControl : MonoBehaviour
{
public AudioMixerSnapshot[] audioMixerSnapshots;
private void OnGUI()
{
if(GUILayout.Button("SnapShot1", GUILayout.Width(100)))
{
audioMixerSnapshots[0].TransitionTo(1f); //param:切换时做插值的时间
}
if (GUILayout.Button("SnapShot2", GUILayout.Width(100)))
{
audioMixerSnapshots[1].TransitionTo(1f);
}
}
}
快照之间切换时,声音的变化时插值变换
每个效果的的插值变换都是可设置的
直接选择效果右键即可弹出选择列表
12.参数列表的使用
如何暴露参数到参数列表
API使用格式
AudioMixer.SetFloat("参数列表中的参数名", 修改数值);
参考代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class ExposedParamsControl : MonoBehaviour
{
public AudioMixer audioMixer; //目标混音器
private void OnGUI()
{
if (GUILayout.Button("SetSub1Volume -80", GUILayout.Width(150)))
{
audioMixer.SetFloat("Sub1Volume", -80);
}
if (GUILayout.Button("SetSub1Volume 20", GUILayout.Width(150)))
{
audioMixer.SetFloat("Sub1Volume", 20);
}
if (GUILayout.Button("SetSub1Volume 0", GUILayout.Width(150)))
{
audioMixer.SetFloat("Sub1Volume", 0);
}
}
}
13.其它
AudioMixer Inspector
AM作为一个asset, 如果AM中有audio source提供音频,AM就是激活状态的. 因为 mixers 也可以通过场景视图中音频按钮来关闭,它和场景中的游戏物体关闭不一样,所以 a mixer 甚至在停止播放状态下也是激活状态active (也会消耗 CPU)
为了避免过多的消耗CPU资源,在一个项目中尽量不要同一时间运行很多mixer(比如,因为特定的场景要使用特定的mixer), audio mixers 有内置的功能,当所有处理过程停止的时候,使自己处于暂停状态have functionality built-in to put themselves into suspended mode in which all processing stops. 要自然的做到这一点,需要采取以下步骤:
只要任何音频源在混音器中播放,或者混音器从其他子混音器接收音频数据,混音器就会一直处于活动状态,在最后
一个声源完成播放后,混频器将等待一秒钟,然后在自己的输出中不断使用音量测量,以决定是否应该挂起自己. 这
是必要的,因为混响和回声声音衰减的非常缓慢. 要做到这一点,需要勾选suspend复选框,然后下面的滑动条是最
后声音检测的阈值.默认是-80db,低于这个值就挂起mixer,一般要调高一些,避免可能出现的CPU适用峰值