状态机和状态别名
随便新创建一个第三人称项目
打开这个位置,可以看到有两个动画,ABP中,A表示Anim,BP表示蓝图。可以鼠标一上去,发现Quinn是继承自Manny的,因此我们直接修改Manny即可。
进入内部是一个动画蓝图,如果找不到就在左下册,我的蓝图中点击一下动画图标中的AnimGraph即可。
对于上述这个图,我们先看上面,是一个状态机指向一个cache,内部是一个idle和wale/run的状态切换,中间的表示转换条件
接着看下面,有一个Main States的状态机
内部发现又看到了一个Locomotion,这是什么呢?进去一看发现是使用之前的缓存,就是说进入这个状态之后,就会循环调用之前存在缓存的部分
效果上和下面这一种是等价的
对于上面的Jump,Land,Fall Loop是状态
To Falling和To Land是状态别名
点击选中之后可以看到右边的状态别名,可以看到Jump和Fall Loop是打钩的,意思是这两个状态可以转化为Land状态,其效果等价于下面这一种。对于比较少的状态自然无所谓,当状态很多的时候,状态别名就很有优势了。
接着双击空白处,重新回退到外面。看第二个,可以看到一个动画蒙太奇
使用的是DefaultSlot,代表的是全身动画。
接着后面是是绑定的是一个绑定控制(里面有例如ik_foot这种东西),最后成功输出一个姿势,也就是实际游戏看到的样子。
动画重定向
可以把其他角色的动画重定向到当前角色身上。
先导入一下Fab资源包,去搜索一下这个FreeAnimationLibrary
这个界面可以点击设置,视图展示为列,然后不显示文件夹得到。
全选之后右击,重定向动画资产
可以看到,这里有一个源骨骼网络体和目标骨骼网络体
UE5.5时候已经可以生成IK重定向器了,因此我们只需要选好我们的转换目标
然后点击导出重定向资产,导出即可(记得要全部选中),选择导出动画,这样在目标位置处就可以生成我们新的动画了
双击点开看一下,如果没有什么异常一般就没有问题了
替换角色动画
在如下文件夹位置,点击第三人称角色,然后在组件,找到网格体,接着看向右边的网格体资产。这里默认的是Quinn资产,我们可以选择缓存manny
切换编译后,再进入游戏可以看到,初始默认角色已经变成了男性
上面的动画类,也是用的Quinn,也改成manny
接着回到动画蓝图,还是到这里,双击Idle
左边的节点可以看到就是一个动画序列
双击打开后,就是角色的动画。这也就是为什么我们开始的时候角色默认站立不动的待机动画
这里要测试不同的idle,可是拿枪那个Demo已经无了,因此打算做个拿剑的类似Demo。
导入这个资源包RamsterZ_FreeAnims_Volume1,记得仍然需要转化哪些步骤再来一遍。
拖入这个,可以先预览下,发现游戏默认已经变化了。
同时还发现,我们此时的新idle和walk/run还是可以流畅的切换。
修改绑定控制
这里貌似是高版本修复了这方面的问题,并不会出现脚部悬空的现象,如果按照上述步骤IK都是正常的
什么是ik呢?就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置。
原因是ik_foot没有没有和预期一样,打开动画骨骼后,查看ik_foot,发现他的并不是预期情况
而正常应该是
正常来说,foot要和ik_foot位置一致才可以,因此,如果不一致,我们可以主动调整ik_foot使其和foot位置一致
因此,回到我们刚才,点击footik那个蓝图进去,可以再添加一个逻辑主动地设置位置匹配,这样解决了问题。脚步就会接地了
混合空间1D
回到我们的ABP_Manny,还是找到开始的Walk/Run
双击进去,中间那个就是混合空间
在双击混合空间进入,就是我们两个动作
相当于是添加了一个Walk和Run的动作,中间都是平滑出来的状态。按ctrl可以看不同速度的状态。这个speed是在事件蓝图部分,每一帧调用获得。得到了总体的速度分量,但是最终只去水平面XY的分量。
同时可以看到下面,为了避免微小的扰动,只有当速度大于一定阈值的时候,才真正会移动
那我们又是如何使用这个变量的呢?UE支持变量查找用途,查找后发现
可以看到他们都是在转换的规则里面,也就是说想要切换到移动状态就必须满足这个条件。这样让变量发挥了作用
最下面,还有一个从Movement Compoment中获取是否在falling的功能
查阅了一下相关定义,在UE中,把只受到重力影响的运动状态称之为Falling,因此比如说跳跃就属于这个的子状态。
同时,查询后发现下落还是有最大速度的,应该是有地方配置。
试了试Movecompoment,还发现有一个isFlying的东西,查询了一下。这个需要我们自己去配置的,在这个状态下角色不受重力影响,自由移动。看来很适合后续的扩展。
现在我还剩下最后一个疑问,IK_foot怎么检测到地面位置的呢?怎么调整倒是大概明白了,然后就去查看源码去了,差点没给我整吐,可读性好差
看了半天也没想明白,移动到函数旁边也没有注释,也是完全不理解。不过感谢万能的知乎,太好用了。
我们传入的是一个脚的骨骼,那么这里假设就是右脚。
R是骨架root的位置,F是骨架foot的位置,取R点的z值以及F点的x,y获得P点,P点就是F在R所在水平面的投影点。
接着对于这个P点,设置一个上下AB点进行射线检测(AB也就是腿最高变化),如果碰撞,对应到I点,I就是我们的碰撞点。然后,我们对这个碰撞面做一个垂线,然后得到我们点T(IT是常亮)。对于P点也增加向上的常量FootHeight获得O点,最终得到OT为偏移向量,施加上去后,就可以通过IK调整好我们的脚形
此时你可能会发现,那我OT向量实际上只和脚部的XY相关,那Z呢?其实不用去管,因为我们获取的是一个偏移量,实际上这里只是修正脚部形状的,不是获取脚部高度的。实际情况下二者叠加上去就好了。
回归正题,我们继续回到混合空间1D
找个位置,创建混合空间1D。注意在旧有里面。上面的混合空间可以认为是一个2D的。
还是选择我们的manny骨骼,然后命名一下
然后打开,拖两个动作进来。我这里没有视频动作,就自己搞了Crouch的idle和fwd,反正是idle和fwd切换就好
此时按crtl可以看到,不同的状态
我们回到角色的状态机修改
把它拖进来,不过这个None有些难绷,因此我们进去找水平坐标,把名称修改为Speed,最大轴值修改为500,然后预览处选中最后一个动画修改为500
有时候脚部感觉很不对,感觉不是走出来而是滑动的,因此我们修改一下
水平轴选择locomotion,然后绑定左右脚,分析取样一下可以解决
不过这个还是有点太难绷了,要是想要预设速度不滑膜,速度要达到2500…..,普通走路怎么可能呢
吐了找模型找不到合适的,最后用一个那个Sword_Animation得了
有些动画他自己就开始跑了,可以去动画里面去调整,强制根锁定之后,角色角色就不会乱跑了。好评
实现角色蹲走
步骤:
- 添加输入操作
- 一般在Input下面的Action目录下,添加一个新的输入操作,例如IA_Crouch
- 配置输入情景
在输入映射情景里面配置一下 - 添加映射,选择我们刚才的,然后控制按键,触发器(已按下),保存并退出
- 回到角色蓝图,开始配置
- 因为我们之前配置好了,所以直接在角色蓝图里面调用刚才的事件。对应很多种触发方式,那我们选择的结合治理应该就是triggered,其他的可以鼠标移上去看看具体什么效果。
- 然后是filpflop,这个是每次触发都切换一下,原理应该是记录了static变量之类的。
- 下面的crouch和uncrouch是角色自带的,就像walk,run之类的提前都给你整好了。区别是Crouch没有实现动画,需要再实现一下
- 按理说胶囊体应该会有变化,可是我这里没有。倒也不是什么大问题,自己再写就是了,然后可以打印一下输入,在游戏内看到角色的动作。
- 后续找到问题了,看日志发现没有启用这个功能。也就是需要去角色里面配置,可以crouch,同时还发现还有可飞行,这个后续再说
- 我们还需要让比如说其他地方可以知道我这边是否是蹲下状态,因此最好再加一个变量,便于其他地方查询。
- 这里的iscrouching只是演示一下,其实角色自带的isCrouched,我们直接调用那个就行。
- 添加动画
- 回到动画蓝图,新添加一个变量,记录一下是否是蹲下状态。连在sequence后边,这样每一帧也都会被检索和调用了
- 此时,新建一个状态和状态别名,连线起来
配置一下状态别名,可以从我们的Locomotion和Land转换过来,这两个地方记得打钩 - 此时两个转换状态也呼之欲出了,当iscrouched为True才会转化的crouching,为false再转换到locomotion
- 回到动画蓝图,新添加一个变量,记录一下是否是蹲下状态。连在sequence后边,这样每一帧也都会被检索和调用了
然后我们点进去state开始配置,流程如下
速度最好不是>=0,设置一个比如说>=5的阈值比较好,然后记得设置动画和启动循环。
这里如果想要一个比较平滑的过度,可以用个什么混合空间啥的。当然目前感觉也够好了就不用
前面我们发现,角色的mesh和角色的模型是分开的。这样解耦有利于性能的优化。但是后续如果需要更精细的角色模型控制,那能否直接和任务模型绑定呢?
绑定武器
打开角色模型,然后在里面找到hand_r,添加插槽,为后续添加武器做准备
新建一个Weapon类蓝图,为Actor的子类,里面
在根组件下添加骨骼网格体组件,然后加入进来、右边选择合适的网格体
这里出现两个概念,骨骼网格体和静态网格体,区别具体来说
特性 | 骨骼网格体(会动的模型) | 静态网格体(不会动的模型) |
---|---|---|
会不会动? | ✅ 会动(像人、动物、怪物) | ❌ 完全不动(像石头、房子、桌子) |
怎么动? | 靠内部的”骨头”(骨骼)驱动 | 一动不动,焊死在地图上(或者全局一起动) |
适合做什么? | 角色、生物、可变形物体(比如旗帜) | 场景道具、建筑、地形装饰 |
性能消耗 | 较高(要计算骨骼动画) | 很低(直接渲染就行) |
举个栗子🌰 | 会跑步的士兵、会飞的龙 | 马路上的垃圾桶、游戏里的墙壁 |
对于骨骼动画的原理,每一帧动画其实都是骨骼的位置/旋转数据,模型顶点会跟随骨骼移动(即蒙皮)
对于静态网格体,只能够全局整体的移动,不能够对内部精细移动调整。
回到角色中,要添加使其成为角色网格体的子层级。找到这个蓝图然后拖过来
点击BP_Weapon,在细节处找到插槽,选择我们前面创建的插槽
但是可以看到角度位置都有问题,这时候我们回到插槽预览,点击选择预览资产,然后调整。同时可以选择特定动画,在我们期望的动作上。调整完整后保存。
回到蓝图重新编译一下,没有问题了
那我们为什么要创建一个武器蓝图呢?为什么不直接把武器网格体拖过来?这是因为后续武器可能也有很多逻辑,如果直接拖后续对于武器的处理逻辑就要写在角色里面了不太好。解耦不太好
后续
导出动画中某一段动画
选中动画,打开后在sequencer中编辑。确定好首位之后烘焙动画序列
同时甚至可以改变骨骼的位置然后再重新插帧,这里便于我们做一些比较精细的调整。
使用动画蒙太奇
可以支持一个混合,即我需要一个动画的上半身和另一个的下半身。二者混合得到最终的动画。
导入特定动作动画
内容参考
UE5角色动画教程-1.课程简介_哔哩哔哩_bilibili
全程无废话,ue5.4超实用人物动画与骨骼绑定纯中文教程,快速一键动画导出,更高效的骨骼绑定与动画修改,在ue5.4中实现骨骼绑定与更改权重_哔哩哔哩_bilibili