void DoubleJump_SuperUpdate() { Vector3 planarMoveDirection = Math3d.ProjectVectorOnPlane(controller.up, moveDirection); Vector3 verticalMoveDirection = moveDirection - planarMoveDirection; planarMoveDirection = Vector3.MoveTowards(planarMoveDirection, LocalMovement() * WalkSpeed, JumpAcceleration * JumpControl * controller.deltaTime); if (Vector3.Angle(verticalMoveDirection, controller.up) > 90 && AcquiringGround()) { moveDirection = planarMoveDirection; currentState = PlayerStates.Idle; return; } collisionVector = controller.IsOnTheWall(LocalMovement()); if (collisionVector != Vector3.zero) { currentState = PlayerStates.WallSlide; return; } foreach (var c in controller.collisionData) { if (c.normal == -controller.up) { verticalMoveDirection.y = 0; break; } } if (moveDirection.y == 0) { currentState = PlayerStates.Fall; return; } if (IsOnEdge()) { currentState = PlayerStates.Climb; return; } verticalMoveDirection -= controller.up * Gravity * controller.deltaTime; moveDirection = planarMoveDirection + verticalMoveDirection; }