public virtual void SolveBodyCollisions()
        {
            if (Facade.Source == null)
            {
                return;
            }

            if (offsetObjectFollower != null)
            {
                offsetObjectFollower.Process();
            }

            if (sourceObjectFollower != null)
            {
                sourceObjectFollower.Process();
            }

            Process();
            Vector3 characterControllerPosition = Character.transform.position + Character.center;
            Vector3 difference = Facade.Source.transform.position - characterControllerPosition;

            difference.y = 0f;

            float minimumDistanceToColliders = Character.radius - Facade.SourceThickness;

            if (difference.magnitude < minimumDistanceToColliders)
            {
                return;
            }

            float newDistance = difference.magnitude - minimumDistanceToColliders;

            (Facade.Offset == null ? Facade.Source : Facade.Offset).transform.position -= difference.normalized * newDistance;
            Process();
        }
        /// <summary>
        /// Solves body collisions by not moving the body in case it can't go to its current position.
        /// </summary>
        /// <remarks>
        /// If body collisions should be prevented this method needs to be called right before or right after applying any form of movement to the body.
        /// </remarks>
        public virtual void SolveBodyCollisions()
        {
            if (!this.IsValidState() || Facade.Source == null)
            {
                return;
            }

            if (offsetObjectFollower != null)
            {
                offsetObjectFollower.Process();
            }

            if (sourceObjectFollower != null)
            {
                sourceObjectFollower.Process();
            }

            Process();
            Vector3 characterControllerPosition = Character.transform.position + Character.center;
            Vector3 difference = Facade.Source.transform.position - characterControllerPosition;

            difference.y = 0f;

            float minimumDistanceToColliders = Character.radius - Facade.SourceThickness;

            if (difference.magnitude < minimumDistanceToColliders && !IsDiverged)
            {
                return;
            }

            float newDistance = difference.magnitude - minimumDistanceToColliders;

            Vector3 newPosition = difference.normalized * newDistance;

            if (Facade.Offset == null)
            {
                if (UpdateSourcePosition)
                {
                    Facade.Source.transform.position -= newPosition;
                }
            }
            else
            {
                Facade.Offset.transform.position -= newPosition;
            }

            Process();
        }
        /// <summary>
        /// Solves body collisions by not moving the body in case it can't go to its current position.
        /// </summary>
        /// <remarks>
        /// If body collisions should be prevented this method needs to be called right before or right after applying any form of movement to the body.
        /// </remarks>
        public virtual void SolveBodyCollisions()
        {
            if (!isActiveAndEnabled || source == null)
            {
                return;
            }

            if (offsetObjectFollower != null)
            {
                offsetObjectFollower.Process();
            }

            if (sourceObjectFollower != null)
            {
                sourceObjectFollower.Process();
            }

            internalSetup.Process();

            Vector3 characterControllerPosition = internalSetup.characterController.transform.position + internalSetup.characterController.center;
            Vector3 difference = source.transform.position - characterControllerPosition;

            difference.y = 0f;

            float minimumDistanceToColliders = internalSetup.characterController.radius - sourceThickness;

            if (difference.magnitude < minimumDistanceToColliders)
            {
                return;
            }

            float newDistance = difference.magnitude - minimumDistanceToColliders;

            (offset == null ? source : offset).transform.position -= difference.normalized * newDistance;

            internalSetup.Process();
        }