public override void OnStateEnter(MyMovementState previousState)
        {
            KinematicCharacterMotor.HandlePhysics(false, true);
            _climbingState = ClimbingState.Anchoring;

            // Store the target position and rotation to snap to
            _targetPosition = ActiveLadder.ClosestPointOnLadderSegment(KinematicCharacterMotor.TransientPosition, out _onLadderSegmentState);
            _targetRotation = ActiveLadder.transform.rotation;
        }
        public override void AfterCharacterUpdate(float deltaTime)
        {
            switch (_climbingState)
            {
            case ClimbingState.Climbing:
                // Detect getting off ladder during climbing
                ActiveLadder.ClosestPointOnLadderSegment(KinematicCharacterMotor.TransientPosition, out _onLadderSegmentState);
                if (Mathf.Abs(_onLadderSegmentState) > 0.05f)
                {
                    _climbingState = ClimbingState.DeAnchoring;

                    // If we're higher than the ladder top point
                    if (_onLadderSegmentState > 0)
                    {
                        _targetPosition = ActiveLadder.TopReleasePoint.position;
                        _targetRotation = ActiveLadder.TopReleasePoint.rotation;
                    }
                    // If we're lower than the ladder bottom point
                    else if (_onLadderSegmentState < 0)
                    {
                        _targetPosition = ActiveLadder.BottomReleasePoint.position;
                        _targetRotation = ActiveLadder.BottomReleasePoint.rotation;
                    }
                }
                break;

            case ClimbingState.Anchoring:
            case ClimbingState.DeAnchoring:
                // Detect transitioning out from anchoring states
                if (_anchoringTimer >= AnchoringDuration)
                {
                    if (_climbingState == ClimbingState.Anchoring)
                    {
                        _climbingState = ClimbingState.Climbing;
                    }
                    else if (_climbingState == ClimbingState.DeAnchoring)
                    {
                        AssignedCharacterController.TransitionToState(AssignedCharacterController.DefaultMovementState);
                    }
                }

                // Keep track of time since we started anchoring
                _anchoringTimer += deltaTime;
                break;
            }
        }