如何使用 Wwise 和 Unity 创建可对音频作出反应的对象

游戏音频 / 互动音乐

在此,我想向大家展示如何使用 RTPC 在 Unity 中移动游戏对象,并创建由音频驱动/可对音频作出反应的对象。本文要求读者具备 Wwise-101 相关知识。不过,我会尽可能说得通俗一些。即使从未在 Unity 中编写过代码,应该也能轻松理解文中的内容。如果对 Wwise 基础知识不甚了解,请参阅 Wwise-101 认证课程或查看我的在线课程。我在文末提供了相关的链接,有兴趣的话不妨点进去看看。

如何使用 Wwise 和 Unity 创建可对音频作出反应的对象

目标
设置工程
创建 Unity 工程
将 Wwise 集成到 Unity 中
设置 Wwise
生成 Sound SFX、Event 和 SoundBank
创建 Game Parameter 并将其指派给 RTPC
准备可对音频作出反应的 Audio Bus 并设置 RTPC
设置 Unity
自定义 AkBank 脚本
创建用来接收 RTPC 并调节游戏对象的脚本
使用 RTPC 参数光标进行测试
创建可对音频作出反应的对象
使用自定义脚本接收 Meter 插件的值
通过声音调节材质颜色
结语
参考文献

目标

我对视听理念以及如何利用音频控制视频一直都很感兴趣。不过,关于如何通过 Unity 控制 Wwise 的信息有很多,反过来却不然。我仔细研究了一下,发现比自己想的要简单,所以想和大家分享一下。在这当中,我受到了 Audiokinetic 博文《Lumote:利用 Wwise 驱动游戏视效》的启发。不过,这篇文章里并没有对相关步骤做出详细的解释。在此,我会具体介绍如何使用 Meter 插件创建可对音频作出反应的对象。

我想通过本文向各位展示如何通过移动 RTPC 参数光标来操控 Unity 游戏对象(详请参见以下视频):
YouTube:Wwise + Unity | Change the Scale of the Game Object with RTPC

以及如何创建可对音频作出反应的对象(详请参见以下视频):
Youtube:Wwise + Unity | Audio Reactive

设置工程

首先,我们来创建 Unity 和 Wwise 工程。

创建 Unity 工程

启动 Unity Hub,并创建 Unity 工程。在这里,我使用的是 Unity 2020.3.12f1 (LTS)。在此,我选择了使用 URP 创建工程。

1_make_project_unity

将 Wwise 集成到 Unity 中

如果知道如何将 Wwise 集成到 Unity 中,可跳过本节并转到“设置 Wwise”章节。在这里,我使用的是 Wwise 2021.1.8.7831。

关闭 Unity 和 Unity Hub,然后打开 Audiokinetic Launcher。

选中 Unity 标签页,并点击 Integrate Wwise into Project...

2_Wwise_integrate_to_unity_akkk

这时会显示与下图类似的屏幕。在最上面,可按原样保留对 Packages 和 Deployment Platforms 所作的选择。

3_Wwise_Integration_page-1

Wwise Project Path 应保留为空。在 Unity Installation 分区,选择所用的 Unity 版本。

4_Wwise_integration_page-2

点击 Integrate。这时会自动开始集成。若 Unity Hub 处于打开状态,可能会无法成功完成集成。若集成操作失败,请确认关闭 Unity Hub。

5_Wwise_integration_processing_akkk

在操作完成之后,会看到以下屏幕。其中会显示新的 Open in Wwise 选项。Open in Unity 选项依然显示为灰色。不过该功能在 Mac 上好像不可用,所以不用担心。对此,可按照通常的方式从 Unity Hub 启动 Unity 工程。

6_Wwise_integration_success

设置 Wwise

生成 Sound SFX、Event 和 SoundBank

下面我们来设置 Wwise。在 Wwise Launcher 中,通过点击 Open in Wwise 2021.1.8.7831 来启动 Wwise。此工程中有两个 Sound SFX 对象:Chill 和 RTPCtest。在 RTPCtest 中,我放入了 Wwise Sine 作为音频源。在插入之后,可在 General Settings 选项卡中启用 Loop,来使其在单击 Play 时持续播放。在 Chill 中,我放入了一些音频源以便对音频作出反应。对此,您可以使用任何自己喜欢的音乐。

7_Wwise_project_setup

创建 "Play_Chill" 和 "Play_RTPCtest" Event,然后生成 SoundBank。若没有创建 SoundBank,Unity 会警告缺少 SoundBank。

创建 Game Parameter 并将其指派给 RTPC

在 Game Syncs 选项卡中,创建 Game Parameter 并将其命名为 RTPC_Control_Unity。

8_game_parameter

双击刚才创建的 Game Parameter 来打开 Property Editor。然后,将 Max 值设为 1。

9_game_parameter_property_editor

切换回 Designer 布局,显示 "RTPCtest" Sound SFX 对象的 RTPC,然后将 Voice Pitch 指派给刚才创建的 RTPC_Control_Unity。然后,像下面这样设置 RTPC 曲线:

10_RTPC_Pitch

这样 RTPCtest 的 RTPC 就准备好了。下面我们来设置 RTPC 以便对音频作出反应。

准备可对音频作出反应的 Audio Bus 并设置 RTPC

下面我们来创建 Audio Bus 并为其设置 RTPC 以便利用音频信号的电平来控制 Unity 对象。确切地说,是将 Meter 插件插入到新建的 Audio Bus 上并将 RTPC 指派给输出信号。

首先,在 Master Audio Bus 下创建新的 Audio Bus 并将其命名为 To Unity。

11_new_audio_bus

打开与刚才创建的 Audio Bus 对应的 Property Editor,然后单击 Effects 选项卡并插入 Wwise Meter 插件。在插入 Meter 插件后,确保选择 Default (Custom) 而非 New...。

12_Effect

13_add_Meter_default

按下最右侧的 Edit 按钮 (...) 来打开 Effect Editor。接着在 Output Game Parameter 下按下选择器按钮 [>>],然后单击 New... 来创建新的 Game Parameter,并将其命名为 Meter_Control_Unity。

14_assign_rtpc_to_meter

最后,我们会把要用于对音频作出反应的音乐输出到这条总线。为此,可将 "Chill" Sound SFX 对象的 Output Bus 设为 To Unity。

15_audio_outputbus

这样就完成了在 Unity 中对音频作出反应的 Wwise 设置。

设置 Unity

在 Unity 中创建 URP 时,其会提供一个类似建筑工地的示例场景(如下所示)。首先,我们来创建游戏对象并使其在 Wwise 中移动 RTPC 光标时改变大小。稍后,我们会把 Safety Hat 放在桌子上并让其移动。

16_safety_hat

自定义 AkBank 脚本

首先,我们来编写用于加载 SoundBank 的脚本。我们可以使用 Wwise 中提供的 AkBank 脚本,不过它的大部分功能都不会用到,所以在此我选择了创建自定义脚本。在 Project 窗口中,依次转到 Assets > Scripts 文件夹,接着单击文件夹内的空白区域,然后依次单击 Create > C# Script 来创建新的 C# 脚本。

17_create_script

将新建的脚本命名为 LoadBank。接着双击 LoadBank 脚本将其打开,然后将其内容替换为以下内容:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadBank : MonoBehaviour

{
    public AK.Wwise.Bank soundBank;
// 在第一帧更新之前调用 Start
    void Start()
    {
        soundBank.Load();
    }
}

这只是个用来在游戏启动时加载 SoundBank 的简单脚本。在此保存创建的脚本,并将其绑定到 WwiseGlobal 对象。

18_add_Load_Bank

在 SoundBank 分区,选择刚才在 Wwise 中创建的 SoundBank。

创建用来接收 RTPC 并调节游戏对象的脚本

下面我们来创建用于接收 RTPC 并以此调节游戏对象大小的脚本。

在此,我们将这个新建的脚本命名为 SmplRTPCListner。

下面就是用来接收 RTPC 并调节游戏对象大小的脚本。请替换内容并保存脚本。

using UnityEngine;

public class SmplRTPCListener : MonoBehaviour

{
// 将 rtpcID 设为 GameSyncs 下所需 Game Parameter 的名称
    public AK.Wwise.RTPC rtpcID;

    void Update()
    {
// 将包含 RTPC 参数的值
        float value = rtpcID.GetGlobalValue();

// 将根据 RTPC 参数的值改变大小
        transform.localScale = new Vector3(value, value, value);
    }
}

在 Hierarchy 窗口中,选中 Safety Hat 并将该脚本拖放到与 SafetyHat 对应的 Inspector 窗口上来进行绑定。

19_attach_script

Rtpc ID 指示 No GameParameter is currently selected。这是因为目前尚未指定要指派 Wwise 中的哪个 GameParameter。

20_no_game_parameter

在上面单击并选择 RTPC_Control_Unity。

21_assign_game_parameter

现在可以使用 RTPC 参数光标调节 Unity 中的 Safety Hat 的大小了。

使用 RTPC 参数光标进行测试

将 Wwise 连接到 Unity,然后来回移动 RTPC 参数光标,来测试游戏对象是否按照预期运作。

在 Wwise 中,按下 Connect to Remote Platform (Shift + H)。

22_connect_to_unity

从列表中选择连接,然后连接到 Unity。

23_connect_to_unity_2

在 Unity 中,按下 Play。接着在 Wwise 中按下 Play 并播放 RTPCtest,然后像本文开头视频中看到的那样移动 RTPC 参数光标。
效果如何?现在我们可以使用 RTPC 值来调节游戏对象的大小了。在对象变小时,音高会增高;在对象变大时,音高会降低。您可以修改脚本来使其不仅可以调节游戏对象的大小,还可调节其位置、旋转、更改材质的颜色并进行一系列其他交互。我会在下节展示用来调节材质颜色的脚本,并探讨如何创建可对音频作出反应的对象。

创建可对音频作出反应的对象

目前为止,我们讨论了如何接收 RTPC 并调节游戏对象的大小。接下来,我想展示如何利用音频信号的振幅来自动调节游戏对象而不是手动移动 RTPC。基本步骤都是一样的。不过,我们需要对 Meter 输出的 RTPC 值做一些调整。

使用自定义脚本接收 Meter 插件的值

Meter 的输出范围为 -48 ~ 0。

24_meter_min

在调节大小时,负数很不方便。所以,我们直接加上 48 来将取值范围改为 0 ~ 48。然后再除以 48,范围就变成了 0 ~ 1。在此基础上,我对之前编写的 SmplRTPCListner 脚本做了如下修改:

using UnityEngine;

public class SmplRTPCListener : MonoBehaviour

{
// 将 rtpcID 设为 GameSyncs 下所需 Game Parameter 的名称
    public AK.Wwise.RTPC rtpcID;
    public mySize;

    void Update()
    {
// 将包含 RTPC 参数的值
        float value = (rtpcID.GetGlobalValue() + 48f) / 48f * mySize;

// 将根据 RTPC 参数的值改变大小
        transform.localScale = new Vector3(value, value, value);
        //transform.localPosition = new Vector3(value, value, value);
    }
}

在将其与变量 mySize 相乘之后,还可通过 Unity 的 GUI 来调节大小。

将 Rtpc ID 设为 Meter_Control_Unity,然后将 My Size 值指定为 0 或更大的值。

25_script_setting

连接到 Wwise 并播放音乐。

这时可以看到游戏对象会随着音频电平的变化而移动。

通过声音调节材质颜色

除此之外,我还编写了可以根据声音调节材料颜色的脚本。

using UnityEngine;

public class Color_RTPC : MonoBehaviour

{
    //public Material ReferenceToMaterial;
    public AK.Wwise.RTPC MyColor;
    public Material ReferenceToMaterial;
// 调节颜色的强度
    public float glow = 1f;
    public float colorR;
    public float colorG;
    public float colorB;

// 每帧调用 Update 一次
    void Update()
    {
// 将包含 RTPC 参数的值
        float value = (MyColor.GetGlobalValue() + 48f) / 48f * glow;
        Debug.Log(value);

// 将根据 RTPC 参数的值改变大小
        ReferenceToMaterial.color = new Color(value * colorR, value * colorG, value * colorB);

    }
}

在将其绑定到游戏对象时会像下面这样:

26_color_change_script

您可以将材质拖放到 Reference To Material。接着,在 My Color 分区,像之前一样选择 Meter_Control_Unity。然后,使用 Glow 设置亮度并使用 Color R、Color G 和 Color B 分别调节红色、绿色和蓝色。

现在,游戏对象的材质颜色及其大小会随着声音变化了。

结语

通过从 Wwise 控制 Unity,您可以在 Unity 中实现前所未有的功能。在将创建的自定义脚本绑定到各个游戏对象上后,可以马上把无聊的建筑工地变成欢乐的派对现场,就像开头看到的那样。各位不妨在此基础上自行构建可对音频作出反应的工程。

参考文献

《Lumote》:利用 Wwise 驱动游戏视效
https://blog.audiokinetic.com/ja/lumote-using-wwise-to-drive-in-game-vfx/

Get RTPC value from Wwise in Unity
https://vraasp.wordpress.com/2018/01/19/getrtpc-in-wwise-2017-2-and-unity/

One Minute Wwise | Driving Visuals from Volume Output
https://www.youtube.com/watch?v=36eWf59E_TU

How can I access RTPC game parameters in Unity?
https://www.audiokinetic.com/qa/384/how-can-i-access-rtpc-game-parameters-in-unity

Akey Studio Wwise-110 Practical Exam Waiting List
https://akeystudio.com/en/wwise-110-course

Akey Studio Wwise-110 Certification Course
https://online.akeystudio.com/p/wwise-110-eng

Tomokazu Hiroki

Tomokazu Hiroki

广木智一 (Tomokazu Hiroki) 是一名 Wwise 认证讲师。他是 Wwise 认证学校 Akey Studio 的负责人。智一曾在伯克利音乐学院攻读音乐制作、技术与创新专业,并在取得音乐硕士学位后参加了该校的硕士后奖学金计划。基于 Artful Design 理念,他重点研究了 XR 音乐接口 OPSYN,并获得了 Epic Games 的 Epic MegaGrants 资助。智一对沉浸媒体和互动音频很感兴趣。他常常会制作在线内容来加深自身的理解并与他人分享相关经验。博客:https://jp.thiroki.com

 @Tzmix

评论

留下回复

您的电子邮件地址将不会被公布。

更多文章

加强线上交流,共建 Wwise 社区

经过多年的辛勤耕耘,Audiokinetic 取得了骄人的成绩,不仅是开发方面,全球创作者社区也壮大了不少,越来越多的人将 Wwise...

29.12.2020 - 作者:戴米安·卡斯特鲍尔(Damian Kastbauer)

互动音乐:根据玩家在游戏中所做的选择播放不同的乐段

在 2018 年众筹成功之后,inXile Entertainment 开始全力制作《Wasteland 3》。尽管上一款游戏《Bard's Tale IV》的配乐赢得了一致好评,布莱恩•法戈...

1.12.2021 - 作者:亚历山大•布兰登 (Alexander Brandon)

“不”字诀

由于社区中已经有很多更好的人在写声音设计和技术实现相关的内容,我借此机会写一篇与我2018年的博客《我理想中的工作环境:以游戏音频行业为例浅谈雇佣关系的人性化》关联的姐妹文章。...

22.6.2022 - 作者:戈登·麦格拉德里 (Gordon McGladdery)

深入探究《Seashell》中的音乐和音频元素

我叫李维•邦德,目前跟几位同事以 dBXY Collective 之名为游戏制作音频。我们跟独立开发商 High Tea Frog...

5.4.2023 - 作者:李维•邦德 (Levi Bond)

关于AudioLink的探索之旅

在去年 10 月的 GameSoundCon 上,我跟戴米安 (Damian) 在酒店拐角三明治店共进午餐的时候探讨着技术问题。我说“显然,现在我们可以将 MetaSounds 作为音频源在...

7.5.2024 - 作者:彼得·德雷舍 (Peter "pdx" Drescher)

《Moss: Book II》:借助音频增强 VR 体验的沉浸感

21.5.2024 - 作者:Polyarc 音频团队

更多文章

加强线上交流,共建 Wwise 社区

经过多年的辛勤耕耘,Audiokinetic 取得了骄人的成绩,不仅是开发方面,全球创作者社区也壮大了不少,越来越多的人将 Wwise...

互动音乐:根据玩家在游戏中所做的选择播放不同的乐段

在 2018 年众筹成功之后,inXile Entertainment 开始全力制作《Wasteland 3》。尽管上一款游戏《Bard's Tale IV》的配乐赢得了一致好评,布莱恩•法戈...

“不”字诀

由于社区中已经有很多更好的人在写声音设计和技术实现相关的内容,我借此机会写一篇与我2018年的博客《我理想中的工作环境:以游戏音频行业为例浅谈雇佣关系的人性化》关联的姐妹文章。...