private bool CheckGround(CharacterControllerMotor motor, Transform transform)
        {
            var controller = motor.CharacterController;

            var worldCenter = transform.position + controller.center;
            var lowPoint    = worldCenter - new Vector3(0, controller.height * 0.5f, 0);

            Profiler.BeginSample("RaycastNonAlloc");
            var layerMask = CPhysicSettings.PhysicInteractionLayerMask;
            var rayLength = Physics.RaycastNonAlloc(lowPoint, Vector3.down, s_RaycastHits, 0.0001f, layerMask);

            Profiler.EndSample();

            for (int i = 0; i != rayLength; i++)
            {
                var ray = s_RaycastHits[i];
                if (ray.transform == transform)
                {
                    continue;
                }

                var velocityToAdd = ray.point - lowPoint;

                CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, true);
                motor.MoveBy(velocityToAdd);
                CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, false);

                return(true);
            }

            return(false);
        }
        private Vector3 ProbeGround(CharacterControllerMotor motor, Transform transform, Vector3 previousDirection, float maxAngle, float globalMaxAngle)
        {
            var controller = motor.CharacterController;

            var worldCenter = transform.position + controller.center;
            var lowPoint    = worldCenter - new Vector3(0, controller.height * 0.5f, 0);
            var highPoint   = lowPoint + new Vector3(0, controller.height, 0);

            Profiler.BeginSample("RaycastNonAlloc");
            var layerMask = CPhysicSettings.PhysicInteractionLayerMask;
            var rayLength = Physics.RaycastNonAlloc(lowPoint, Vector3.down, s_RaycastHits, controller.stepOffset, layerMask);

            Profiler.EndSample();

            if (previousDirection == Vector3.zero)
            {
                previousDirection = Vector3.up;
            }

            var highestAngle = 0f;
            var highestDir   = previousDirection;
            var highestY     = float.MinValue;

            for (int i = 0; i != rayLength; i++)
            {
                var ray = s_RaycastHits[i];
                if (ray.transform == transform)
                {
                    continue;
                }

                //ray.normal = RepairHitSurfaceNormal(ray);

                var angle = Vector3.Angle(previousDirection, ray.normal);
                if (angle > highestAngle)
                {
                    highestAngle = angle;
                    highestDir   = ray.normal;
                }

                if (angle > maxAngle || Vector3.Angle(Vector3.up, ray.normal) > globalMaxAngle &&
                    highestY > ray.point.y)
                {
                    continue;
                }

                var velocityToAdd = ray.point - lowPoint;

                CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, true);
                motor.MoveBy(velocityToAdd);
                CPhysicSettings.Active.SetGlobalCollision(motor.gameObject, false);

                highestY = ray.point.y;

                motor.IsGroundForcedThisFrame = true;
            }

            return(highestDir);
        }