第 7 课

目录

利用组件实现回调

音乐作为声景中经常出现的一大核心元素似乎很适合运用回调。在本课中,我们将把回调集成到音乐中,以此实现画面元素和音乐主题的互动。在收到来自音乐功能的通知时,我们可以调用游戏中的元素,并让其对音乐做出反应。比如,让大树随着音乐节奏律动。

《Wwise Adventure Game》中的区域音乐具有六种不同的主题,各自采用了相同的速度和调。

利用 AkEvent 或 AkAmbient 组件,我们可以非常轻松地设置回调。这两个组件都提供有 Use Callbacks 属性,便于定义创建回调所需的必要信息。

在创建回调之前,我们需要定义两种类型的信息。首先,要指派 Callback Function 以及承载此函数的 Game Object。然后,要通过选择若干 Callback Flag(在脚本中也叫 Callback Type)来指定 Callback Function 的调用时机。这两种信息会随着 Event 调用一并发送。倘若与 Callback Type 相符,便会调用 Callback Function 属性中指定的函数。接下来,我们将依据《Wwise Adventure Game》中音乐的速度来调节大树的比例。首先,我们要通过 AkEvent 组件发送 Music_Region Event。然后,将 RhythmActions 脚本添加到 Tree(大树)游戏对象。

最后,通过回调从 Music_Region AkEvent 调用 RhythmActions 脚本。

  1. 在 Unity 菜单栏中,依次转到 Audiokinetic > Certification > 301 > Lesson 7,然后选择 Callbacks using Components

    因为负责发送 Music_Region Event 的 AkEvent 组件并不受作用域为特定游戏对象的属性控制,而且音乐本身也不需要定位,所以我们可以将该组件添加到任何游戏对象。为了便于运用,我们来直接将 AkEvent 添加到 Wwise 游戏对象。

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

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

  4. 在 Event Name 属性中,依次展开 Events > Music > General,然后双击 Music_Region

    Trigger On 属性已经默认设置好了,我们直接在游戏初始化时触发音乐即可。不过,在使用回调之前,必须先声明回调所要指向的函数以及对应的游戏对象。为此,我们先来将 RhythmActions 脚本添加到 Training Area(训练场)内的 Tree 游戏对象。

  5. 在 Hierarchy 中,选中 TrainingArea_Tree_01 游戏对象。

  6. 在 Inspector 中,单击 Add Component,然后搜索并选中 RhythmActions 脚本。

    RhythmActions 脚本专门用来调节其所绑定的游戏对象的比例。利用 Modifications 类,我们可以按照特定的 X、Y、Z 系数来设置游戏对象的比例。

    当然,您也可以修改这些滑杆值。不过,默认值应该足以清楚地呈现大树的呼吸效果。在 RhythmActions 脚本中,已经创建了一个 public 类型的 PushActions 函数。

    此函数会依据 Modifications Class 中的滑杆值来调节游戏对象的比例。具体来说,它会逐渐将 Modification 属性设置推送到 Transform 组件中,然后再恢复原样。接下来,我们回到 Wwise 游戏对象上绑定的 AkEvent 组件,并将 TrainingArea_Tree_01 游戏对象添加为回调引用。

  7. 在 Hierarchy 中,选中 Wwise 游戏对象,然后展开 AkEvent 并选中 Use Callbacks 复选框。

    在通过回调来触发 PushActions 函数之前,我们需要添加绑定了脚本的游戏对象,并准确输入函数名称。

  8. TrainingArea_Tree_01 游戏对象从 Hierarchy 拖到 AkEvent 的 Game Object 属性中。

  9. 在 Callback Function 属性中,键入 PushActions

    最后,我们还要添加 Callback Flag。这些 flags 可以用来表示 Music Segment(音乐段落)中的 marker (标记) 通知,比如当前正在播放的 Music Segment 的 Beat(拍子)、Bar(小节)、Entry(入口)或 Exit(出口)。所有这些通知(MusicSyncUserCue 和 Marker 除外)都不需要在 Wwise 中准备任何东西。

    在本次演示中,我们将使用 MusicSyncBar 通知。每次对应的 Event 进行到 Music Segment 中的一个小节都会调用该通知。

    [技巧]

    如需进一步了解各种 Callback Flag,请参阅 Wwise SDK 文档

  10. Callback Flags Property Drawer 中,仅选中 MusicSyncBar 一项。

    搞定!接下来,我们可以试玩游戏,并察看大树如何随着音乐律动。

  11. 进入 Play 模式,然后让 Player 走近 TrainingArea_Tree_01 游戏对象(位于 Village 方向)。

    大树会慢慢地伸缩,就像是在呼吸一样。通过将 RhythmActions 脚本关联到 Music_Region Event,我们做到了让大树随着音乐节奏舞动的效果,实现了画面与音乐之间的互动。除此之外,这种方式还可确保在音乐停止或暂停时大树也会静止不动。同时,还能通过修改音乐速度来调节互动效果。接下来,我们修改下速度试试。

  12. 在 Wwise 中,单击 Remote…(远程...),然后选中 Wwise Adventure Game (Editor),并单击 Connect(连接)。

  13. 在工具栏的 Search(搜索)字段中,键入 Music region,然后单击 Music_Region Switch Container(切换容器)。

  14. 在 Music_Regions Property Editor(属性编辑器)中,将 Playback Speed(播放速度)值拖到 2.5

  15. 切换回 Unity,再看看那棵树。

    我们注意到,大树仍会随着音乐的节奏舞动。但是因为我们调高了音乐的速度,所以它的伸缩动作明显加快了。假如大树没有流畅地完成整套收缩伸展动作,您可以调大 RhythmActions 脚本中的 Speed 参数。这样就可以在下一回调通知之前完成这套动作了。现在您可以退出 Play 模式了。

[备注]

在后面的练习中还会涉及到 Playback Speed,所以请记得将其重新设为 1。

利用 AkEvent 或 AkAmbient 组件,我们可以针对多个游戏对象便捷地设置回调。不过,这种方式并不适合用在需要应用于大量游戏对象的情形。因为要逐个添加,所以会比较麻烦。相对地,通过脚本实现回调要便利很多。对此,我们将在下节课程中详细说明。