评估场景需求
本节的目标是添加脚步声到角色身上,当角色走路时,触发动画事件并播放声音。
脚步声是我们在真实世界中常常被我们所忽视的声音,但脚步声能够传达出许多环境信息。你现在可以花一小段时间绕着你周围的环境走一走并仔细听听脚步声。如果可能的话,在不同的表面上都行走一下,然后感受一下脚步声在不同的表面上的声音有什么不同(比如地毯和木地板上)?光脚和穿鞋时声音有什么不同?
在示例场景中,我们可以看到三种不同的地面:草地、池子的水和洞穴。当玩家走过这些表面时,应该有不同的脚步声。
添加动画事件(Animation Events)
我们希望达到的效果是,当角色的脚正好碰到地面时,会播放对应的脚步声。在Unity中,我们可以通过使用动画事件来完成这个功能,将角色动画动作过程的某个部分关联出对应音效的播放。动画事件的工作原理和关键帧是类似的,但它不是用来告诉角色该如何运动,而是发送一个消息,这个消息能够被脚本用来做一些事情。在案例中,我们会使用一个预先写好的脚本来播放脚步声。
1. 进入到放置动画的目录,Assets > CreativeCore_Audio > StarterAssets > ThirdPersonController > Character > TutorialAnimations。
2. 选择Locomotion--Walk_N动画
3. 在Inspector中,选择Animation标签页,展开Events部分。
Events展开后,主要有一个小的时间轴和一不同类型数据的列表,这些数据是能够被发送出去的,但目前我们没有添加任何事件,因此是灰色的。
4. 我们可以按住并向上拖动动画预览窗口上的带两条线的地方,将预览窗口放大一些。
我们想要做的是在动画播放到角色的脚步刚好接触地面的时候,触发一个动画事件。为了达成这个目标,我们需要先在动画中定位到这个点。我们可以通过在动画预览窗口中手动拖动关键帧来得到这个点(左键按住播放键右边的那个灰色条进行拖动)。在拖动过程中, Event时间轴会调整到预览动画的对应位置。
5. 拖动到角色左脚刚好接触地面的这一帧(大概是第9帧的位置)。
6. Inspector中回到Events部分,点击Add Event按钮。
此时在Event时间轴上动画指定的点上,会出现一个小的标志。这会启用时间轴下方的数据类型。
7. 在funtion参数中,输入“PlayStep”。这个名字是后面我们要使用的脚本里的一个方法是对应的,因此确保这个名字拼写是没有问题的。
8. 重复这个步骤,将玩家右脚正好接触地面时的PlayStep的Event也设置好。
9. 在Inspector的底部,点击Apply按钮,保存事件到动画中。
10. 在Animations目录中找到Run和Jump Landing的动画,重复上面添加event的过程。记住最后要点击Apply按钮保存修改。
应用Audio脚本
目前动画已经配置成了当角色脚接触地面的时候,会发送出一个事件请求。这个事件会传递给和动画相连接的游戏对象,因此管理脚步声播放的脚本必须被用到角色上。为了能实际为动画播放声音,我们还需要给角色增加一个Audio Source组件。
1. 在Scritps目录下,找到FootstepManager脚本。将这个脚本添加到Hierarchy里的ThirdPersonController里的PlayerArmature游戏物体上。
2. 保持player被选中,在其Inspector中点击Add Component按钮,然后搜索并选择Audio Source。
探索声音脚本
我们简单看看FootstepManager脚本。在Inspector中,我们可以看到它下面有三个下拉菜单,标记为grass,water和cave,分别对应三种不同的脚步声。这些下拉菜单表示的是多个脚步声的list。在后面我们会讨论原因。
如果我们想更深入了解一下脚本里到底干了什么事,可以打开脚本,重点关注一下几点:
OnControllerColliderHit方法会检测player当前行走在什么类型的表面上,它是通过检查关联的tag来实现这个功能的(这些tag我们会在后面添加)。
当场景中发生了我们之前配置的动画事件,它会调用PlayStep方法,这个方法会随机从前面我们看到的不同类型的表面的脚步声list中选择其中一种出来进行播放。
给场景的不同表面打tag
为了要让脚本知道该播放哪类声音,FootstepManager首先需要知道player当前站在哪种类型的表面上。我们可以通过使用tag来实现这个功能。
1. 在场景视图中选择grass表面。在Inspector的顶部,选择Tag处的下拉菜单,然后在列表底部选择Add Tag。
2. 在Tags and Layers中,选择“+”按钮,添加一个新的tag。将新tag命名为“Grass”,注意这里因为脚本需要使用,名字必须拼写正确。
3. 再创建两个新的tag:Water和Cave。
4. 在场景中再次选择grass表面,将tag设置为Grass。
5. 选择场景视图中的water表面,将tag设置为Water。
6. 选择场景视图中的cave,将tag设置为Cave。
添加脚步音频片段
目前场景已经为脚步声脚本播放合适的声音做好了配置,接下来我们要将对应的音频片段添加进来了。之前我们说过,脚本的每种类型的Audio clip片段变量是一个列表,这个列表可以包含多个音频片段。脚本里会随机选择其中一个进行播放。这里为什么要用多个音频片段呢?如果我们只为每种类型的脚步声添加一个音频片段会怎样呢?
1. 在Audio文件夹中,选择一种grass脚步声片段,将它拖动到FootstepManager脚本组件(和PlayerArmature关联)里的Grass Steps变量上。在列表中会自动出现这个音频片段。
2. 重复上面的步骤,添加water和cave的脚步声片段。
3. 运行场景,四处走动一下,控制角色分别在三种不同的表面上行走。
刚开始我们可能还没什么感觉,但如果我们在场景上控制角色多走一会儿,我们会很快开始觉得脚步声没有什么变化。也许在切换到不同表面的时候,我们还能有点明显的感受,但最终我们都会注意到其实每种声音都是固定的一种,没有变化,会让人感到无聊。
由于角色在实际的游戏中在各个场景里基本是保持不变的,可以确定的一件事是玩家最终肯定会察觉到这些单调的脚步声。脚步声只有一种,也不符合我们在真实世界中的体验。真实世界中,我们的每一步即便踩在相同的地面上,由于动作上的细微差异,可能重一点或轻一点,也可能是会多摩擦了一会儿地面,会导致声音有变化。虽然我们不可能在游戏中为一种脚步声添加成百上千种音频片段,但多几个片段随机选择总会比单一重复的一种片段要好得多。
4. 在Audio目录中选择所有的grass脚步声片段,拖动它们到Inspector中FootstepManager脚本组件(和PlayerArmature关联)里的Grass Steps列表上。
5. 重复上面的步骤添加water和cave对应的所有脚步声片段。
6. 运行场景,控制角色在不同的平面上行走,听听看效果有什么不同。
探索:进一步定制脚步声
在前面我们用了一些不同的脚步声音频片段来实现草地、水面和洞穴情况时的音效。实际在在Unity中替换这些音频片段非常简单。接下来我们可以去试试加入不同的音频片段,可以天马行空一下,比如角色踩到草地上时,我们播放羊叫的声音。
除了Unity的资源商店,网络上还有很多地方提供了很不错的音效文件。比如:
OpenGameArt.orghttps://opengameart.org/Freesound - FreesoundFreesound: collaborative database of creative-commons licensed sound for musicians and sound lovers. Have you freed your sound today?https://freesound.org/ 不管我们怎么拿到音频文件的,有一点需要我们注意的是我们所使用的音频的license。license类型会告诉我们对应音频文件的使用者所需要注意的地方,比如下面这个Open Game Art的例子(Public Domain):
更多关于音频文件license的说明,可以参考一下这里:
用别人的音乐做背景音乐的各类短视频侵权了吗? - 知乎认同@广州版权产业服务中心 的说法,首先音乐是有版权的,无论是谁使用这段音乐都需要授权,不分个人用还…https://www.zhihu.com/question/277603079/answer/831076868 在Unity中,可以使用的音频文件格式有:aif, .wav, .mp3 以及.ogg。