本章节我们介绍Unity 混音器 (Audio Mixer),它允许我们混合各种音频源,并对音频源进行统一控制或应用各种效果。在Unity中混音器是一种资源文件,可以右键Create创建AudioMixer文件。虽然它是一个文件,但是Unity提供了图形化界面来编辑这个文件。场景中的声音有很多,我们需要将他们分类管理,例如背景音乐,特效声音,NPC声音等等。这些声音都可以放入一个或多个AudioMixer中管理。每个AudioMixer都有类定义的层次结构,这在AudioMixer中被称为AudioGroup。我们只需要将我们的音频源按照不同的分类输出到AudioGroup上就可以了,剩下的就是我们通过AudioGroup来操作这些音频源的播放控制。
接下来,我们使用实例来说明如何使用混音器 (Audio Mixer)。首先,我们将场景中的声音分为两种,一种是背景声音(比如,上面夜晚虫鸣的声音night.mp3),一种是特效声音(比如,玩家跑步的声音run.mp3)。我们要实现的效果就是,场景默认播放夜晚虫鸣的背景声音,然后按下空格键后播放玩家跑步声音,同时减低背景声音。
接下来,我们就来创建一个混音器资源文件。我们在Project窗口下的Asset目录空白处右击,选择“Create”->“Audio Mixer”,文件的名称就是“NewAudioMixer”即可。
然后我们双击这个文件,打开它的图形化编辑窗口。
在上图中,我们在左边看到“Groups”的分组,下面有一个“Master”的主分组,同时在右侧也能看到这个名称为“Master”的主分组。接下来,我们点击选中这个“Master”,然后点击“Groups”右边的加号,添加两个新的分组:BgSound和EffectSound
请注意,Master是主分组,而BgSound和EffectSound是其下的两个子分组。同时,在右侧我们就能看到新增加的两个子分组。也就是说,Master可以整体的控制BgSound和EffectSound。而BgSound和EffectSound又可以控制各自的声音。接下来,我们介绍右侧的三个Master,BgSound和EffectSound。我们发现,这个三个分组的操作界面都是一样的。在这个操作界面中,最醒目的就是音量刻度以及滑块,很明显,这个滑块就是用来控制声音的大小的。从刻度中,我们发现声音的最大值为0,最小值为-80,单位是dB(分贝)。接下来就是“S”“M”和“B”三个按钮。S 按钮代表改组的声音播放,其他组的声音全部静音。M 按钮代表该组的声音全部静音。B 按钮代表取消该组中的所有效果。最下面的“Add”按钮就是给当前分组添加一个效果的,这里就不做详细介绍。
如何使用混音器来控制声音大小呢?我们需要将混音器的音量参数(Volume)暴露(Expose)出来,这样我们才可以使用代码来控制声音的大小。当然,我们还可以暴露其他参数来通过代码控制其实对应的效果。如何暴露音量参数呢?首先,我们点击“BgSound”这个分组,然后查看其Inspector检视面板,如下所示
我们能够看到它的音量参数“Volume”了。我们将鼠标放到“Volume”的上面右击
我们选择第一个选项“Expose ‘Volume(of BgSound)’ to script”,意思就是将这个参数暴露给脚本。
暴露完毕后,就可以看到原来“Volume”的右边多了一个箭头的标识。同时,在我们的混音器编辑窗口中的右上角也会显示暴露参数的个数,如下所示
我们点击右上角的下拉三角,如下所示
显示我们暴露的参数名称为“MyExposedParam”,我们可以改个名称,我们右击这个名称
然后选择“Rename”重命名,输入新的名称“BgSoundVolume”
我们以同样的方式来暴露“EffectSound”中的Volume参数为“EffectSoundVolume”。
这里,我们就暂且设置完毕混音器文件了。
我们回到场景中Audio Source组件。我们已经向场景中添加了一个空物体( 重命名为BgGameObject ),并为该空物体添加了Audio Source组件,该组件中的第一个选项Audio Clip也分配了“night.mp3”声音文件。然后我们注意第二个Output选项。它就是用来设置混音器 (Audio Mixer)的。
接下来,我们就来点击Output选项右侧的圆点来添加我们刚刚创建的混音器。
在弹出的对话框中,我们选择“BgSound”这个子分组。因为我们的“night.mp3”声音文件属于背景声音,所以我们将其交给“BgSound”来管理。
同理,我们继续添加一个新的空物体(名称为EffectGameObject),同样添加Audio Source组件,然后第一个选项Audio Clip分配“run.mp3”声音文件,第二个Output选项设置“EffectSound”分组。
这里,我们取消了“Play On Awake”选项,不让“run.mp3”声音自动播放。接下来,我们需要创建脚本文件SoundController.cs来实现我们刚刚说的效果。代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class SoundController : MonoBehaviour
{
// 混音器
public AudioMixer audioMixer;
// 跑步声音源组件
public GameObject effectGameObject;
private AudioSource audioSource;
// Start is called before the first frame update
void Start()
{
// 获取跑步声音源组件
audioSource = effectGameObject.GetComponent<AudioSource>();
}
// Update is called once per frame
void Update()
{
// 空格按下,播放跑步声音,减低背景声音
if (Input.GetKeyDown(KeyCode.Space))
{
audioMixer.SetFloat("BgSoundVolume", -20.0f);
audioMixer.SetFloat("EffectSoundVolume", 0.0f);
audioSource.Play();
}
// 空格按上,停止跑步声音,恢复背景声音
if (Input.GetKeyUp(KeyCode.Space))
{
audioMixer.SetFloat("BgSoundVolume", 0.0f);
audioMixer.SetFloat("EffectSoundVolume", -80.0f);
audioSource.Stop();
}
}
}
然后,我们将这个脚本附加到主相机“Main Camera”上面。
在脚本中我们定义了两个公开(public)的变量,一个是混音器audioMixer,另一个是空物体effectGameObject。这两个变量的初始化,我们需要在检视面板中拖拽完成。我们分别从Project的Asset窗口中,将我们的混音器文件NewAudioMixer拖拽到audioMixer变量位置,然后从层次面板中拖拽effectGameObject游戏对象到effectGameObject变量中。
如上截图中所示那样。audioMixer变量就是混音器,我们可以调用它的SetFloat方法来设置声音的大小。还记得我们暴露的两个参数嘛?他们分别是背景声音变量BgSoundVolume以及特效声音变量EffectSoundVolume。我们的SetFloat方法的第一个参数就是暴露参数变量的名称,第二个参数就是参数值。0代表最大音量,-80代表最小。当我们按下空格键的时候,我们就可以通过如下代码:
audioMixer.SetFloat("BgSoundVolume",-20.0f);
audioMixer.SetFloat("EffectSoundVolume", 0.0f);
来降低背景声音,同时增大特效声音。那么另一个effectGameObject游戏对象是干嘛的呢?它其实是为了获取音频源audioSource控件。因为我们将跑步声音“run.mp3”就放置到了effectGameObject游戏对象的audioSource控件上面。因此该音频源的播放就需要使用audioSource控件来实现。这个就比较简单了,直接调用Play方法播放,Stop方法停止。接下来,我们就可以运行整个工程,场景会自动播放背景声音night.mp3文件,当我们按下空格的时候,背景声音会降低,同时播放跑步特效声音run.mp3文件。
本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id