前面我们完成了组件的绑定和判断条件后,我们就可以开始写攀岩的具体功能了。
首先当我们攀岩时,character应该是处于一个缩着的状态,那我们的碰撞范围也要相应的变小。
重载我们的OnMovementModeChanged,从CharacterMovementComponent中调用,通知角色移动模式已经改变。
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
DECLARE_DELEGATE(FOnEnterClimbState)
DECLARE_DELEGATE(FOnExitClimbState)
FOnEnterClimbState OnEnterClimbStateDelegate;
FOnExitClimbState OnExitClimbStateDelegate;
void UCustomMovementComponent::OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode)
{
if (IsOrNotClimbingModel())
{
bOrientRotationToMovement = false;//将我们的旋转给取消(character的旋转取决于加速度的方向)
CharacterOwner->GetCapsuleComponent()->SetCapsuleHalfHeight(48.f);//将我们碰撞胶囊体范围变为一半
OnEnterClimbStateDelegate.ExecuteIfBound();
}
if (PreviousMovementMode == MOVE_Custom && PreviousCustomMode == ECustomMovementMode::MOVE_Climb)//当之前的模式为custom时
{
bOrientRotationToMovement = true;
CharacterOwner->GetCapsuleComponent()->SetCapsuleHalfHeight(96.f);
const FRotator DirtyRotation = UpdatedComponent->GetComponentRotation();//重置旋转
const FRotator CleanStandRotation = FRotator(0.f, DirtyRotation.Yaw, 0.f);
UpdatedComponent->SetRelativeRotation(CleanStandRotation);
StopMovementImmediately();//立即停止运动
OnExitClimbStateDelegate.ExecuteIfBound();
}
Super::OnMovementModeChanged(PreviousMovementMode, PreviousCustomMode);
}
重载运动更新
void UCustomMovementComponent::PhysCustom(float deltaTime, int32 It