看了一下终于发现了跳跃的关键代码
bool UCharacterMovementComponent::DoJump(bool bReplayingMoves) { if ( CharacterOwner && CharacterOwner->CanJump() ) { // Don't jump if we can't move up/down. if (!bConstrainToPlane || FMath::Abs(PlaneConstraintNormal.Z) != 1.f) { Velocity.Z = JumpZVelocity; SetMovementMode(MOVE_Falling); return true; } } return false; }
这里跳跃就和JumpZVelocity联系在一起了,同时运动状态改成了Falling(我认为这里设置Falling是不对的,因为在空中有上升还有下落两个状态),不过MovementComponent有判断停止下落的函数,可以在状态机里直接用。
当然判断是否可以跳跃就是另一回事了,你也可以自己写一个跳跃函数。
首先是CharactorMovementComponent中的DoJump(),里面检测一下能不能跳跃,(即是否允许角色Z方向的移动,因为要兼容别的类型的游戏。
),之后在ACharacter中DoJump()中与CanJump()进行与运算,CanJump返回CanJumpInternal(),CanJumpInternal()是个事件,所以我们需要
去看CanJumpInternal_Implementation(),果然CanJumpInternal_Implementation是个虚函数,所以修改跳跃逻辑就修改这个函数就好了。
看一下CanJumpInternal_Implementation的逻辑
bool ACharacter::CanJumpInternal_Implementation() const { const bool bCanHoldToJumpHigher = (GetJumpMaxHoldTime() > 0.0f) && IsJumpProvidingForce(); return !bIsCrouched && CharacterMovement && (CharacterMovement->IsMovingOnGround() || bCanHoldToJumpHigher) && CharacterMovement->IsJumpAllowed() && !CharacterMovement-