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。

!