What
即原地不定时,上半身会始终朝向目标,但下半身则会原地不动。当上下半身的Yaw夹角超过一定阈值时,则会播放转身动画。缩小上下半身的Yaw夹角。
How
- 资源:AO,Left_90/180,Right_90/180。动画资源需要Force Lock Root
- 如果是原地可以转身状态(非空中,移动等)
- 计算RootYawOffset (OldRootYaw + RootYawOffset = CurrRootYaw)
- 每帧记录上一次Mesh世界空间的Yaw,RootYawOffset += (当前帧Mesh世界空间的Yaw - 上一帧)* Factor。
- 通过ModifyBone节点修改root。
- 触发转身动作。
- 根据阈值判断,播放动作。
- 每帧获取动作里root的Yaw增量。RootYawOffset -= 增量。
- 计算RootYawOffset (OldRootYaw + RootYawOffset = CurrRootYaw)
- 否则,逐渐将RootYawOffset插值到0. 比如FMath::FInterpTo(RootYawOffset,0,DeltaSeconds,Rate)
- 主动转身,启用Factor。可选的,参加下面需求。
- 开始转身时,让Factor = Abs(RootYawOffset) /90(或者180) .
- 如果没有处于转身状态,并且RootYawOffset处于别扭Yaw和转身阈值之间,并且停留了一段时间,则主动触发转身。
注意:
- 上面Factor如果为1的方式每次转身90/180度,所以最后还会有RootYawOffset。
如果有需求:Bot射击时扭着很难看,策划希望虽然没触发转身阈值,但一段时间后Bot能主动转身。这时需要启用步骤4,每次转身后RootYawOffset要是0。
比如阈值是60度转身,25度射击很别扭,按上面转身后会有90-25=65度的RootYawOffset,还会再次触发转身。如果是40度射击很别扭,转身后会有90-40=50度的RootYawOffset,还是处于别扭的射击中。 - 注意更新顺序,RootYawOffset的计算可以放在AnimInstance的Update里,避免在动画更新后才更新,这样下一帧才会起效果,模型会抖动。