文章目录
- 一、State Machines
- 二、Blend Spaces
- 三、Aim Offset
- 四、Montage

初步介绍
Unreal Engine 5 Tutorial - Animation Blueprint Part 1: State Machines (youtube.com)
Unreal Engine 5 Tutorial - Animation Blueprint Part 2: Blend Spaces (youtube.com)
Unreal Engine 5 Tutorial - Animation Blueprint Part 3: Aim Offsets (youtube.com)
Unreal Engine 5 Tutorial - Animation Blueprint Part 4: Montages (youtube.com)
这里我们使用虚幻争霸中的资产实现动画效果,将该资产导入到工程中,创建一个BP_Character,实现基本的人物运动和相机运动系统

一、State Machines
首先我们将 狂 的骨骼网格体导入 BP_Character 中

然后创建一个 Animation Blueprint,命名为 ABP_Character,进入 Event Graph,首先进行 Animation 初始化,在这里创建两个变量方便我们获取 Character 的信息

同时在这里我们可以创建一个 Vector 变量去保存 Character 的速度,命名为 CurrentVelocity

进入 AnimGraph,我们创建一个 State Machine 并命名为 Locomotion,然后进入 Locomotion 之中创建两个 State ,分别命名为 Idle 和 Walk,将他们连接起来

进入 Idle 中,拖入 Idle 的动画,然后开启 Loop Animation

进入 Walk 中 ,同样的操作

然后在两个判断中判断速度是否为 0, 如果为 0 则从 Walk 转到 Idle,反之则从 Idle 转到 Walk;
这里不知道为什么会有阴影,预测是材质问题,这里技术受到限制,先不处理

得到结果如下

二、Blend Spaces
Blend Spaces 可以让不同方向的动画很好的混合,这里有两种混合空间,一种是 2D blend space,另一种是 1D blend space
在这里我们将 Horizontal Axis 命名为 Direction,设置最大为180,最小为-180用来对应左右偏移角度,同时开启 Snap to Grid 方便将动画放置在 grid 网格上
将 Vertical Axis 命名为 Speed,设置最小值为0,最大值为600,同样开启 Snap to Grid 方便将动画放置在 grid 网格上

下面放置一排的 Idle 是为了加速动画的转换,其左右方向和我们看到的一致,在 Direction 为 180 或者 -180 时候, Character 是向后运动的,因此我们需要放置向后移动的动画
接下来我们进入 ABP_Character 中进行配置
由于在 Blend Space 中我们配置了一个 Direction,所以我们需要在 Event Graph 中定义一个参数

接着我们在 AnimGraph 中设置 Movement,要注意的是,这里的速度一般指的是地面速度,因此我们可以直接使用 Vector Length XY 来计算 地面速度

但是目前并没有向左或者向右移动的效果,因为我们开启了 Orient Rotation to Movement,将 Orient Rotation to Movement 设置为 False

这种效果可以在锁定敌人的时候使用,但是这样我们还需要设置一下 CharacterMovement,开启 Use Controller Desired Rotation

最后我们可以得到效果如下

三、Aim Offset
Aim Offset 可以用来独立移动某一部位,如头的朝向以及手或者武器的朝向,additive animation 基本上意味着在当前播放的动画之上添加动画信息
其动画资产的命名方式一般为 XX_AO_XX,其中 AO 表示 Aim Offset,其 frame 一般也只有一帧
在动画资产的 Additive Settings 中,我们需要将 Additive Anim Type 设置为 Mesh Space,Base Pose Type 设置为 Selected animation frame,Base Pose Animation 设置为 AO_CC,这样可以计算出当前动画与Base Pose Animation动画的变化从而发生改变

右键创建一个 Aim Offset,选择骨骼后命名为 AO_Character

这里将 Horizontal Axis 命名为 Yaw,范围设置为 -180 到 180,开启 Snap to Grid,另一边将 Vertical Axis 命名为 Pitch,范围设置为 -90 到 90,开启 Snap to Grid

由于 Yaw 的计算是从0 -> 180,180接着-180,然后是-180 -> 0,因此我们需要保证Yaw 在 180和-180位置上的动画是一致的
在这里如果出问题,我们只需要换一下 Preview Base Pose 就好

这里 Aim Offset 就设置完毕了,接下来我们需要去 ABP_Character 中设置 Yaw 和 Pitch,首先在AnimGraph中拖入 AO_Character,设置两个变量 Yaw 和 Pitch,由于 AO 是一个附加动画,因此我们只需要加原来的动画添加到 AO 上,然后将 AO 与 Output Pose 连接就好

在 Event Graph 中创建一个计算 Yaw 和 Pitch 的函数,有如下两种方法,其区别在与是否使用 Clamp Angle 以及 Interp Speed
方法一有摇头动作,因为在Yaw在-180到180过度时候两种状态不一致, 因此使用 RInterp To 的 Interp Speed 进行状态的插值时间过度

得到效果如下

方法二没有摇头动作,由于 Yaw 在 -180 和 180 上的动画一致,所以有衔接性,无需插值过度,讲究就是一个效率

得到效果如下

在这里如果我们在旋转的时候,Character 也跟着旋转,那就是 Character Movement 的问题,我们需要关闭 Use Controller Desired Rotation 和 Orient Rotation to Movement

这里的动画是 Separate 分开处理的,CC,CU,等表达很明确,如果是一个完整的聚合动画,我们需要拆分这个动画,方法如下

四、Montage
Montage 是一个高级的动画资产,允许打断动画并将指定动画插入到动画之中,例如攻击,可以中断所播放的任何动画进行攻击。同时可以在底部的时间轴添加多个动画和动画循环效果,如实现死亡倒地的循环。还有一些更高级的技术,因此 Montage 是十分重要的
这样看来,DefaultSlot Montage 有点类似于 AO,不过前者功能更加高级
在设置 Montage 之前,我们需要在 ABP_Character 的 AnimGraph 中设置一个 Slot DefaultSlot,这个 Slot 是为了播放 Montage 准备的,在 Slot 的右侧 Details 中的 Setting 中我们可以设置 Slot Name,这里默认设置为 DefaultSlot,要注意的是,这里的 Slot Name 要与 Montage 中的 Slot 相对应。在这里我们为了方便,对 State Machine 创建了一个 Cache 去存储,以便可以重复调用

接下来我们来创建 Montage,选择动画右键创建 Montage

在 Montage 之中,我们把 slot name 命名为 DefaultSlot

然后回到 BP_Character 中我们创建一个简单的触发 Montage 事件

得到效果如下

可以发现播放 Montage 的时候运动会出现滑动现象,为了解决这一问题,我们需要对动画进行分层,即身体上半部分执行一个动画,下半部分执行一个动画,回到 ABP_Character 中,我们创建一个 Layered blend per bone,将 AO 处理后的 Pose 传给 Base Pose,slot Montage 传入给Blend Poses 0,同时我们将需要混合 Blend Poses 0 的 spine_01 部位 在 Layer Setup 上指定

执行效果如下
