简介
Audio Mixer 是在 Unity 5.0 版本中首次引入的音频混合器工具,它可以帮我们处理声音的分组管理、音效模拟、情景再现等重要业务。
功能入口
-
在资产视口单击鼠标右键
-
选择 Create 选项
-
选择 Audio 选项
-
点击 Audio Mixer
Audio Mixer Assets 的属性面板
AUDIO MIXER | 描述 |
---|---|
Audio Mixer Suspend | 允许开发者暂时挂起音频混音器的处理。当这个选项被启用时,音频混音器不会再处理任何音频信号,这意味着所有通过该混音器的音频都会被静音,不再有任何音频输出。这个功能通常用于节省计算资源,例如在游戏处于后台运行或者不需要播放音效的时候,可以通过暂停音频混音器来减少CPU的负担。当需要恢复音频播放时,可以关闭"Audio Mixer Suspend"选项,音频混音器将重新开始处理音频信号。 |
Threshold Volume | Threshold Volume选项用于设置自动混音器暂停的阈值音量。当混音器不再接收来自任何音频源或子混音器的音频数据时,它会等待一段预设的时间,并使用自己的输出进行响度测量。如果在这段时间内混音器的输出响度低于Threshold Volume设置的值,混音器将进入暂停模式,停止所有处理以节省CPU资源。这个功能特别有用于那些不是始终活跃的混音器,例如在特定级别使用专门混音器的项目中,可以避免不必要的CPU开销 |
Update Mode | 音频更新的模式,包含Normal、Unscale Time。Unscale Time会在Time.timeScale=0时,继续保持更新,而Normal模式则会受到Time.timeScale变量的影响 |
Audio Mixer Window
Mixers
工程中所有存在的Audio Mixer资产都会在这里展示,同时你可以通过该栏目,右上角的➕号,为项目增加新的音频混合器,列表中展示的名称是Audio Mixer资产的实际名称。
Groups
在每个Audio Mixer的Groups中,可以包含多个音频输出节点,它们以Master节点为根节点依次展开,每个输出节点都可以设置不同的音量、挂在不同的音效。
它们之间除了平级关系,还有父子关系,子节点继承父节点的一切特性。
在使用时,我们只需要为Audio Source设置不同的节点(任何节点都可以),就可以创造出不同的声音环境。
Master作为跟节点是不可以删除和重命名的,也无法创建于Master平级的节点。
Snapshots
快照的作用主要是为了动态的调换音频的情景模式,不同的快照之间节点数量是相同的,但是可以有不同的参数和不同附加效果。
快照的用途有很多,例如在剑灵中为了突出于NPC对话时的气氛,弱化了对白之外的其他音效。再例如战地中玩家周边爆炸产生的轰鸣效应,会使听觉短暂失聪。又或者,当玩家在野外触发战斗状态时,你想强化玩家队伍和对战阵营发出的声音,那么也可以用快照实现。
Views
Views 是在编辑器模式下,帮助编辑的功能。在Groups的每个节点前方有一个眼睛,这是一个可视开关。在选择新的View后,可以通过可视开关实现不同View下展示不同节点的效果。
Exposed Parameters
我们可以将一个节点的任何一个参数暴露给脚本以实现动态控制效果。
-
选中任意节点
-
在Inspector面板中右键单击任意效果的任意属性
-
选择菜单栏中 Expose'xxxxxx' 开头的选项将参数导出
导出的参数会出现在 Exposed Parameters列表中,在这里我们可以对他进行重命名,或取消导出。
脚本相关内容
分贝到音量的相互转换
float ToDB(float percent)
{
return Mathf.Clamp01(percent) * 100 - 80;
}
float ToPercent(float db)
{
return (db + 80f) / 100f;
}
为Audio Source 动态设置Audio Mixer Group Node 示例代码
public void SetGroupNameForAudioSource(AudioMixer mixer,AudioSource source, string groupName = "")
{
if (string.IsNullOrEmpty(groupName))
{
groupName = "Master";
}
else
{
groupName = $"Master/{groupName.Replace(".","/")}";
}
var array = mixer.FindMatchingGroups(groupName);
if (array.Length > 0)
{
source.outputAudioMixerGroup = array[0];
}
}
设置、获取节点参数
//> Cache变量是一个用来存储字段属性值的字典 Dictionary<string, float>
//> MixerController : AudioMixer
public void SetMute(string groupName, bool value)
{
string key = $"{groupName}.volume";
if (value && !Cache.ContainsKey(key))
{
if (MixerController.GetFloat(key, out var db))
{
MixerController.SetFloat(key, ToDB(0));
Cache.Add(key, ToPercent(db));
}
}
else if(!value && Cache.Remove(key, out var percent))
{
MixerController.SetFloat(key, ToDB(percent));
}
}
这里有点不一样,AudioMixer只提供了通过float值修改属性变量的接口,所以静音这种只能通过变量暂存在实现下。
切换快照
/// <summary>
/// 切换一个快照
/// </summary>
/// <param name="snapshotName"></param>
/// <param name="timeToReach"></param>
public void SwitchSnapshot(string snapshotName, float timeToReach = 0.25f)
{
var target = MixerController.FindSnapshot(snapshotName);
if (target == null)
{
Debug.LogError($"不存在的混音快照 {snapshotName}");
return;
}
target.TransitionTo(timeToReach);
}
扩展
除此之外我们还可以控制快照A到快照B声音衰减的方式,默认是线性过度的。
Linear(线性的)
Smoothstep(平滑的)
Squared(平方)
SquareRoot(平方根)
BrickwallStart(从时间开头切断)
BrickwallEnd(从时间结尾切断)
Attenuation(衰弱的)