private void HandleJumping() { if (currentMotorState == PlayerMotorStateEnum.Grounded || ((currentMotorState == PlayerMotorStateEnum.Falling || currentMotorState == PlayerMotorStateEnum.Sliding) && Time.time - lastGroundedTime < motorVariables.ExtraJumpTimeAfterLeavingGround)) { if (jumpPressed) { GroundContactLost(); JumpStart(); currentMotorState = PlayerMotorStateEnum.Jumping; } } }
private void HandleState() { var isRising = IsRisingOrFalling() && (VectorMath.GetDotProduct(momentum, mover.transform.up) > 0f); var isSliding = mover.IsGrounded() && (Vector3.Angle(mover.GetGroundNormal(), mover.transform.up) > motorVariables.SlopeLimit); switch (currentMotorState) { case PlayerMotorStateEnum.Grounded: if (isRising) { currentMotorState = PlayerMotorStateEnum.Rising; GroundContactLost(); break; } if (!mover.IsGrounded()) { currentMotorState = PlayerMotorStateEnum.Falling; GroundContactLost(); break; } if (isSliding) { currentMotorState = PlayerMotorStateEnum.Sliding; break; } lastGroundedTime = Time.time; break; case PlayerMotorStateEnum.Falling: if (isRising) { currentMotorState = PlayerMotorStateEnum.Rising; break; } if (mover.IsGrounded() && !isSliding) { currentMotorState = PlayerMotorStateEnum.Grounded; GroundContactRegained(momentum); break; } if (isSliding) { currentMotorState = PlayerMotorStateEnum.Sliding; GroundContactRegained(momentum); break; } break; case PlayerMotorStateEnum.Sliding: if (isRising) { currentMotorState = PlayerMotorStateEnum.Rising; GroundContactLost(); break; } if (!mover.IsGrounded()) { currentMotorState = PlayerMotorStateEnum.Falling; break; } if (mover.IsGrounded() && !isSliding) { GroundContactRegained(momentum); currentMotorState = PlayerMotorStateEnum.Grounded; break; } break; case PlayerMotorStateEnum.Rising: if (isRising) { break; } if (mover.IsGrounded() && !isSliding) { currentMotorState = PlayerMotorStateEnum.Grounded; GroundContactRegained(momentum); break; } if (isSliding) { currentMotorState = PlayerMotorStateEnum.Sliding; break; } if (!mover.IsGrounded()) { currentMotorState = PlayerMotorStateEnum.Falling; break; } break; case PlayerMotorStateEnum.Jumping: if ((Time.time - jumpStartTime) > motorVariables.JumpDuration) { currentMotorState = PlayerMotorStateEnum.Rising; break; } break; } }