UE 进阶篇一:动画系统

导语:

下面的动画部分功能比较全,可以参考这种实现方式,根据自己项目的颗粒度选择部分功能参考,我们商业项目动画部分也是这么实现的。

最后实现的效果如下:

最终效果

目录:

-------------------------------------------

文末有视频教程/工程地址链接

--------------------------------------------

一、环境搭建

1.1 打开官方lyra工程,导出所有动画序列文件

1.2 使用UE5 创建新项目,第三人称射击游戏模板,蓝图项目

导入刚刚导出的文件,骨骼选择

1.3 新项目启用两个插件

二、基础移动转身动画

2.1、创建动画蓝图ABP_CharacterBase

添加状态机,

惯性化: 这个节点可以捕捉到动画状态的改变,并在新的动画状态开始时,将旧的动画状态的运动惯性应用到新的动画状态上,从而使动画过渡更加自然和平滑

2.2、使用线程安全函数,获取属性:

线程安全函数里的函数都要勾选线程安全

WorldVelocity:获取世界坐标速度,

WorldVelocity2D: XY平面世界坐标速度,

LocalVelocity2D:本地坐标速度2d,

HasVelocity: 当前是否有速度

2.3、编辑动画状态机

Idle->Start条件,是否有加速度,

并且可以设置共享规则,别的条件就能直接使用

Start->Cycle  可以设置自然过渡

Cycle->Stop:

2.4、设置动画

2.4.1 创建一个新的动画层接口 ,添加四个动画

2.4.2 动画蓝图绑定接口

动画层出现了接口

2.4.3  状态机 设置对应的动画状态

例如 Idle动画 就设置动画层FullBody_Idle 

2.5、创建一个新的动画蓝图ABP_ItemLayersBase,

绑定动画序列,同样要绑定All_AnimLayerInterface接口

在这个动画蓝图设置具体的动画功能

比如Cycle  : 设置循环动画

2.6、基于ABP_ItemLayersBase 创建子蓝图ABP_PistolLayers ,赋值具体的动画

打开动画的根运动和强制骨骼锁定

2.7、角色关联新的动画蓝图, 第2.6的子蓝图

基础动画就可以运转了

三、距离匹配,步幅适配,同步组

3.1 、距离匹配 

在Unreal Engine中,距离匹配(Distance Matching)是一种动画技术,用于确保角色动画与实际游戏中的移动距离保持一致。这可以提高游戏的真实感和沉浸感,避免角色在移动过程中出现滑动或停滞的现象。
使用导航系统(Navigation System)来计算角色在游戏中的实际移动距离。导航系统可以根据游戏环境和障碍物来计算角色的最佳移动路径。将导航系统与根运动结合使用,可以确保角色在游戏中的实际移动距离与动画中的表现保持一致
需要用到插件:
确定哪些动画需要距离匹配,参考Lyra2动画状态机,只有Idle动画不需要距离匹配,
创建方法 获取动画实例
ABP_CharacterBase 创建线程安全函数,更新每帧距离和速率
因为第一帧数据有问题,距离和速率设为0
Is First Update在Blueprint Thread Safe Update Animation中更新设置,默认值为true

3.1.1、Start 动画

 将序列播放器设置成序列求值器,

目的能动态控制动画播放的时间

 绑定两个函数

初始变更设置动画时间为0
更新动画函数
"Advance Time By Distance Matching": 基本原理是根据角色在游戏世界中的实际移动距离来计算动画的播放时间。例如,如果角色在一帧内移动了1米,那么动画将播放1米对应的时间。这样,动画的播放速度将根据角色的实际移动速度进行调整,从而使动画与实际移动更加协调。
LocamotionDistance Curve Name:指动画的动画曲线名字,由Locomotion 插件生成的
可以删除Distance, 由动画数据修饰符重新引用就创建出来了
现在动画压缩格式有问题
 找到这个压缩设置,创建新的压缩文件,修改所有动画序列文件,替换压缩文件
修改解码器,然后点击压缩

3.1.2、Cycle 动画

因为是循环动画,所以修改播放率

3.1.3、Stop 动画

3.2、步幅适配

动画在不同的速度下,跨的幅度应该不一样
在Start 和 Cycle动画添加跨步扭曲,Stop不用设置
设置移动速率 作为跨步的参数
绑定跨步扭曲参数  
把骨骼绑定好

3.3、同步组 

同步组(Sync Groups)  可用于在混合过程中自动同步相关动画的长度和播放,从而改善动画蓝图(Animation Blueprints) 中的混合行为 。 在混合拥有不同长度周期的步行和跑步动画时,这很有用。 如果没有同步组,直接从一个周期混合到另一个周期可能会导致效果不自然,因为脚的落点可能不同步。
设置动画  ,会自动设置脚步,方便过渡
设置好同步组之后,
过渡时长可以设置长一点,也能过渡自然  

四、八方向

4.1  、获取当前方向

是否在移动  ,作为Use Curent Direction参数

加一个deadzone 区间

4.2、 修改动画序列  

update动画使用 惯性序列

注意清除 动画序列 ,改成动态

 4.3、八方向 可以加上朝向扭曲

4.4 修改角色移动方式 :

4.5 问题:

在移动过程中,发现左移有点滑步,原因是因为前几帧距离为0,可以删除前几帧,重新添加距离修饰符

五、回转运动

5.1 线程安全函数更新状态,获取回转速度方向:

获取动画初始值

当播放回转动画时,判断是不是立刻按了垂直的方向键,方便立刻切换动画

回转运动:当角色向当前运动的相反方向移动时的一种动画过渡行为,具体表现是继续朝当前方向运动后停止再朝反方向运动

 5.2、添加状态机 ,Pivot Sources 是Start 和 Cycle状态别名

5.3、状态条件:

5.3.1 Pivot Sources 到Pivot

5.3.2 Pivot  到 Stop

5.3.3  Pivot -> Cycle 有两个转换条件

1.当播放回转运动立刻给垂直方向加速度

  1. 回转运动是有两段的,当第二段开始加速的时候,添加一个动画通知事件,开始转成Cycle,可以设置时长为1.0秒

3.添加动画层接口

5.4、处理具体的Pivot状态

Pivot状态也是一个状态机 ,在回转运动内反复进行运动时,需要及时切换回转动画,因此添加两个相同的动画转换

设置动画:

变更函数:根据DirectionFromAcceleration 设置动画,并设置初始加速度方向

更新函数:

回转动画有两段,一段是减速停止,一段是加速,所以用不同的方法

转换条件:

速度与加速度相反 & 初始加速度与当前加速度相反 & 不是垂直方向

5.5、设置具体的函数

5.6、设置同步组

5.7 附加:

先获取初始方向

Start->Cycle增加一个条件,初始速度方向和当前方向不相等,且时间>0.1可直接转Cycle, 时间太短,变量值有问题

六、原地转身

原地转身的效果:

Idle状态,在一定的角度内,角色模型不会转身,但是网格体会实时转身,超过这个角度播放一个转身动画,并且把模型也转过去

在动画图表添加旋转根骨骼方法,创建一个角度变量绑定

6.1、设置Root Yaw Offset 值 

在更新旋转方法中获取Delta Rotation值(每帧的Yaw旋转值)

创建一个新的方法Update Root Yaw Offset

方法Update Root Yaw Offset中:设置Root Yaw Offset 用函数控制,设定范围为-120 ~ 120 角度内

Update Root Yaw Offset中,添加了一个变量Root Raw Offset Mode是一个枚举类 ,含义如下

Accumulate:  Idle状态,及时修改

HoldOn: Start Root Yaw Offset不变,

BlendOut: 混出,大部分状态转换都是这个

Accumulate:实时修改

BlendOut用了这个弹簧方法,慢慢把值RootYawOffset设置到Target 0

6.2 、在状态机设置Root Raw Offset Mode值

Idle:On Update添加Update Idle State方法, 在完全Idle状态且不是Blending Out状态设置成Accumulate模式

Stop状态 和Idle状态一样

Start 状态:设置成 Hold On 保持不变

因为每帧都会设置成BlendOut状态 其他的就不用设置了

6.3、Start -> Cycle增加一个转换条件

现在的效果为如下:

6.4、增加转身动画

6.4.1 把Idle动画设置成状态机

转身动画有两个部分,一部分是转身一部分idle状态

为了转身状态能随时切换转身方向,设置两个动画状态

6.4.2 设置转换条件

混合逻辑改成惯性化

Idle -> Turn in Place Rotation

 Turn in Place Recovery -> Turn in Place Rotation 两个一样

Turn in Place Recovery -> Idle 自动规则

Turn in Place Rotation -> Turn in Place Recovery

动画曲线几乎等于0,动画的后半段

注意:这个动画曲线是Lyra自定义的动画曲线修改符, 导入方法

在lyra工程中,找到TurnYawAnimModifier所在的文件夹,点击迁移,到自己工程的Content目录里

6.4.3 设置动画状态

Idle状态:

Turn in Place Rotation状态:

输出动画姿势 添加函数,获取转换方向,Root Yaw Offset 和 要转换的方向相反,所以乘-1

Setup Turn in Place Rotation:

设置Turn in Place Rotation Time 时间

Turn in Place Recovery状态:

开始位置从Turn in Place Rotation Time 开始,也就是动画后半段

6.4.4  配置动画  

6.5、在上面步骤设置完后,还是有问题,角色会反弹回来,

原因是Root Yaw Offset 没有重置,导致动画状态一直切回Turn in Place Rotation 状态 

创建一个新函数  ProcessTurnCurveValue 

主要功能是根据动画曲线的值,计算出转身动画旋转了的Root Yaw Offset, 然后修改Root Yaw Offset 值 

放在Update Idle State 中更新

七、瞄准偏移

7.1、新建瞄准偏移资产 

设置 Yaw 和 Pitch范围,Pitch 视野只能上下,设置乘-90~90

7.2、批量修改动画资源 

选择网格体空间原因:

局部空间 会以人的朝向为基准

拖动资源到对应位置

7.3、新建瞄准偏移动画层,新增两个变量

在动画图表中添加动画层,并且创建两个对量绑定动画层的变量

7.4、新建函数,更新变量

7.5、设置动画状态

将Blend Space 设置成变量,方便子蓝图设置值

八、跳跃着陆

8.1、添加跳跃状态机

红框是状态别名,可以多选存在的状态

蓝框是状态导管: 导管(Conduit)是动画状态机中的一种特殊状态,它没有任何关联的动画,而是用作状态转换的中间点。导管的主要作用是简化状态机的复杂性,使状态转换更加清晰和易于管理

8.2、跳跃存在的状态

JumpStart ->跳跃启动

Jump Start Loop->跳跃向上循环

Jump Apex -> 跳跃顶点

Jump Fall Loop ->下落动画

Jump Fall Land -> 快着陆动画

8.3、获取参数

8.3.1 获取是否在向上跳跃(Is Jumping),正在掉落(Is Falling),在地面(Is On Ground)

8.3.2 获取跳到顶点的时间(Jump Apex Time),速度/重力

8.3.3 获取到地面的距离,因为这个函数需要射线检测,不能设置成线程安全函数

所以这个函数放在事件图表更新

8.4、设置转换条件

8.5、 添加关联动画层

8.6  、设置动画层

Jump Fall Land  有些不一样,因为要计算落地的距离

注意如果自己创建动画修饰符,这个跳跃的动画距离修饰符,要把轴设置成Z

8.7、设置动画

九、补充知识

9.1、设置不同的关联图层

只需要创建新的子蓝图,添加新的资源

然后就可以控制图层切换,比如角色有不同的状态,切换更方便

9.2、获取别的动作资源导入到自己工程

例如下载如下工程,导出选项 设置为默认

找到需要的动作,批量导出

导出的文件夹拖入到自己工程中,重置为默认,选择绑定自己工程的骨骼,点击导入所有,即完成了

9.3 重定向动画

重定向动画  视频地址 :【永昼UE】UE5功能更新——骨骼链重定向动画(Vroid示例,IK Retargeter)_哔哩哔哩_bilibili

导入mixamo的动作资源

Mixamo

9.3.1: 下载好mixamo资源后,导入UE

Skeleton设置为空,Imprt Uniform Scale 可以设置大小

9.3.2 对于要绑定的骨骼和资源骨骼都创建IK绑定文件 

选中对应的骨骼,创建骨骼重定向链,主要是下面6个,也可以创建五根手指的

选择无目标

最后设置根骨骼

绑定好的结果如下  

绑定好后,创建IK重定向器,绑定提供资源的 IK绑定 资产

设置目标IK

场景就多了一个模型,在编辑模式下 旋转骨骼,调整目标的姿势,和提供资源的模型一致,保存

现在就可以复制动画了,

指定刚刚创建的IK重定向器

如果需要效果更好的IK绑定 ,可以使用 IK solver技术,参考视频 :https://www.youtube.com/watch?v=Ujb6JcHO6x8

十、视频/工程地址:

参考视频:

P12- 补充-转身移动-控制绑定套用_哔哩哔哩_bilibili

工程地址:待添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在AD上创建完整的项目

首先,我们先安装好AD,这里我使用的是AD22,安装过程如下: Altium Designer 22下载安装教程-CSDN博客 Altium Designer 22是全球领先的PCB设计软件之一,为电路板设计师提供了一种集成的解决方案,旨在简化和加…

2023年最新PyCharm环境搭建教程(含Python下载安装)

文章目录 写在前面PythonPython简介Python生态圈Python下载安装 PyCharmPyCharm简介PyCharm下载安装PyCharm环境搭建 写在后面 写在前面 最近博主收到了好多小伙伴的吐槽称不会下载安装python,博主听到后非常的扎心,经过博主几天的熬夜加班,…

Web 自动化神器 TestCafe(三)—用例编写篇

一、用例编写基本规范 1、 fixture 测试夹具 使用 TestCafe 编写测试用例,必须要先使用 fixture 声明一个测试夹具,然后在这个测试夹具下编写测试用例,在一个编写测试用例的 js 或 ts 文件中,可以声明多个测试夹具 fixture(测试…

Nginx模块开发之http handler实现流量统计(1)

文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…

multiset和multimap(map和set的可重复版)

multiset和multimap multisetmultiset的使用 multimapmultimap的使用 这里有讲解map和set的详细使用: C中的map和set使用详解 multiset multiset的文档介绍 翻译: multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。在multiset…

java--权限修饰符

1.什么是权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。 2.权限修饰符有几种&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范围由小到大)

【小黑嵌入式系统第六课】嵌入式系统软件设计基础——C语言简述、程序涉及规范、多任务程序设计、状态机建模(FSM)、模块化设计、事件触发、时间触发

上一课&#xff1a; 【小黑嵌入式系统第五课】嵌入式系统开发流程——开发工具、交叉开发环境、开发过程(生成&调试&测试)、发展趋势 下一课&#xff1a; 【小黑嵌入式系统第七课】PSoC 5LP 开发套件&#xff08;CY8CKIT-050B &#xff09;——PSoC 5LP主芯片、I/O系统…

设计高手的秘密武器:5款让平面作品更出彩的软件

平面设计是一种迷人而多样化的艺术形式&#xff0c;它结合了颜色、形状、排版和创造力&#xff0c;通过图像和文本传达信息。市场上有各种各样的平面设计软件&#xff0c;选择合适的设计软件是成为优秀设计师的重要一步。为了降低软件成本&#xff0c;大多数设计师会优先使用免…

FreeRTOS的并行与并发思考

FreeRTOS的任务触发是由滴答时钟触发SysTick中断来触发调度器执行或阻塞或挂起和切换任务的。 首先是任务的并发能力&#xff0c;FreeRTOS的任务执行是基于全抢占调度机制&#xff0c;任务优先级按在就绪列表中由高到低排布&#xff0c;系统首先执行最高优先级任务&#xff0c;…

XUbuntu22.04之解决gpg keyserver receive failed no data(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

STM32CubeIDE 创建 / 导入 .c / .h 文件

目录 CubeMX创建工程 项目管理 将CubeMX创建的工程导入到CubeIDE 创建用于演示的ADD.c文件和ADD.h文件 方式一&#xff1a;在IDE的项目浏览器内创建 方式二&#xff1a;在文件窗口处创建 / 从其他地方复制粘贴过来 将ADD.h添加到头文件搜索路径 将ADD.c添加到源文件搜索…

电脑找不到xinput1_3.dll怎么修复,快速处理dll问题的5个方法分享

在使用电脑的过程中&#xff0c;我们常常会遇到一些常见的问题&#xff0c;其中之一就是“电脑缺少xinput1_3.dll”。这个问题可能会影响到我们对电脑的使用体验&#xff0c;甚至导致某些软件无法正常运行。在我遇到这个问题并解决之后&#xff0c;我深刻地体会到了解决问题的重…