当前位置: 首页 > news >正文

UE5 动画蓝图

文章目录

  • 一、State Machines
  • 二、Blend Spaces
  • 三、Aim Offset
  • 四、Montage
  • 五、State Alias
  • 六、Control Rig
  • 附:镜头
    • 第三人称镜头

在这里插入图片描述

初步介绍

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 上指定

执行效果如下

五、State Alias

在这里对第三人称游戏中 ABP_Character 中的 AnimGraph 进行分析

State Machines in Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer Community (epicgames.com)

State Alias 本质是一个快捷方式之类的节点,其目的是减少混乱合并转换并提高图形的可读性

第一步是设置 Event Graph,首先我们需要提取出 BP_Character 的实例和 Character Movement,以及设置一些动画需要的变量,Velocity,GroundSpeed,ShouldMove,IsFalling

然后我们需要对这些变量进行设置

中间的 ShouldMove 需要 GroundSpeed 超过一个小的阈值是为了防止非常小的速度触发移动动画,这不合理。同时需要一个加速度即输入才满足条件

第二步是设置AnimGraph

Locomotion 设置了一个简单的运动状态,并使用 cache 进行缓存也命名为 Locomotion,在 Locomotion 内部,其是由 Idle 和 Walk 两个 state 组成的,基本的 transition rule 都是由 ShouldMove 决定

这里 Idle 的动画是 Idle,Walk/Run 的动画是由 1D Blend 构成的,其分为三个动画组成,一个是 Walk_InPlace,一个是Walk_Forward,一个是Run_Forward,尽可能的 Blend 中 不包含 Idle,不然画面不协调

接下来是 Main States 部分,Main States 中包含了所有的状态,Slot 是用于表示 Montage,后面的 Control Rig 是用来对不平整路面的上下脚表示

进入 Main State,可以看到 To Falling 的 Details 中有多个 State 可以勾选,其就是多个状态机的代表

State alias 的作用很明显,就是用来整理线条的,让线条更有条理性

为了避免 State 出现一对多之间转换条件都符合转化 State 不确定这一问题,我们设置了 Priority Order 优先级来判断转化为哪个 State

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 来判断

这里有两个使用到了 automatic rule,一个是 Jump 到 Fall Loop ,另一个是 Land Locomotion,automatic rule 是在 transition rule 之上进行设置的,这个Automatic Rule Trigger Time 为负数表示的是前一个动画播放完毕之后自动播放,如果为正数就表示前一个动画播放还剩多少秒时自动播放,这里 Jump 代表起跳的动作,Land 代表落地的动作,动作播放完毕自然需要切换,这是符合要求的。Land 到 Locomotion 有两个 transition ,只需要再重新连接一次就可以实现

这里的 Locomotion 利用的是上面 Locomotion Cache,Land 用的是 Land 动画 使用 AddItive Animation 搭配 Locomotion Cache ,这样可以使掉在地面上过度得更加顺畅

Fall Loop 使用的是 Fall Loop 的动画,不过要开启循环,Jump 使用的是 Jump 的动画,到这里 BP_Character 还剩下了 Control Rig

六、Control Rig

Control Rig 是用来对不平整路面的上下脚表示

附:镜头

第三人称镜头

  1. Spring Arm 中 开启 Use Pawn Control Rotation:让镜头跟着鼠标移动
  2. BP_Character(Self) 中关闭 Use Controller Rotation Yaw:不要让人物和鼠标移动
  3. Character Movement 的 Rotation Setting 中 关闭 Use Controller Desired Rotation:不要让人物和鼠标移动
  4. Character Movement 的 Rotation Setting 中 开启 Orient Rotation to Movement:让人物在运动的时候朝着镜头的方向移动

相关文章:

  • 计算机是如何看到图像的
  • 泰雷茲具有首个通过FIPS 140-3 三级认证的HSMs
  • 引领AI新时代:深度学习与大模型的关键技术
  • 探索大型语言模型自动评估 LLM 输出长句准确性的方法
  • Python面试宝典第4题:环形链表
  • 3099. 哈沙德数 Easy
  • 广州外贸建站模板
  • 中控室监控台在水处理行业的作用
  • C++实现简化版Qt的QObject(5):通过IEventLoopHost扩展实现win32消息循环
  • 视频字幕提取在线工具有哪些?总结5个字幕提取工具
  • three.js地理坐标系有哪些,和屏幕坐标系的转换。
  • layui+jsp项目中实现table单元格嵌入下拉选择框功能,下拉选择框可手动输入内容或选择默认值,修改后数据正常回显。
  • Emp.dll文件丢失?理解Emp.dll重要性与处理常见问题
  • 【NodeJs】入门
  • VuePress 的更多配置
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • angular2 简述
  • isset在php5.6-和php7.0+的一些差异
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS 面试题总结
  • js正则,这点儿就够用了
  • mysql innodb 索引使用指南
  • pdf文件如何在线转换为jpg图片
  • python大佬养成计划----difflib模块
  • Spring Cloud中负载均衡器概览
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从零开始在ubuntu上搭建node开发环境
  • 当SetTimeout遇到了字符串
  • 给github项目添加CI badge
  • 基于HAProxy的高性能缓存服务器nuster
  • 理解在java “”i=i++;”所发生的事情
  • 聊聊flink的TableFactory
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 什么软件可以剪辑音乐?
  • 树莓派 - 使用须知
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 鱼骨图 - 如何绘制?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​学习一下,什么是预包装食品?​
  • # 数论-逆元
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #、%和$符号在OGNL表达式中经常出现
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (a /b)*c的值
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (六)软件测试分工
  • (数据结构)顺序表的定义
  • (五)关系数据库标准语言SQL
  • (一)插入排序
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转载)从 Java 代码到 Java 堆
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***通过什么方式***网吧
  • .NET Compact Framework 多线程环境下的UI异步刷新