Example #1
0
        public CollisionInfo Collide(Vector2 displacement)
        {
            Bounds        bounds  = GetInnerBounds();
            BoundsCorners corners = GetBoundsCorners(bounds);

            CollisionInfo collisions = new CollisionInfo();

            HorizontalRays(corners, displacement.x, ref collisions);
            VerticalRays(corners, displacement.y, ref collisions);
            return(collisions);
        }
Example #2
0
        private void VerticalRays(BoundsCorners corners, float verticalDisplacement, ref CollisionInfo collisions)
        {
            if (Mathf.Approximately(verticalDisplacement, 0f))
            {
                return;
            }

            bool    isMovingUp   = Mathf.Sign(verticalDisplacement) > 0f;
            Vector2 rayDirection = isMovingUp ? Vector2.up : Vector2.down;
            float   rayLength    = Mathf.Abs(verticalDisplacement) + skinWidth;
            Vector2 rayOrigin    = isMovingUp ? corners.topLeft : corners.bottomLeft;

            rayOrigin.x += collisions.vec.x;

            for (int i = 0; i < verticalRayCount; i++)
            {
                RaycastHit2D hit = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, collisionMask);
                Debug.DrawRay(rayOrigin, rayDirection * rayLength, Color.red);

                if (hit)
                {
                    rayLength = hit.distance;

                    // collisions.collider2D = hit.collider;
                    if (isMovingUp)
                    {
                        collisions.above = true;
                    }
                    else
                    {
                        collisions.below = true;
                    }
                }

                rayOrigin += Vector2.right * verticalRaySpacing;
            }

            collisions.vec.y = (rayLength - skinWidth) * rayDirection.y;
        }
Example #3
0
        private void HorizontalRays(BoundsCorners corners, float horizontalDisplacement, ref CollisionInfo collisions)
        {
            if (Mathf.Approximately(horizontalDisplacement, 0f))
            {
                return;
            }

            bool    isMovingRight = Mathf.Sign(horizontalDisplacement) > 0f;
            Vector2 rayDirection  = isMovingRight ? Vector2.right : Vector2.left;
            float   rayLength     = Mathf.Abs(horizontalDisplacement) + skinWidth;
            Vector2 rayOrigin     = isMovingRight ? corners.bottomRight : corners.bottomLeft;

            rayOrigin.y += collisions.vec.y;

            for (int i = 0; i < horizontalRayCount; i++)
            {
                RaycastHit2D hit = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, collisionMask);
                Debug.DrawRay(rayOrigin, rayDirection * rayLength, Color.red);

                if (hit)
                {
                    rayLength = hit.distance;

                    // collisions.collider2D = hit.collider;
                    if (isMovingRight)
                    {
                        collisions.right = true;
                    }
                    else
                    {
                        collisions.left = true;
                    }
                }

                rayOrigin += Vector2.up * horizontalRaySpacing;
            }

            collisions.vec.x = (rayLength - skinWidth) * rayDirection.x;
        }