在本节中,你将为玩家角色添加脚步声,以增强在关卡中奔跑时的真实感。 你将根据玩家行走的表面类型,使用Sound Cues创建不同的声音。
你将创建物理材质来表示不同的地面类型。 例如,在金属地面上行走时,这种声音应该与在石头地面上行走时有所不同。你还将创建一个自定义数据资产,用于存储表面类型和对应的声音信息。 使用数据资产可以让你在未来更容易添加新的表面类型和声音,而无需修改蓝图代码。
最后,你将在游戏已有的蓝图函数库 ——BPL_FPGame中创建一个函数。 该函数随后会调用数据资产中的另一个函数,根据检测到的表面类型返回正确的音效。
开始之前
请确保你已理解《解谜冒险游戏美术创作指南》和虚幻引擎新用户指南教程系列的前几节中涵盖的相关内容:
创建Sound Cue和声音衰减资产。
蓝图基础知识,包括创建变量和函数,以及创建和连接节点。
你将在示例项目文件和内容包中使用以下资产:
S_Metal-1声波
S_Metal-2声波
S_Metal-3声波
S_Stone-1声波
S_Stone-2声波
S_Stone-3声波
S_DefaultStep-1 声波
S_DefaultStep-2声波
S_DefaultStep-3声波
BPL_FPGame蓝图函数库
BP_AdventureCharacter蓝图
ABP_Unarmed动画蓝图
创建带有脚步声的Sound Cue
首先,创建两个Sound Cue:一个用于金属地面脚步声,一个用于石头地面脚步声。
要创建Sound Cue,请执行以下操作:
打开内容浏览器,并导航到AdventureGame > Artist > Audio。
在音频(Audio)文件夹中右键单击,选择新建文件夹,并命名为Footsteps。
在脚步(Footsteps)文件夹中右键单击,选择Audio > Sound Cue。 将其命名为SC_Footsteps_Metal并打开。 此资产中已经包含一个Output节点,它会根据其所连接的节点来播放声音。
在图表的任意位置右键单击并添加一个Wave Player节点。
选择Wave Player节点,并在左侧面板中将声波修改为S_Metal-1。
再添加两个Wave Player节点,并重复上述步骤,为它们分别选择在设置项目与导入内容中导入的S_Metal-2和S_Metal-3声波文件。
在图表中右键单击并添加一个Random节点。 在Random节点中点击Add input一次,以添加第三个输入。
将每个Wave Player节点连接到Random节点的一个输入引脚。
将Random节点连接到Output节点。
保存Sound Cue。
接下来,创建两个Sound Cue资产:一个用于随机播放石头地面上的脚步声,另一个用于默认脚步声:
再创建一个名为SC_Footsteps_Stone的Sound Cue资产。
对于Wave Player节点,使用 S_Stone-1、S_Stone-2和 使用你在设置项目与导入内容教程中导入的S_Stone-3音频资产。
创建一个名为SC_Footsteps_Default的Sound Cue资产。
对于Wave Player节点,使用音频资产S_Default-1、S_Default-2和S_Default-3。
创建物理材质
现在你已经创建了Sound Cue,接下来将创建两个物理材质来表示不同的表面类型。 稍后你将把脚步声与这些物理材质进行匹配。
物理材质用于定义物理对象在与世界动态交互时的物理响应。 这些材质也可以在游戏运行时用于识别不同类型的地面。
例如,在本教程中,你将创建名为PM_Metal和PM_Stone的物理材质,分别表示金属和石头表面。 随后,你将检查玩家当前行走的表面类型,并根据该信息播放对应的Sound Cue。
要创建物理材质,请执行以下操作:
前往内容浏览器,并进入AdventureGame > Artist > Materials文件夹。
在材质(Materials)文件夹中右键单击,进入物理(Physics) ,然后选择物理材质(Physical Material)。
在选择物理材质类(Pick Physical Material Class)窗口中选择PhysicalMaterial,然后点击“选择”(Select)。
将此资产命名为PM_Metal。
再创建一个物理材质,命名为PM_Stone。
物理材质是一种数据资产,可以用于更改表面的各种属性,例如摩擦力。 对于这些物理材质,你不需要在资产本身中修改属性。 你应该将这些资产分配给不同的材质,从而改变其各自的表面类型。
使用数据资产蓝图类分配脚步声
接下来,你将创建一个新的蓝图数据资产类,用于存储脚步声音效,并创建一个函数,根据对象材质所分配的物理材质返回正确的脚步声。
要设置控制脚步声的蓝图数据资产,请执行以下操作:
在内容浏览器中进入AdventureGame > Artist > Audio > Footsteps文件夹。
右键单击并创建一个蓝图类。
在选择父类(Pick Parent Class)窗口中,展开全部类(All Classes)下拉菜单,搜索并选择PrimaryDataAsset。
将此资产命名为BP_DA_FootSteps并将其打开。
在我的蓝图面板中,新建一个变量:
将其命名为FootStepSounds。
选中该资产,然后在细节面板中进行设置:
将变量类型改为物理材质(对象引用)。
将容器(Container)改为映射(Map)。
将映射值类型(Map Value Type)改为Sound Cue(对象引用)。
默认的变量类型为布尔。 由于布尔类型无法进行映射,如果不先更改变量类型,就无法使用映射容器。
添加另一个变量:
将其命名为DefaultFootSteps。
将其类型改为Sound Cue。
由于默认脚步声只有一个Sound Cue,并且只有在对象材质没有指定物理材质时才会播放,因此可以将其容器类型更改为单个变量。
映射变量是一种数据对列表,它将一种资产类型链接到另一种资产类型。 FootStepSounds变量将每种物理材质映射到对应的Sound Cue。
要设置FootStepSounds以将材质与声音关联,请执行以下操作:
编译蓝图,这样就可以编辑变量的默认值。
选择FootStepSounds变量。 在细节面板的默认值下,添加一个新元素。
在物理材质字段中选择PM_Stone资产。
在Sound Cue字段中选择SC_Footsteps_Default资产。
重复上述步骤,再添加一个元素,并将PM_Metal与SC_Footsteps_Metal进行关联。
选择FootStepSounds变量。 在细节面板中的默认值下添加SC_Footsteps_Default。
要构建蓝图逻辑,请执行以下操作:
在我的蓝图面板中,新建一个函数,命名为fnGetFootStepSounds。 该资产会在一个新的选项卡中打开。
选择该函数,并在细节面板中执行以下操作:
添加一个新的Input,命名为PhysicalMaterial,类型为物理材质。
添加一个新的Output,命名为SoundCue,类型设置为Sound Cue。
在图表中,断开函数入口节点(fnGetFootStepSounds)与Return Node之间的连线。
在函数图中,将FootStepSounds变量拖入图表并选择Get。
从Foot Step Sounds节点的引脚拖出,添加一个Find节点。
从Find节点,将第二个输入引脚连接到fnGetFootStepSounds节点的Physical Material引脚。 这是你之前添加的输入参数。
在fnGetFootStepSounds节点上,拖出exec引脚并添加一个Branch节点。 将Condition引脚连接到Find节点底部(红色)的输出引脚。
从Branch节点,将True引脚连接到Return Node。
从Return节点拖出Sound Cue引脚,并连接到Find节点顶部(蓝色)的输出引脚。
从Branch节点拖出False引脚,并添加另一个Return Node。
在新的Return Node上,从Sound Cue引脚拖出并添加Get Default Foot Steps节点。
编译并保存此蓝图。
该函数会检查FootStepSounds Map中是否存在对应的物理材质(函数输入)。 如果找到了物理材质,函数将返回与该物理材质关联的Sound Cue作为输出变量。
如果没有找到物理材质,则返回DefaultFootSteps Sound Cue。
设置默认脚步声
接下来,你将创建一个数据资产来管理蓝图使用的值。 该资产作为一个配置层,允许你在不修改或重新编译蓝图的情况下添加、删除或更新物理材质和Sound Cue。 执行以下步骤:
在内容浏览器中进入AdventureGame > Artist > Audio > Footsteps文件夹。
右键单击并选择Miscellaneous > Data Asset。 (选择带有圆形图标的数据资产类型。)
选择BP_DA_FootSteps数据类作为数据资产实例。
将此资产命名为DA_FootSteps并将其打开。
对于默认脚步,选择SC_Footsteps_Default。
展开脚步声(Foot Step Sounds),并确保列表中包含两个FootStepSounds映射元素。
保存该数据资产。
构建用于播放脚步声的函数
接下来,你将在函数库中创建一个函数来播放脚步声。 项目中的任何蓝图类都可以使用蓝图函数库中的函数。
要创建并设置一个新的函数,请执行以下操作:
在内容浏览器中进入AdventureGame > Designer > Blueprints > Core,然后打开BPL_FPGame蓝图函数库。
在我的蓝图面板中,新建一个函数,命名为fnBPLPlayFootStepSound。
选择新函数,在细节面板中添加一个新的输入,命名为PlayerReference,类型为Pawn。
设置玩家与地面之间的线条检测,请执行以下操作:
从fnBPLPlayFootStepSound节点的exec引脚拖出连线,并添加一个Line Trace By Channel节点。
从Line Trace By Channel节点拖出Start引脚,并添加Get Actor Location节点。
在节点操作(Node Actions)列表中,如果找不到某个节点,请记得关闭上下文关联(Context Sensitive)选项。
从Get Actor Location节点的Target引脚拖出,添加一个Get Player Reference节点。
从Get Player Reference节点的输出引脚拖出,添加一个Make Array节点。
将Make Array节点的数组输出引脚连接到Line Trace By Channel节点的Actors to Ignore引脚。
从Get Actor Location节点拖出Return Value引脚,并添加一个Subtract节点。
将Subtract节点的输出引脚连接到Line Trace By Channel节点的End引脚。
在Subtract节点中,将Z值设置为500。
该操作会从玩家位置向下500个单位发射一条射线进行检测,并忽略玩家角色自身。 在下一部分中,你将根据线条检测返回的表面类型,为角色分配正确的脚步声。
按照以下步骤使用你之前创建的数据资产来分配正确的脚步声:
从Line Trace By Channel节点拖出Out Hit引脚,并选择Break Hit Results。
创建一个本地变量,将其命名为FootStepsAsset,并将类型设置为BP_DA_FootSteps(对象引用)。 将其默认值设置为DA_FootSteps。
将FootStepsAsset变量拖到事件图表中,并选择Get FootStepAsset。
从FootStepsAsset节点拖出,搜索并选择fnGetFootStepSounds。
将LineTraceByChannel节点的Exec引脚连接到FnGetFootStepSounds节点。 展开Break Hit Results节点,并将Phys Mat引脚连接到FnGetFootStepSounds节点的Physical Material引脚。
从FnGetFootStepSounds节点拖出,搜索并选择播放指定位置的声音(Play Sound At Location)。
将PlaySoundAtLocation节点的Sound引脚连接到FnGetFootStepSounds节点的Sound Cue引脚。
拖出PlaySoundAtLocation节点的Location引脚,搜索并选择获取Actor位置(Get Actor Location)。 拖出其Target引脚,并添加Get Player Reference节点。
保存并编译函数。
它使用数据资产中的函数fnGetFootStepSounds,传入一个物理材质,并返回要播放的Sound Cue。
使用脚步声更新动画蓝图
下一步是修改玩家角色的动画蓝图,在角色的每只脚接触地面时调用FnBPLPlayFootStepSound函数。
大多数Manny角色(包括本项目中使用的角色)默认使用包含通知(Notifications)的动画。 动画通知(Animation Notifications,也称为Animation Notifies,或简称Notifies)可以让你创建与动画序列同步触发的可重复事件。 这些事件可以是声音(例如,行走或奔跑动画的脚步声)、生成粒子和其他类型。
虽然你可以将通知手动添加到动画序列中,但虚幻引擎模板中提供的大多数运动动画已经包含默认的动画通知,这些通知会在角色脚接触地面时触发(FootPlant)。
按照以下步骤查看默认的动画通知:
在内容浏览器中,打开玩家角色使用的动画蓝图。 对于示例项目中的BP_AdventureCharacter,导航至Content > Characters > Mannequins > Anims > Unarmed,并打开ABP_Unarmed。
在右上角点击动画按钮(绿色奔跑小人图标)。 此操作会在虚幻引擎中的新标签页中打开该蓝图动画。
如果想更改当前播放的动画,点击动画按钮旁边的三个点,然后选择任意行走或奔跑动画。 例如,MF_Unarmed_Jog_Fwd。
提示:你也可以直接从内容浏览器打开慢跑动画。
在时间轴中,你会看到脚落地通知(Footplant Notifies)。
你可以添加新的通知,也可以修改已有的通知,从而构建自己的系统,在需要时触发一系列事件。 在本教程中,你将使用角色动画自带的默认通知。 这些通知分别命名为AN_FootPlant_Right和AN_FootPlant_Left。
要将动画的通知(Notifies)添加到蓝图中并播放脚步声,请执行以下操作:
返回到ABP_Unarmed。
在事件图表中右键单击,添加AnimNotify_AN_FootPlant_Left节点。
从Notify节点拖出引脚,搜索并选择FnBPLPlayFootStepSound。
添加一个AnimNotify_AN_FootPlant_Right节点,并将其连接到FnBPLPlayFootStepSound节点的exec输入引脚。
从FnBPLPlayFootStepSound节点拖出Player Reference引脚,并添加Get Player Pawn节点。
编译并保存该动画蓝图。
这样,每当动画蓝图中的脚落地通知被触发时,它就会播放脚步声。
如果你的角色使用了额外的动画蓝图,那么你也需要在这些动画蓝图中添加相同的代码。
更新玩家角色蓝图以播放脚步声
接下来,你将修改玩家蓝图,并添加逻辑,使角色在落地时播放声音(例如从跳跃或下落后落到地面的情况)。 由于你在蓝图函数库中创建了FnBPLPlayFootStepSound函数,因此可以在玩家角色蓝图中重复使用该函数。
要修改玩家蓝图,请执行以下操作:
打开内容浏览器,并进入AdventureGame > Designer > Blueprints > Characters文件夹。
打开BP_AdventureCharacter蓝图,并进入事件图表选项卡。
在图表空白处右键单击并添加Event On Landed节点。
拖出 从EventOnLanded节点的exec引脚拖出连线,搜索并选择FnBPLPlayFootStepSound。
从FnBPLPlayFootStepSound节点拖出Player Reference引脚,并添加一个Self节点。
编译并保存此蓝图。
为地面分配物理材质
接下来,你将为多个表面分配物理材质。 执行以下步骤:
在关卡中选择一个表面,例如地面对象。
在细节面板的碰撞(Collision)部分,将物理材质重载(Phys Material Override)更改为你之前创建的某个物理材质。
重复上述步骤,将两种物理材质类型添加到关卡的一些地面上。
你也可以通过以下方式为材质实例添加物理材质:
打开材质实例,并进入细节面板。
向下滚动到通用(General)部分,点击物理材质(Phys Material)下拉菜单并选择你需要的物理材质。
保存该材质实例。
测试脚步声
运行游戏,在带有物理材质的表面上行走或跳跃,即可听到对应的脚步声。
如果该表面设置了物理材质,你就会听到与之对应的脚步声。 如果没有检测到物理材质,则播放默认脚步声。
下一步
在下一个模块中,你将学习如何使用Niagara VFX系统创建火焰视觉效果,并将其应用到你的火焰陷阱上。