第 5 课

目录

利用 Wwise 专有属性设置 Switch

[备注]

在开始学习本节课程之前,请务必先完成“第 4 课 – 通过脚本发送 Event”。

我们在冒险家脚踏地面时成功地触发了脚步声,不过目前尚未设置各种各样的地表类型。

现在的所有脚步动作听起来都差不多,因为其全部使用源自同一地表材质(默认为泥地)的随机脚步声。为了让脚步动作听起了更加逼真,我们可以根据 Player 脚下的地表类型来播放不同的声音。在“第 4 课”中,我们编写了 PostWwiseEvent 脚本。每次冒险家在 Player_Sprint Animation Clip 中脚踏地面时都会发送一个 Event(事件)。在本节中,我们将为该脚本添加一些功能,以便兼顾游戏中的各种地表。为了确保根据地表材质准确地触发脚步声,我们可以直接在发送各个脚步声 Event 之前设置地表材质的类型。

在发送 Player_Footstep Event 时,Event 调用将经由两个 Switch(切换开关)和一个 Random Container(随机容器),来选择并播放单独的脚步声音频文件。

首先,会利用 Footstep_Surface Switch Container(切换容器)来确定地表类型;然后,会通过 Player 的运动速度来确定是播放步行脚步声还是奔跑脚步声。Surface_Type Switch Group(切换开关组)指派给了 Footstep_Surface Switch Container。通过在发送 Player_Footstep Event 之前设置此 Switch,Footstep_Surface Switch Container 可随时将调用指向正确的脚步声。

接下来,我们要在发送 Player_Footstep Event 之前设置 Surface_Type Switch Group。

  1. 在 Unity 菜单栏中,依次转到 Audiokinetic > Certification > 301 > Lesson 5,然后选择 Setting a Switch using a Wwise-Type

    首先,我们要确保 PostWwiseEvent 脚本和 Player 游戏对象仍处于绑定状态。

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

    Player 游戏对象是一个 Prefab。在“第 4 课 – 通过动画发送 Event”中按下 Apply 后,应当已将更改应用到了所有场景中的全部 Player 游戏对象。仔细看下 Inspector。假如您没有看到 PostWwiseEvent 脚本,请返回“第 4 课 – 通过动画发送 Event”并完成所有练习步骤。假如看到了脚本,请继续执行下面的操作。

    为了展示“不检测地表类型”这一问题,我们来连接游戏并使用性能分析器进行监控。

  3. 在 Wwise 菜单栏中,转到 Layouts(布局),然后选择 Profiler(性能分析器)。

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

  5. 在 Unity 中,单击 Play

    请不要发出任何攻击动作,而只是移动冒险家的位置。这样 Capture Log 中就不会出现大量使用同一 Surface_Type Switch Group 的 Player 攻击条目。

  6. 从泥地跑到草地,然后再返回泥地。

  7. 退出 Play 模式,然后在 Wwise 的 Capture Log(捕获日志)中单击 Filter...(筛选器...)按钮。

    Capture Log 中显示了各种各样的信息。为了简要了解 Switch 的变换,我们来滤除 Switch 以外的所有其他条目。

  8. Types(类型)中,取消选中 Switches(切换开关)以外的所有其他选项,然后单击 OK(确定)。

    在从泥地地表跑到草地地表时,理应把 Surface_Type 设为 Grass,进而将 Player_Footsteps 调用指向另一种声音。仔细看下 Capture Log,尤其是 Description(描述)和 Wwise Object(Wwise 对象)列。

    不过,目前并没有设置 Surface_Type Switch。也就是说,Footstep_Surface Switch Container 会始终使用默认的 Switch 值 (Dirt)。为了设置 Switch,我们先要简单了解一下《Wwise Adventure Game》中地表类型系统的工作原理。然后,在发送“第 4 课”创建的 PostWwiseEvent 脚本中的 Event 之前设置 Switch。

    最后,在接下来的步骤中确保选中 Move Tool。

  9. 在 Unity 的 Scene 视图中,选中冒险家脚下的橙色 Road Space 游戏对象。

    假如没有在地面上看到框线,您可以在 Scene 视图的 Gizmos 选项卡中选中 Selection Outline 方框。

  10. 在 Inspector 中,打开自定义的 SoundMaterial 脚本(专门开发用于《Wwise Adventure Game》)。

    SoundMaterial 脚本虽然比较简短,不过却非常好用。它只包含了一项 Wwise 专有 material 属性,用于直接通过 Wwise 专有 Switch 来标记游戏对象。这样的话脚步动作或武器攻击等各种行为就可利用该属性来获知所击中的表面类型。在《WAG》中,所有 SoundMaterial 脚本都已被创建环境模型的设计师指派给相应的 Switch(本例中为 Dirt)。接下来,我们并不会编辑该脚本。不过,至少要知道在通过 PostWwiseEvent 脚本调用时从哪设置 Wwise 专有 Switch Property Drawer。

    接下来,我们并不会编辑该脚本。不过,至少要知道在通过 PostWwiseEvent 脚本调用时从哪设置 material 属性。

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

  12. 在 Inspector 中,打开 PostWwiseEvent 脚本。

    接下来,我们先删除 PlayFootstepSound() 函数之上的函数说明,因为这些内容已经不再适用。

  13. 将“// 使用此函数进行初始化。”这一行全部删掉。

        
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
        
    public class PostWwiseEvent : MonoBehaviour {
        public AK.Wwise.Event MyEvent;
        public void PlayFootstepSound(){
            MyEvent.Post(gameObject);
        }
        
        // 每帧调用 Update 函数一次。
        void Update () {
        
        }
    }

  14. 在 MyEvent.Post(gameObject) 函数调用之上添加一个空白行。

    public AK.Wwise.Event MyEvent;
    public void PlayFootstepSound(){
    
        MyEvent.Post(gameObject);
    }

    为了检测 Player 脚下的地表类型(材质),我们将自定义的 MaterialChecker 脚本分别添加到了 Player 的两个 toe 游戏对象。您并不需要了解其中的细节,只需知道该脚本会检测 Player 左脚或右脚下的地表类型,并查找 surface 游戏对象,从而确定与其绑定的 SoundMaterial,并检索材质属性的 Switch 值。

    但是,如何找到 MaterialChecker 脚本呢?为了轻松管理 Player 的状态、相关游戏对象等,我们创建了自定义的 PlayerManager 脚本,以便确定 Player 迈出的是哪只脚。接下来,我们先编写 MaterialChecker's GetMaterial() 函数的路径。

  15. 在 MyEvent.Post(gameobject); 行之上的空白行中,键入 PlayerManager.foot_L.GetMaterial()

    public void PlayFootstepSound(){
        PlayerManager.foot_L.GetMaterial()
        MyEvent.Post(gameObject);
    }

    现在,我们创建了 GetMaterial() 函数来检测 Player 两只脚(foot_R 和 foot_L)下的地表类型,并返回 SoundMaterial 当前的 Switch 值。接下来,我们可以在发送 Event 之前使用 .SetValue() 函数来定义 Switch。

    [技巧]

    就跟 State 一样,您可以使用 .SetValue() 函数来设置 Switch。如需进一步了解如何设置 State,请参阅“第 8 课”。

  16. 在 PlayerManager.foot_L.GetMaterial() 之后,键入 .SetValue();

    public void PlayFootstepSound(){
        PlayerManager.foot_L.GetMaterial().SetValue();
        MyEvent.Post(gameObject);
    }

    我们注意到,SetValue() 函数下方显示了红线。这是因为需要在 SetValue 的圆括号中指定游戏对象。State 的作用域为所有游戏对象(整个游戏当中只能有一个当前 State),而 Switch 的作用域为某个特定游戏对象。也就是说,在 Switch 变化时,只会影响针对同一游戏对象发送的 Event。在当前场景中,PostWwiseEvent 绑定在了 Player 游戏对象上。所以,为了给 Player_Footstep Event 设置新的 Switch,我们需要指定到与所发送 Player_Footstep Event 相关联的同一游戏对象。

    [备注]

    在 Unity 中,可通过键入 gameObject 找到与脚本绑定的游戏对象。

  17. SetValue() 的圆括号之内,键入 gameObject

        
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
            
    public class PostWwiseEvent : MonoBehaviour {
        public AK.Wwise.Event MyEvent;
        public void PlayFootstepSound(){
            PlayerManager.foot_L.GetMaterial().SetValue(gameObject);
            MyEvent.Post(gameObject);
        }
    
        // 每帧调用 Update 函数一次。
        void Update () {
        
        }
    }

    我们来总结一下。首先,Player_Sprint Animation Clip 会触发与 PlayFootstepSound() 函数关联的 Animation Event。然后,此函数有两个作用。它会通过 PlayerManager 来调用 CheckMaterial 的 GetMaterial() 函数,以此检索 Player 某只脚下的材质。因为 material 属性是 Wwise 专有 Switch,这样便可接着使用 .SetValue() 函数来针对 Player 游戏对象设置 Switch(对应左脚下的地表)。而且,现在为 Player 设置了正确的 Switch,所以可以根据同一游戏对象来发送 Player_Footstep Event。再次强调,请务必保存脚本中所执行的更改以便应用到 Unity 中。

  18. 按下 CTRL+S(在 Windows 上)或 CMD+S(在 Mac 上),以便保存脚本

    接下来,重复测试步骤。

  19. Remote Connections(远程连接)视图中,选中 Wwise Adventure Game (Editor) 并单击 Connect(连接),然后在 Unity 中按下 Play 按钮进入场景,并反复地从某一地表类型跑到另一地表类型。

  20. 退出 Play 模式,然后在 Wwise 中察看 Capture Log 的 DescriptionWwise Object 列。我们注意到,现在成功设置了 Dirt 和 Grass Switch。

通过利用 Wwise 专有 Switch 来标记游戏中的地表,我们实现了脚步声随 Player 脚下地表的动态变化。一旦设置好这一系统,以后在游戏中构建更多区域时只需根据听觉效果来标记地表即可。

[技巧]

目前的步骤只展示了如何获取左脚下的 SoundMaterial,但在理想情况下应该交替获取左脚和右脚下的 SoundMaterial。若要了解如何设置此类系统,不妨看下 AdventuressAnimationEventHandler 脚本的 TakeFootstep() 函数。