单纯的缩小胶囊体半径来解决办法会存在问题,如果整个将胶囊碰撞器的半径缩小到0,人体会识别为在半空,会自动播放下落状态,所以不可行。
解决方法:1.上下楼梯时,将整个人身体的骨骼自动提升或者降低脚到地面的距离高度。2.上下楼梯时,将整个Mesh自动提升或者降低。
大致的实现方法相似,先使用骨骼提升或者降低。
实现方案:
在人物动画蓝图中使用 Transform Bone 变换(修改) 骨骼 节点,对骨骼进行偏移调整。
1.该节点,可以控制指定骨骼的位置、旋转、缩放的更改。我们需要对权限较高的骨骼节点进行操作,可以移动整体骨骼,但是不影响IK骨骼。
2.选择pelvis (盆骨),在该节点中因为我们当前只使用平移功能,所以可以将旋转缩放后面的对勾去掉,将节点简洁化。
3.在平移选项中,平移模式选择为添加到添加至现有。
替换现有项:将原值直接覆盖,替换为当前传入的值。
添加至现有:将传入值加到原值上。
平移空间:针对哪个空间进行变化。此值保持默认即可。
4.将节点进行连接,我们当前只需要更改Z轴方向的值,所以将Translation 分割结构体引脚。
5.将TranslationZ提升变量命名为HipOffset,操作完成后,进行编译。
6.返回至第三人称控制器蓝图面板。
分析:初始状态 胶囊体碰撞器最低点与脚底的位置是相平的,人物无论是在上楼梯还是下楼梯,我们需要将整个人身体向下进行移动高度差值最大的那个脚的那个高度,之前我们计算两只脚需要移动的高度时,使用的是
脚移动高度差 = 胶囊体半高 - 从膝盖向下发射射线击中物体的距离值
所以结果本身就带有正负值,上楼下楼时高度差最大的,得到的值都是负数,所以使用Min节点进行最小取值,也就意味着高度差是最大的。
增加Min节点,判断IKFootOffsetL与IKFootOffsetR值得大小,得出的最小值进行提升变量命名为IKHipOffset。为了避免后面连线太乱,所以将此操作封装为函数,名称为GetIKHipOffset
7.将获取到的IKHipOffset值传递到动画蓝图中骨骼需要的HipOffset进行骨骼偏移。
8.由于我们在骨骼的Z轴方向上进行了整体偏移,会影响两个脚应该要更改的高度值。所以我们需要在之前得到的两只脚需要变化偏移量的基础上减去骨骼在Z轴方向上的偏移量。
注意:因为左右脚的轴向不同,所以在操作右脚的时候需要再乘以一个-1。
9.增加序列节点的输出项引脚,连接逻辑
10.运行后,发现脚陷入地面,因为我们获取的是脚底部的骨骼,这个骨骼距离脚的底部还有一定的距离,才会导致脚陷入到模型中。
解决方法:在IKTrace函数中计算脚偏移高度的过程中,加入脚骨骼到脚底的距离高度,由于人物包括胶囊碰撞器都可能存在一定的缩放值,所以将Scale的Z值进行保存,在Construction Scrip 中进行操作
再IKTrace函数中计算脚偏移量加入
可以进行简化,使用添加数学表达式
11.编译,保存运行。
12.人物模型的降低高度,导致碰撞器太高,会导致如果上方有障碍物,高度距离较高的时候就会有影响。所以要进行将胶囊体高度降低。只需要将胶囊体碰撞器的大小高度更改为 = 胶囊体碰撞器原有值-人物高度偏移量 即可。但是人物的偏移量是负值所以需要使用 +法。
因为胶囊体高度更改会两端向中间缩放相同的高度,所以我们需要将人物下降高度/2.在使用原值去相加。
注意:如果缩放的值太小会导致人物一直在抖动。
方法与序列节点连接。
方法二:设置Mesh的高度
提前在脚本初始化的时候获取到Mesh 的当前的位置Z轴的值(相对位置),将上面蓝图中的设置高度偏移量方法,更改为设置Mesh相对位置 = 初始化时获取Mesh的高度 + 需要偏移的高度值
存在问题:上楼时抖动剧烈,在斜坡时人物模型脚陷入模型中。