导语:
下面的动画部分功能比较全,可以参考这种实现方式,根据自己项目的颗粒度选择部分功能参考,我们商业项目动画部分也是这么实现的。
最后实现的效果如下:
最终效果
目录:
-------------------------------------------
文末有视频教程/工程地址链接
--------------------------------------------
一、环境搭建
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 、距离匹配
3.1.1、Start 动画
将序列播放器设置成序列求值器,
绑定两个函数
3.1.2、Cycle 动画
3.1.3、Stop 动画
3.2、步幅适配
3.3、同步组
四、八方向
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.当播放回转运动立刻给垂直方向加速度
-
回转运动是有两段的,当第二段开始加速的时候,添加一个动画通知事件,开始转成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
工程地址:待添加