视觉脚本教程(逻辑方块)
第一步:播放角色动画
Lesson 4 of 10 • 15 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
在本课中,我们将开始将动画集成到我们的Player逻辑中。
此时,玩家已经可以移动和跳跃。现在我们需要通过播放正确的动画,使角色在这些状态下产生视觉反应,例如闲置、行走、奔跑和下落。
主要思想很简单:我们将使用角色的当前状态来决定播放哪个动画。
例如:
- 如果玩家在地面上且没有移动,则播放闲置动画。
- 如果玩家在地面上且正在移动,则播放行走动画。
- 如果玩家正在奔跑,则播放奔跑动画。
- 如果玩家不在地面上,则播放下落动画。
这是创建角色控制器时最常见的模式之一。移动逻辑控制角色在做什么,而动画逻辑读取该信息以决定玩家应该看到什么。
1. 创建动画执行逻辑
现在我们学习了如何创建和组织事件,让我们为动画逻辑块创建一个新的事件,称为更新动画。
该事件将负责更新玩家的动画状态。
我们做的第一件事是将此事件连接到一个如果节点,该节点检查角色当前是否在地面上。这条信息将用于决定播放哪个动画。
例如,当玩家在地面上时,我们可以播放闲置、行走或奔跑动画。当玩家不在地面上时,我们可以播放下落动画。
接下来,我们需要访问动画组件,该组件负责管理和播放角色动画。
为此,我们首先获取实体,然后使用子节点获取名为Mesh的子对象,这是我们玩家的网格对象。通过这个子实体,我们可以访问动画组件。

由于我们可能需要多次访问动画组件,我们可以将获取实体、获取子对象和获取动画组件节点转化为可重用的函数。
为此,选择您想要的节点,右击,然后选择提升选择为函数。
这将创建一个包含此逻辑的函数,使图表更加整洁且易于理解。它还允许我们在逻辑积木的其他部分重用相同的流程,而无需再次重新创建相同的节点。

我们将这个函数重命名为播放动画。
在处理视觉逻辑时,使用清晰且描述性强的名称非常重要。当您的图表变得庞大时,良好的名称将帮助您快速理解每个事件、函数和逻辑块的职责。

现在双击播放动画函数以打开并进行编辑。
然后右击函数输入节点,添加两个新的输入引脚。
第一个输入将是:
- 动画,类型为字符串。
此输入将用于通知要播放的动画名称。

第二个输入将是:
- 混合,类型为浮点数。
此输入将用于控制动画之间的过渡时间。

这些参数使函数更具灵活性。
而不是为每个动画创建一个不同的节点块,我们可以使用相同的播放动画函数,每次调用时简单地传递不同的动画名称和混合值。

从获取动画组件的输出中,添加按名称播放节点。
该节点负责根据名称播放动画。
然后将我们在函数输入节点中创建的动画和混合参数连接到按名称播放节点的相应字段。
这意味着每当调用播放动画函数时,它将接收动画名称和混合时间,然后将这些值传递给按名称播放。
不要忘记在按名称播放节点中启用循环选项。
启用循环后,动画将在激活时持续播放,而不是在到达最后一帧时停止。这对于像闲置、行走、奔跑和下落这样的动画尤为重要,因为它们通常需要持续播放。
最后,将按名称播放节点的输出流程连接到函数输出,完成播放动画函数的执行。

现在播放角色动画变得更加容易。
返回检查玩家是否在地面的如果节点,并使用播放动画函数。
当条件为真时,意味着玩家在地面上,调用该函数并传递"p-idle"作为动画参数。这是角色静止时使用的动画。
当条件为假时,意味着玩家不在地面上,调用该函数并传递"p-fall"。这是角色在空中时使用的动画。
对于这两种情况,使用0.1作为混合值。这为动画提供了一个小的过渡时间,使变化更顺畅,而不是立即从一个动画跳转到另一个动画。

现在我们只需要在移动玩家事件的流程中调用更新动画事件。
这样,每次更新玩家移动逻辑时,动画逻辑也将得到更新。
这样,玩家将能够根据其当前状态在p-idle和p-fall之间切换。当玩家在地面上时,它将播放闲置动画。当玩家在空中时,它将播放下落动画。

完美。现在让我们继续开发玩家动画逻辑,添加移动动画。
为此,获取移动方向并使用长度节点来测量移动向量的强度。
移动向量的长度告诉我们角色是否正在移动。
然后添加一个如果节点来检查此值是否大于0。
如果结果为真,这意味着角色正在移动,因此我们可以播放行走动画p-walk。
如果结果为假,这意味着角色没有移动,因此我们应该播放闲置动画p-idle。
这使得玩家能够根据移动情况自动在静止和行走之间切换。


现在还有两个细节需要完成角色的移动动画行为:
首先,当玩家奔跑时,我们需要播放奔跑动画。
其次,我们需要让玩家面向它正在移动的方向。
要控制行走和奔跑动画,在检查玩家是否正在移动的节点之后添加一个序列节点。
然后获取是否正在奔跑属性并使用一个如果节点来检查其值。
如果是否正在奔跑为真,播放奔跑动画。
如果是否正在奔跑为假,播放行走动画。
这样,玩家不仅知道它是否在移动或停止,还知道在移动时应使用行走动画还是奔跑动画。
在我们刚刚添加的序列的第二个则输出中,使用平滑看向节点。
该节点将使角色平滑旋转,使其看向移动的方向。这使得移动感觉更加自然,因为角色网格将视觉上面向与移动相同的方向。

我们需要在发送到平滑看向之前将获取移动方向的值乘以-1。
这会反转方向向量,并校正角色网格所面临的方向。根据角色模型的导入或定向方式,视觉网格可能面向移动向量的相反方向。乘以-1可以修复此问题,使角色在移动时朝正确的方向。

之后,将已经乘以的方向连接到平滑看向节点。
接下来,我们还需要提供将被旋转的物体的变换。
为此,访问实体,然后获取玩家网格,使用获取变换节点。
此变换应连接到平滑看向,确保旋转应用于正确的对象,即角色的可视网格。

此时,玩家的动画逻辑已经更加完善。
角色现在可以根据其当前状态在闲置、下落、行走和奔跑动画之间切换。它还平滑地旋转以面对移动方向,使控制器的手感更加自然且在视觉上与游戏逻辑相连。