/// <summary>
        /// Performs a collision test in the horizontal direction (depending of the mode selected) in order to
        /// depenetrate the character from moving colliders.
        /// </summary>
        public CollisionHitInfo VerticalDepenetrationCollision(bool positiveDirection, LayerMask layerMask)
        {
            CollisionHitInfo hitInfo = new CollisionHitInfo();

            hitInfo.Reset();

            float yDirection = positiveDirection ? 1 : -1;

            Vector3 castDirection = yDirection * characterBody.bodyTransform.Up;
            float   castDistance  = characterBody.height - characterBody.SkinWidth - characterBody.BoxThickness;

            // BOXCAST -------------------------------------------------------------------------------------------------------------------
            Vector3 boxCenter = positiveDirection ?
                                characterBody.middleBottomCollision + characterBody.bodyTransform.Up * (characterBody.BoxThickness / 2) :
                                characterBody.middleTopCollision - characterBody.bodyTransform.Up * (characterBody.BoxThickness / 2);


            hitInfo = PhysicsUtilities.Boxcast(
                is3D,
                boxCenter,
                characterBody.verticalBoxSize,
                castDirection,
                castDistance,
                characterBody.bodyTransform.Up,
                layerMask
                );


            return(hitInfo);
        }
        /// <summary>
        /// Performs a collision test towards the ground.
        /// </summary>
        public CollisionHitInfo ProbeGroundCollision(float groundClampingDistance, LayerMask layerMask)
        {
            CollisionHitInfo hitInfo = new CollisionHitInfo();

            hitInfo.Reset();

            if (groundClampingDistance < 0)
            {
                return(hitInfo);
            }

            float castDistance = characterBody.StepOffset + groundClampingDistance;


            // BOXCAST ----------------------------------------------------------------------------------------------------------------
            Vector3 boxCenter = characterBody.bodyTransform.Position +
                                characterBody.bodyTransform.Up * (characterBody.StepOffset + characterBody.BoxThickness / 2);

            hitInfo = PhysicsUtilities.Boxcast(
                is3D,
                boxCenter,
                characterBody.verticalBoxSize,
                -characterBody.bodyTransform.Up,
                castDistance,
                characterBody.bodyTransform.Up,
                layerMask
                );


            return(hitInfo);
        }
        /// <summary>
        /// Performs a collision detection in the horizontal direction, considering the whole character characterBody.
        /// </summary>
        public CollisionHitInfo HorizontalNotGroundedCollision(float deltaMovement, LayerMask layerMask)
        {
            CollisionHitInfo hitInfo = new CollisionHitInfo();

            hitInfo.Reset();

            float movementSign   = Mathf.Sign(deltaMovement);
            float movementAmount = Mathf.Abs(deltaMovement);

            float   castDistance  = characterBody.SkinWidth + movementAmount;
            Vector3 castDirection = movementSign * characterBody.bodyTransform.Right;


            Vector3 boxCenter = characterBody.center +
                                movementSign * characterBody.bodyTransform.Right * (characterBody.widthExtents - characterBody.SkinWidth - (characterBody.BoxThickness) / 2);

            hitInfo = PhysicsUtilities.Boxcast(
                is3D,
                boxCenter,
                characterBody.horizontalBoxSize,
                castDirection,
                castDistance,
                characterBody.bodyTransform.Up,
                layerMask
                );

            return(hitInfo);
        }
        /// <summary>
        /// Performs a collision test in the horizontal direction (depending of the mode selected) in order to
        /// depenetrate the character from moving colliders.
        /// </summary>
        public CollisionHitInfo HorizontalDepenetrationCollision(bool grounded, bool positiveDirection, LayerMask layerMask)
        {
            CollisionHitInfo hitInfo = new CollisionHitInfo();

            hitInfo.Reset();


            float   xDirection    = positiveDirection ? 1 : -1;
            Vector3 castDirection = xDirection * characterBody.bodyTransform.Right;
            float   castDistance  = characterBody.width - characterBody.SkinWidth - characterBody.BoxThickness;

            hitInfo.distance = castDistance;

            Vector3 boxCenter = Vector3.zero;

            if (grounded)
            {
                boxCenter = positiveDirection ?
                            characterBody.bottomLeftCollision_StepOffset +
                            characterBody.bodyTransform.Up * (characterBody.height - characterBody.StepOffset - characterBody.SkinWidth) / 2 +
                            characterBody.bodyTransform.Right * (characterBody.BoxThickness / 2) :
                            characterBody.bottomRightCollision_StepOffset +
                            characterBody.bodyTransform.Up * (characterBody.height - characterBody.StepOffset - characterBody.SkinWidth) / 2 -
                            characterBody.bodyTransform.Right * (characterBody.BoxThickness / 2);
            }
            else
            {
                boxCenter = positiveDirection ?
                            characterBody.middleLeftCollision + characterBody.bodyTransform.Right * (characterBody.BoxThickness / 2) :
                            characterBody.middleRightCollision - characterBody.bodyTransform.Right * (characterBody.BoxThickness / 2);
            }

            hitInfo = PhysicsUtilities.Boxcast(
                is3D,
                boxCenter,
                characterBody.horizontalBoxSize,
                castDirection,
                castDistance,
                characterBody.bodyTransform.Up,
                layerMask
                );

            return(hitInfo);
        }