UE5 动画蓝图
文章目录
- 一、State Machines
- 二、Blend Spaces
- 三、Aim Offset
- 四、Montage
- 五、State Alias
- 六、Control Rig
- 附:镜头
- 第三人称镜头
![在这里插入图片描述](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)
五、State Alias
在这里对第三人称游戏中 ABP_Character 中的 AnimGraph 进行分析
State Machines in Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community (epicgames.com)
State Alias 本质是一个快捷方式之类的节点,其目的是减少混乱合并转换并提高图形的可读性
![](https://img-blog.csdnimg.cn/direct/f7d3acc6ce574e70ac3ec0bfbac0544e.png)
第一步是设置 Event Graph,首先我们需要提取出 BP_Character 的实例和 Character Movement,以及设置一些动画需要的变量,Velocity,GroundSpeed,ShouldMove,IsFalling
![](https://img-blog.csdnimg.cn/direct/bec806f3f7fc406dbee4522b26f1a377.png)
然后我们需要对这些变量进行设置
![](https://img-blog.csdnimg.cn/direct/d79398387f084e9da7dd44a8385206eb.png)
中间的 ShouldMove 需要 GroundSpeed 超过一个小的阈值是为了防止非常小的速度触发移动动画,这不合理。同时需要一个加速度即输入才满足条件
第二步是设置AnimGraph
![](https://img-blog.csdnimg.cn/direct/6e1ef9c6a1d1437a9db52a978162b412.png)
Locomotion 设置了一个简单的运动状态,并使用 cache 进行缓存也命名为 Locomotion,在 Locomotion 内部,其是由 Idle 和 Walk 两个 state 组成的,基本的 transition rule 都是由 ShouldMove 决定
![](https://img-blog.csdnimg.cn/direct/0865e33ae78f4850bbb563c1d087cbee.png)
这里 Idle 的动画是 Idle,Walk/Run 的动画是由 1D Blend 构成的,其分为三个动画组成,一个是 Walk_InPlace,一个是Walk_Forward,一个是Run_Forward,尽可能的 Blend 中 不包含 Idle,不然画面不协调
接下来是 Main States 部分,Main States 中包含了所有的状态,Slot 是用于表示 Montage,后面的 Control Rig 是用来对不平整路面的上下脚表示
![](https://img-blog.csdnimg.cn/direct/92aa612a83b44040b3c35cc03e1d4337.png)
进入 Main State,可以看到 To Falling 的 Details 中有多个 State 可以勾选,其就是多个状态机的代表
![](https://img-blog.csdnimg.cn/direct/9f56094a8d4f4b878f0137bc3f06910a.png)
State alias 的作用很明显,就是用来整理线条的,让线条更有条理性
![](https://img-blog.csdnimg.cn/direct/f7d3acc6ce574e70ac3ec0bfbac0544e.png)
为了避免 State 出现一对多之间转换条件都符合转化 State 不确定这一问题,我们设置了 Priority Order 优先级来判断转化为哪个 State
![](https://img-blog.csdnimg.cn/direct/0f9c243bf7544667988fca109dff95f3.png)
To Falling 由Locomotion 和 Land 组成,transition 到 Jump 通过 z 轴的 velocity 以及 IsFalling 来判断,Fall Loop 到 To Falling 利用 IsFalling 来判断;To Land 由 Jump 和 Fall Loop 组成,transition 到 Land 由 not IsFalling 来判断,Land 到 Locomotion 由 ShouldMove 来判断
![](https://img-blog.csdnimg.cn/direct/5b616683c2354357b92b8f5d2989e3d6.png)
这里有两个使用到了 automatic rule,一个是 Jump 到 Fall Loop ,另一个是 Land Locomotion,automatic rule 是在 transition rule 之上进行设置的,这个Automatic Rule Trigger Time 为负数表示的是前一个动画播放完毕之后自动播放,如果为正数就表示前一个动画播放还剩多少秒时自动播放,这里 Jump 代表起跳的动作,Land 代表落地的动作,动作播放完毕自然需要切换,这是符合要求的。Land 到 Locomotion 有两个 transition ,只需要再重新连接一次就可以实现
![](https://img-blog.csdnimg.cn/direct/b9b8206d67284d8f8da20659740818c5.png)
这里的 Locomotion 利用的是上面 Locomotion Cache,Land 用的是 Land 动画 使用 AddItive Animation 搭配 Locomotion Cache ,这样可以使掉在地面上过度得更加顺畅
![](https://img-blog.csdnimg.cn/direct/44521f8cccbc43d09188ba4a187ae9c2.png)
Fall Loop 使用的是 Fall Loop 的动画,不过要开启循环,Jump 使用的是 Jump 的动画,到这里 BP_Character 还剩下了 Control Rig
六、Control Rig
Control Rig 是用来对不平整路面的上下脚表示
附:镜头
第三人称镜头
- Spring Arm 中 开启 Use Pawn Control Rotation:让镜头跟着鼠标移动
- BP_Character(Self) 中关闭 Use Controller Rotation Yaw:不要让人物和鼠标移动
- Character Movement 的 Rotation Setting 中 关闭 Use Controller Desired Rotation:不要让人物和鼠标移动
- Character Movement 的 Rotation Setting 中 开启 Orient Rotation to Movement:让人物在运动的时候朝着镜头的方向移动