移动步幅
在角色骨骼的右下角可以添加曲线。
有什么用呢
我们打开一个Walk的动画,我们可以给动画添加曲线用于某些作用。比如曲线 Weight_Gait 的值 走1,跑2,冲刺3。这样我们就不用 在代码里。如果动画名 为 xxx 为跑步状态这样判断。而是动画当前帧曲线为多少作为判断依据。
那么我们逻辑维护走跑冲刺状态有什么用呢,用步态Gait变量不好吗。因为这个是逻辑上的。而动画实际可能还没切换过来。
_我们看ALS_N_WalkRunF 这个混合空间 横轴左边是静止的姿势,右边是移动动画。效果就是值越小。那么步伐迈的就越小。
我们同时看走跑两条曲线
然后结合代码。
void UCwlBaseAnimIns::CalculateStrideBlend()
{
// 步幅适配,在混合空间中这一个维度,0是一个走路/跑步的pose,1是走路/跑步动画
// 对于这条曲线 走1,跑2,冲刺3
const float WeightGait = GetAnimCurveClamped(TEXT("Weight_Gait"), -1.f, 0.f, 1.f);
StrideBlend = FMath::Lerp(AlsAnimCurveDataAsset->StrideBlendNWalk->GetFloatValue(Speed), AlsAnimCurveDataAsset->StrideBlendNRun->GetFloatValue(Speed), WeightGait);
// 这个曲线BasePose_CLF动画是没有的,通过Cache的LocomotionCLF modify curve节点修改曲线值来实现
StrideBlend = FMath::Lerp(StrideBlend, AlsAnimCurveDataAsset->StrideBlendCWalk->GetFloatValue(Speed), GetCurveValue(TEXT("BasePose_CLF")));
}
float UCwlBaseAnimIns::GetAnimCurveClamped(FName CurveName, float Bias, float ClampedMin, float ClampedMax)
{
return FMath::Clamp(GetCurveValue(CurveName) + Bias, ClampedMin, ClampedMax);
}
结合代码,先是曲线走是1,跑是2。-1后clamped一下。走跑就是一个0~1的区间值。来选择这两条曲线。
然后再根据姿态曲线,如果是蹲,那么曲线值是1,那么就越靠近蹲伏的曲线,蹲伏实际和走是同一条曲线。
这条曲线在动画资源是没有的,在动画状态机是蹲伏状态的时候通过modify曲线来实现有值
走跑混合度
void UCwlBaseAnimIns::CalculateWalkRunBlend()
{
if (Gait == ECwlGait::Walking)
{
WalkRunBlend = 0.f;
}
else
{
WalkRunBlend = 1.f;
}
}
决定上面的混合空间是走还是跑。直接通过姿态判断即可。
动画播放速度
混合空间的播放速度。
比如速度越小,播放频率也越小。
步幅越小,那么播放频率要增加。还有是缩放也会影响播放频率。
void UCwlBaseAnimIns::CalculateStandingPlayRate()
{
// 对于这条曲线 走1,跑2,冲刺3
// [1] 速度越小,播放频率也越小. [2] 步幅越小,那么播放频率要增加。还有是缩放也会影响播放频率
float WeightGait = GetAnimCurveClamped(TEXT("Weight_Gait"), -1.f, 0.f, 1.f);
StandingPlayRate = FMath::Lerp(Speed / AnimatedWalkSpeed, Speed / AnimatedRunSpeed, WeightGait);
WeightGait = GetAnimCurveClamped(TEXT("Weight_Gait"), -2.f, 0.f, 1.f);
StandingPlayRate = FMath::Lerp(StandingPlayRate, Speed / AnimatedSprintSpeed, WeightGait);
StandingPlayRate = FMath::Clamp(StandingPlayRate / StrideBlend / GetOwningComponent()->GetComponentScale().Z, 0.f, 3.f);
}
上面的混合空间叫 ALS_N_WalkRun_F
上面三部分算出的变量,连到混合空间,作为前向运动。