动画蓝图IK更新时序问题
前言
假设你人物双手开启了IK,然后这个IK数据来自于武器模型上的某个骨骼,这在FPS游戏中是很常见的情况,正常情况下,你会发现人物双手的位置永远是有延迟的,像卡顿一样
测试案例
- 玩家角色 BP_TestChar
- 玩家模型ABP : ABP_Arms
- 武器蓝图:BP_TestWeapon
- 武器动画蓝图:ABP_Barrel
玩家蓝图在Tick的时候,从武器蓝图中通过API →GetLeftIK获取Barrel中保存的IK骨骼的Transform信息(简称TM),并打印
武器蓝图在Tick的时候打印GetLeftIK的TM数据
玩家模型动画蓝图在UpdateAnimation中从玩家角色中获取保存的IK的TM数据, 并保存和打印
武器动画蓝图直接从模型获取IK骨骼的TM信息
结果
红色框是同一帧,时序是先ABP再武器和角色蓝图
黄色框内发现同一帧的TM数据是不一样的,看到蓝色框是一样的
所以ABP获取的TM数据是蓝图上一帧的数据
所以为什么ABP从其他蓝图比如角色蓝图中获取位置然后设置到IK会有晚一帧的表现
比如下面动图演示的
原因
因为UE默认的tick时序是先执行组件,然后再执行actor本身,同时不同的actor和不同的组件之间的时序是没法保证的
所以先执行了ABP,再执行actor的刷新,导致ABP获取的数据就晚一帧
解决方案
组件可以添加依赖的Tick组件或者Actor
角色模型添加对武器Actor的依赖
角色模型添加对自身Actor的依赖
如果有必要,武器的模型也要对武器自身的Actor添加依赖
那么最后的时序就会是
武器Actor
武器ABP
角色Actor
角色ABP
测试一下
看视频就没有延迟了