第 4 课

目录

发送 Audio Input

[备注]

注意,本节为附加章节,认证考试中并不会有与此章节相关的考题。另外,“整合话筒输入”这个主题相对来说比较深奥,所以本节练习步骤中并不会涉及到脚本本身。

我们可以根据游戏机制来播放声音(比如在 Player 脚踏地面时发送 Player_Footsteps Event),也可以反过来利用音频来驱动游戏机制(比如使用来自话筒的输入信号来让 Player 挥动武器)。播放声音和打开话筒的流程基本上是一样的。在需要播放声音时,我们会发送与游戏对象关联的 Event(事件),然后播放 Audio Source(音频源)。在需要从话筒接收输入时,同样要发送与具有 Audio Source 的 Wwise 对象关联的 Event。只不过这里的 Audio Source 是 Wwise Audio Input。这种方式允许话筒将信号直接发送到 Wwise Audio Input 的 Wwise 对象,而且也方便利用 Wwise Meter 效果器来进行监测。

在 Unity 中,脚本设计远不止发送 Event 那么简单。不过,为了便于快速入门,我们还是构建了 AkMicrophone 脚本。

接下来,我们将在场景中添加此脚本,并在 Wwise 中创建用来接收话筒输入的 Sound SFX Audio Object,进而利用话筒音量电平来在话筒输入超过 -48 dB 时触发 Player 攻击动作。

[备注]

警告:在接下来的步骤中,我们建议您使用耳机而非扬声器,否则可能会导致输出被馈送到话筒中。

  1. 在 Unity 菜单栏中,依次转到 Audiokinetic > Certification > 301 > Lesson 4,然后选择 Posting Audio Input

  2. 在 Hierarchy 中,选中 Player 游戏对象。

  3. 在 Inspector 中,单击 Add Component,然后搜索并选中 AkMicrophone

    为了获取来自话筒的 Audio Input,我们必须将话筒激活,就像在数字录音机上按下“录制”一样。首先,我们要在 Wwise 中创建 Sound SFX,并为其添加 Wwise Audio Input Audio Source。

  4. 在 Wwise 中,依次转到 Project Explorer > Actor-Mixer Hierarchy(工程资源管理器 > Actor-Mixer 层级结构),接着右键单击 Default Work Unit(默认工作单元),然后转到 New Child(新建子对象),并选择 Sound SFX(音效)。

  5. 将其命名为 Microphone

    因为目前尚未添加 Audio Source,所以 Microphone 会显示为红色。在此,我们可以使用 Wwise Audio Input 将来自系统的音频输入添加为 Audio Source。

  6. 在 Contents Editor(内容编辑器)中,单击 Add Source >>(添加源 >>),然后选择 Wwise Audio Input

    假如所用话筒的声音太小听不清楚,可在此设置 Wwise Audio Input 的音量。

    在 Transport Control(走带控制)中按下 Play(播放)按钮时,将会激活话筒,并可听到说话声音。不过,我们只需利用话筒输入来触发 Player 攻击动作,并不想听到话筒输入,所以我们要将输出静音。但是不要在 Actor-Mixer Hierarchy 层级执行这一操作,因为这会妨碍我们监测输入音量电平。为此,我们可以将 Microphone Sound SFX 指派给一个 Audio Bus,然后直接将 Bus Volume 调低。

  7. 在 Project Explorer 的 Master-Mixer Hierarchy(Master-Mixer 层级结构)中,展开 Master Audio Bus(主音频总线)并右键单击 Non-World Audio Bus,然后转到 New Child 并选择 Audio Bus(音频总线)。

  8. 将其命名为 Microphone

  9. 在 Audio Bus Property Editor(音频总线属性编辑器)的 General Settings(常规设置)选项卡中,将 Bus Volume(总线音量)设为 -200

    现在 Audio Bus 已经准备就绪,不过还需为其指派 Microphone。

  10. 选中 Microphone Sound SFX。在 Sound Property Editor(声音属性编辑器)的 General Settings(常规设置)选项卡中,转到 Output Bus(输出总线)分组框,然后单击“浏览”按钮 [...]

  11. 双击 Microphone Audio Bus。

    现在将会把 Microphone Sound SFX 的输出发送到 Microphone Audio Bus。不过因为 Microphone Audio Bus 是完全静音的,所以在游戏中并不会听到话筒输入声音。接下来,我们需要将 RTPC 关联到 Input Volume(输入音量)。为此,可使用 Wwise Meter 来将 RTPC 关联到测得的音量。接下来,我们添加已预配置的 Wwise Meter Effect ShareSet(效果器共享集),并为其添加 RTPC。

  12. 在 Effects(效果器)选项卡中,单击 ID 0 中的选择器按钮 [>>],接着依次转到 Wwise Meter > Meters,然后选择 MicrophoneMeter Effect ShareSet。

  13. 单击 Edit(编辑)下方的“浏览”按钮 [...],以此打开 Wwise Meter Effect Editor(效果器编辑器)。

    在 AkMicrophone 脚本中,我们会看到 Microphone Level RTPC Property Drawer。在 AkMicrophone 脚本处于活跃状态时,将会监控此 RTPC。一旦该 RTPC 值超过 Output Game Parameter > Min(输出游戏参数 > 最小值)中的属性值(-48,Wwise Meter 中的默认值),便会调用 OnMicrophoneAction() UnityEvent(s)。

    [备注]

    您可以利用 UnityEvent 属性来调用任何函数或在 Inspector 中设置任意变量,而无需通过脚本进行调用。如需进一步了解 UnityEvent,请访问 https://docs.unity3d.com/Manual/UnityEvents.html 页面。

    接下来,我们将 Wwise Meter 关联到 RTPC,并在 AkMicrophone 脚本中将其选中。

  14. 在 Output Game Parameter(输出游戏参数)分组框中,单击选择器按钮 [>>],接着转到 Generic,然后选择 MicrophoneLevelRTPC。。

    [技巧]

    此属性是专门为《Wwise Adventure Game》预制的。假如您要在自己的游戏中运用此脚本,请创建一个新的 Game Parameter。

    接下来,我们要告知 AkMicrophone 脚本来检测 Microphone Game Parameter。这一操作跟 Game Parameter 的惯常用法有些相反;Game Sync(游戏同步器)并不是只能用于从 Unity 到 Wwise 的单向通信,其实在两个应用程序之间进行双向通信也是可以的。

  15. 在 Unity 的 Inspector 中,转到 AkMicrophone 脚本,然后单击 Microphone Level RTPC

    [备注]

    若未看到 Enable_Microphone Event,则表示可能在 Unity 的 Wwise Settings 中引用了原始的 Wwise Adventure Game Wwise 工程。为此,请依次转到 Edit > Wwise Settings,然后更改 Wwise Project Path。

  16. 展开 Generic Work Unit,然后选中 MicrophoneLevel Game Parameter 并单击 OK

    现在我们关联了 Game Parameter,不过还没有选择任何 Event。为了开始接收 Audio Input,我们需要通过 Event 来调用 Wwise Audio Input Audio Source。为此,我们来创建一个 Event。

  17. 在 Wwise 的 Project Explorer 中,右键单击 Microphone Sound SFX,然后转到 New Event(新建事件),并选择 Play(播放)。

    接下来,我们为 Event 取个能够表明其作用的名称。

  18. 在 Event Editor(事件编辑器)中,将 Microphone Event 重命名为 Enable Microphone

    因为 SoundBank 在引用 Project Explorer 的 Event 选项卡中的 Work Unit,所以将会把 Event 自动添加到 General SoundBank 中。接下来,我们只需保存 Wwise 工程并生成 SoundBank 即可将 Event 添加到 Unity 中。

  19. 在 Wwise 菜单栏中,转到 Project(工程),然后选择 Save(保存)。

  20. 选择 SoundBank(音频包)布局来访问 SoundBank Manager(音频包管理器),然后单击 Generate All(全部生成)。

  21. 在 Unity 的 Inspector 中,转到 AkMicrophone 脚本,然后单击 Microphone Event Property。

  22. 依次转到 Events > Default Work Unit,然后双击 Enable_Microphone Event。

    这样 Microphone Audio Input 就设置好了。接下来,我们要将其关联到某项功能或机制(本例中为 Player 攻击动作)。在冒险家发起攻击时,其将会分三步挥动武器。假如武器的 Trigger 与其他 Trigger 发送碰撞,将会发送 Player_WeaponImpact Event。为此,我们只需触发冒险家挥舞动作,Unity 便会在 PlayerAttack 脚本中进行调用。

  23. AkMicrophone 组件中,单击加号 (+) 以将条目添加到列表中。

  24. PlayerAttack 组件拖到 Object 属性中。

    现在,我们可以选择该脚本中的任何 public 函数。不过,在此我们来使用 Swing() 函数。

  25. No Function Property Drawer 中,转到 PlayerAttack,然后选择 Swing()

    搞定!接下来,我们进入游戏试试。

  26. 进入 Play 模式,跑向板条箱,然后挥动武器来实施攻击。

[技巧]

假如遇到音频输入丢失问题,请尝试修改 AkMicrophone 的 Sample Rate 或 Initial Read Delay in Samples 属性。

现在,我们成功地做到了在 Microphone 峰值超过 -48 dB 时触发 Player 攻击动作。我们建议您试下将其他函数添加到 OnMicrophoneAction() 列表。AkMicrophone 脚本专门设计用于在使用 Wwise 的 Unity 工程中重复使用,所以欢迎您将来利用它来构建自己设计的工程。