LyraLog7 动画系统2

Pivot 回转运动

Base_Pivot

添加 Pivot 状态,他可以从Start和Cycle过度过来 (Pivot Srouce)

过度条件是速度和加速度方向过大。

里面的状态机

SetUpPivotState

就设置了一个 PivotInitDirection = LocalVelocityDirection

UpdatePivotState

在Item动画蓝图进入Pivot状态的时候,会设置一个 LastPivotTime = 0.2

然后再这个更新中不断的减去 DeltaTime 直到0

【状态过度】

  • Pivot=>Stop

优先级2,条件是没有加速度

Duration 0.25

Blend Profile Skeleton FastFeet

  • Pivot=>Cycle

优先级1:LinkedLyaerChange == True

惯性化

优先级2:

Duration 0.5

这是一个Anim Notify State。大概挂在Pivot动画的后半段,过度完成到正常Locomotion的状态了?

优先级3:

蹲伏,开镜状态变化,Pivot初始方向和速度方向是否垂直

Item_Pivot

注意 Pivot SM 的 Max Transitions Per Frame 1

上半身混合前面提过了。

切换条件是,三个条件都满足

  • 速度方向 Dot 加速度方向 < 0
  • 移动方向和初始化pivot方向不垂直
  • 速度方向 Dot Pivot 初始加速度 < 0

其他配置,惯性化,Blend Settings Fast Feet

状态机里面A, B是一样的

setup和update函数我们看看,后面的朝鲜扭曲和步幅扭曲我们看过了。

注意第一个节点,Sequence和 Explicit Time 要写成dynamic

  • SetUpPivotAnim

初始化 PivotStartAcceleration

根据加速度方向设置初始动画

StrideWarpingPivotAlpha = 0

  • UpdatePivotAnim

LastPivotTime一开始是0.2,会在更新中随着delta time 变为0,所以在0.2s内,如果方向算出来的是另一个动画。就允许重新设置Pivot Start Acceleration。并设置动画。

然后判断

如果 【速度和加速度相反】 距离匹配

如果【速度和加速度】相同

先计算Stride Warping Pivot Alpha

这个是

动画播放时间 - Pivot开始时间(短时间内pivot可能重新开始) - 0.15 然后

map range clamped 【0, 0.2】=> 【0, 1】

然后

整体性总结

原地转身

首先这个动画状态机有一个初始化函数SetUpIdleState。顺序调用

ChooseIdleBreakDelayTime 和 ResetIdleBreakTransitionLogic

===

ChooseIdleBreakDelayTime:

Abs(WorldPos.X + WorldPos.Y) 向0取整

然后 % 10 + 6 再转float 赋值给 IdleBreakDelayTime ???

这是为了随机化一个时间把?

===

ResetIdleBreakTransitionLogic:

IdleBreakDelayTime 赋值给 TimeUntilNextIdleBreak

这是为了随机一个 5~15的时间,不要一直触发这个状态呀

》》

这里也有两个函数

SetUpIdleState 和前面的初始化是一样的,里面顺序调用 ChooseIdleBreakDelayTime 和 ResetIdleBreakTransitionLogic

UpdateIdleState

只要Idle状态没有混出,就 ProcessIdleBreakTransitionLogic

如果【CanPlayIdleBreak】里面把 TimeUntilNextIdleBreak 一直减去 delta time。否则就Reset

【CanPlayIdleBreak】的条件是,有配置相关的动画,并且不处于特殊状态(如蹲伏,开镜头,播放蒙太奇)

小结一下:

初始化的时候随机一个 5~15的 IdleBreakDelayTime

Reset的时候 TimeUntilNextIdleBreak = IdleBreakDelayTime 赋值

在可以更新IdleBreak的时候,TimeUntilNextIdleBreak一直减去DeltaTime到0

就这东西,Idle打断,然后原地旋转,恢复。也可能突然恢复到Idle

Item IdleBreak

函数里面只是选一个动画而已,不展开了

Item TurnInPlaceRotation

  • Setup TurnInPlace Anim

设置变量 TurnInPlaceAnimTime = 0

  • Update TurnInPlace Anim

TurnInPlaceAnimTime 累加 delta time

选择turn动画

  • SetUpTurnInplaceRotaionState

sign(RootYawOffset) x -1 赋值给 TurnInPlaceRotationDirection

Item TurnInPlaceRecovery

  • Update TurnInPlace Recovery

根据 TurnInPlaceRecoveryDirection 设置恢复动画

  • SetUpTurnInPlaceRecoveryState

TurnInPlaceRecoveryDirection = TurnInPlaceRotationDirection

过度条件

先小结一下

一个是 TurnInPlaceRotationDirection 一个根据yaw的值

TurnInPlaceAnimTime初始化是0,随着delta累加。

结合前面TimeUntilNextIdleBreak是先初始化为一个值,然后减小。

红色的条件是 RootYawOffset > 50

通过动画曲线 TurnYawWeight 获得快要播放完成的状态,进入Recovery有一个过度动画。如果顺利完成就回Idle。

也可能重新进入Rotation。

上一篇
下一篇