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); }
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; }
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; }