动画蓝图IK更新时序问题

前言

假设你人物双手开启了IK,然后这个IK数据来自于武器模型上的某个骨骼,这在FPS游戏中是很常见的情况,正常情况下,你会发现人物双手的位置永远是有延迟的,像卡顿一样

测试案例

  • 玩家角色 BP_TestChar
  • 玩家模型ABP : ABP_Arms
  • 武器蓝图:BP_TestWeapon
  • 武器动画蓝图:ABP_Barrel

玩家蓝图在Tick的时候,从武器蓝图中通过API →GetLeftIK获取Barrel中保存的IK骨骼的Transform信息(简称TM),并打印

image-20240521160505038

武器蓝图在Tick的时候打印GetLeftIK的TM数据

image-20240521160523031

玩家模型动画蓝图在UpdateAnimation中从玩家角色中获取保存的IK的TM数据, 并保存和打印

image-20240521160532325

武器动画蓝图直接从模型获取IK骨骼的TM信息

image-20240521160539087

结果

image-20240521160551380

红色框是同一帧,时序是先ABP再武器和角色蓝图

黄色框内发现同一帧的TM数据是不一样的,看到蓝色框是一样的

所以ABP获取的TM数据是蓝图上一帧的数据

所以为什么ABP从其他蓝图比如角色蓝图中获取位置然后设置到IK会有晚一帧的表现

比如下面动图演示的

录制_2024_05_21_15_37_37_829

原因

因为UE默认的tick时序是先执行组件,然后再执行actor本身,同时不同的actor和不同的组件之间的时序是没法保证的

所以先执行了ABP,再执行actor的刷新,导致ABP获取的数据就晚一帧

解决方案

image-20240521160710641

组件可以添加依赖的Tick组件或者Actor

角色模型添加对武器Actor的依赖

角色模型添加对自身Actor的依赖

如果有必要,武器的模型也要对武器自身的Actor添加依赖

那么最后的时序就会是

  • 武器Actor

  • 武器ABP

  • 角色Actor

  • 角色ABP

测试一下

image-20240521161556310

看视频就没有延迟了

录制_2024_05_21_15_50_10_923