文章目录
- 一、State Machines
- 二、Blend Spaces
- 三、Aim Offset
- 四、Montage
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bb675caec2a647d8a909b2648d1e8b68.gif#pic_center)
初步介绍
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,实现基本的人物运动和相机运动系统
![](https://img-blog.csdnimg.cn/direct/5bbacfd6280b4553bcfa42da2faf0ca0.png)
一、State Machines
首先我们将 狂 的骨骼网格体导入 BP_Character 中
![](https://img-blog.csdnimg.cn/direct/b419e993e2aa452ab70de73c03108d74.png)
然后创建一个 Animation Blueprint,命名为 ABP_Character,进入 Event Graph,首先进行 Animation 初始化,在这里创建两个变量方便我们获取 Character 的信息
![](https://img-blog.csdnimg.cn/direct/05cf244942f24042bb79367ac471ca41.png)
同时在这里我们可以创建一个 Vector 变量去保存 Character 的速度,命名为 CurrentVelocity
![](https://img-blog.csdnimg.cn/direct/2c7852cc927049caa1bfcee486e0c9d6.png)
进入 AnimGraph,我们创建一个 State Machine 并命名为 Locomotion,然后进入 Locomotion 之中创建两个 State ,分别命名为 Idle 和 Walk,将他们连接起来
![](https://img-blog.csdnimg.cn/direct/27d5acfeed0f47ffa28017eade1ea67f.png)
进入 Idle 中,拖入 Idle 的动画,然后开启 Loop Animation
![](https://img-blog.csdnimg.cn/direct/d91579379ef64b44b68f744fbe6a42dd.png)
进入 Walk 中 ,同样的操作
![](https://img-blog.csdnimg.cn/direct/e91fa5c7950342348cc41c6b79cd09bd.png)
然后在两个判断中判断速度是否为 0, 如果为 0 则从 Walk 转到 Idle,反之则从 Idle 转到 Walk;
这里不知道为什么会有阴影,预测是材质问题,这里技术受到限制,先不处理
![](https://img-blog.csdnimg.cn/direct/7b9d05a8c2b04944811a27f93164ae46.png)
得到结果如下
![](https://img-blog.csdnimg.cn/direct/9e95884ed47d48daa884628af8c3813e.gif)
二、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 网格上
![](https://img-blog.csdnimg.cn/direct/ad2571bbb448444c864593f1e5295389.png)
下面放置一排的 Idle 是为了加速动画的转换,其左右方向和我们看到的一致,在 Direction 为 180 或者 -180 时候, Character 是向后运动的,因此我们需要放置向后移动的动画
接下来我们进入 ABP_Character 中进行配置
由于在 Blend Space 中我们配置了一个 Direction,所以我们需要在 Event Graph 中定义一个参数
![](https://img-blog.csdnimg.cn/direct/f0d639af2357429f9b6c6f111eaa1fbf.png)
接着我们在 AnimGraph 中设置 Movement,要注意的是,这里的速度一般指的是地面速度,因此我们可以直接使用 Vector Length XY 来计算 地面速度
![](https://img-blog.csdnimg.cn/direct/4beea2c4c4ef4f708ebfd38da630bc31.png)
但是目前并没有向左或者向右移动的效果,因为我们开启了 Orient Rotation to Movement,将 Orient Rotation to Movement 设置为 False
![](https://img-blog.csdnimg.cn/direct/acbd8b47e65f4983b26b4021a34ae719.png)
这种效果可以在锁定敌人的时候使用,但是这样我们还需要设置一下 CharacterMovement,开启 Use Controller Desired Rotation
![](https://img-blog.csdnimg.cn/direct/24e8c5a4d3014e319b3b52512855dc72.png)
最后我们可以得到效果如下
![](https://img-blog.csdnimg.cn/direct/d12fa4c3f36244038d09f14f4f39396b.gif)
三、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动画的变化从而发生改变
![](https://img-blog.csdnimg.cn/direct/2784108abe3646cdb40a49e168e1fc82.png)
右键创建一个 Aim Offset,选择骨骼后命名为 AO_Character
![](https://img-blog.csdnimg.cn/direct/c3fb98b1c14d4e5c8829c4b24fc4292b.png)
这里将 Horizontal Axis 命名为 Yaw,范围设置为 -180 到 180,开启 Snap to Grid,另一边将 Vertical Axis 命名为 Pitch,范围设置为 -90 到 90,开启 Snap to Grid
![](https://img-blog.csdnimg.cn/direct/b9c4112b29234d3089164571bdddf8f7.png)
由于 Yaw 的计算是从0 -> 180,180接着-180,然后是-180 -> 0,因此我们需要保证Yaw 在 180和-180位置上的动画是一致的
在这里如果出问题,我们只需要换一下 Preview Base Pose 就好
![](https://img-blog.csdnimg.cn/direct/a16596082e704cc78eacb83a73c201fa.png)
这里 Aim Offset 就设置完毕了,接下来我们需要去 ABP_Character 中设置 Yaw 和 Pitch,首先在AnimGraph中拖入 AO_Character,设置两个变量 Yaw 和 Pitch,由于 AO 是一个附加动画,因此我们只需要加原来的动画添加到 AO 上,然后将 AO 与 Output Pose 连接就好
![](https://img-blog.csdnimg.cn/direct/19e24da00b904ca1a2b64ca9b636edd4.png)
在 Event Graph 中创建一个计算 Yaw 和 Pitch 的函数,有如下两种方法,其区别在与是否使用 Clamp Angle 以及 Interp Speed
方法一有摇头动作,因为在Yaw在-180到180过度时候两种状态不一致, 因此使用 RInterp To 的 Interp Speed 进行状态的插值时间过度
![](https://img-blog.csdnimg.cn/direct/031bf95cde014150a61744cd08d22d0f.png)
得到效果如下
![](https://img-blog.csdnimg.cn/direct/2d56ca138b284f498cb3c6493b2ae8fb.gif)
方法二没有摇头动作,由于 Yaw 在 -180 和 180 上的动画一致,所以有衔接性,无需插值过度,讲究就是一个效率
![](https://img-blog.csdnimg.cn/direct/54f1069c0cb94905a6b5b1162ca1cfc1.png)
得到效果如下
![](https://img-blog.csdnimg.cn/direct/67bc2857409942d0b81d6529279ce531.gif)
在这里如果我们在旋转的时候,Character 也跟着旋转,那就是 Character Movement 的问题,我们需要关闭 Use Controller Desired Rotation 和 Orient Rotation to Movement
![](https://img-blog.csdnimg.cn/direct/a2bf192a3d2247df87f1d2d4898b5ba7.png)
这里的动画是 Separate 分开处理的,CC,CU,等表达很明确,如果是一个完整的聚合动画,我们需要拆分这个动画,方法如下
![](https://img-blog.csdnimg.cn/direct/44a6bddd1bc34978a8104948ffc053b3.png)
四、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 去存储,以便可以重复调用
![](https://img-blog.csdnimg.cn/direct/57142f911dbf4c1c908489d2dc71887b.png)
接下来我们来创建 Montage,选择动画右键创建 Montage
![](https://img-blog.csdnimg.cn/direct/56e7fba05c39480a8f85876fa4578f40.png)
在 Montage 之中,我们把 slot name 命名为 DefaultSlot
![](https://img-blog.csdnimg.cn/direct/61b942ca0e72445f819b108faeaafc81.png)
然后回到 BP_Character 中我们创建一个简单的触发 Montage 事件
![](https://img-blog.csdnimg.cn/direct/346a9f1c25d5461d880a8375caa95ac8.png)
得到效果如下
![](https://img-blog.csdnimg.cn/direct/e1ae7e3d99924e1286217baf46f14c6d.gif)
可以发现播放 Montage 的时候运动会出现滑动现象,为了解决这一问题,我们需要对动画进行分层,即身体上半部分执行一个动画,下半部分执行一个动画,回到 ABP_Character 中,我们创建一个 Layered blend per bone,将 AO 处理后的 Pose 传给 Base Pose,slot Montage 传入给Blend Poses 0,同时我们将需要混合 Blend Poses 0 的 spine_01 部位 在 Layer Setup 上指定
![](https://img-blog.csdnimg.cn/direct/4dc1affc6cc04ea595d37dbd24d77511.png)
执行效果如下
![](https://img-blog.csdnimg.cn/direct/54ace6093d9740f386b165d74efaf545.gif)