public void CollisionBetweenSquareAndSquare(CustomSquareCollider squareA, CustomSquareCollider squareB) { if (squareA == null || squareB == null) { return; } float Ax = squareA.transform.position.x; float Ay = squareA.transform.position.y; float Bx = squareB.transform.position.x; float By = squareB.transform.position.y; //float minDistanceTest = squareA.transform.position.x + squareA.size.x - squareB.transform.position.x + squareB.size.x; //float distanceBetweenSquares = (Ax - Bx * Ax - Bx) + (Ay - By * Ay - By); float distanceBetweenSquares = Vector2.Distance(squareA.transform.position, squareB.gameObject.transform.position); if (distanceBetweenSquares < squareA.size.x / 2 + squareB.size.x / 2) { if ((squareA.LeftEdge < squareB.RightEdge && squareB.RightEdge < squareA.RightEdge) && (squareA.TopEdge > squareB.BottomEdge && squareB.BottomEdge > squareA.BottomEdge || squareA.BottomEdge < squareB.TopEdge && squareB.TopEdge < squareA.TopEdge)) { UnityEngine.MonoBehaviour.print($"Square {squareA.gameObject.name} and square {squareB.gameObject.name} Collided"); if (squareA.PhysicsProperties.canBounce || squareB.PhysicsProperties.canBounce) { BounceCollision(squareA, squareB); } else if (squareA.PhysicsProperties.stopOnCollide || squareB.PhysicsProperties.stopOnCollide) { if (squareA.PhysicsProperties.stopOnCollide) { StopOnCollide(squareA, squareB); } else { StopOnCollide(squareB, squareA); } } } else if ((squareA.RightEdge > squareB.LeftEdge && squareB.LeftEdge > squareA.LeftEdge) && (squareA.TopEdge > squareB.BottomEdge && squareB.BottomEdge > squareA.BottomEdge || squareA.BottomEdge < squareB.TopEdge && squareB.TopEdge < squareA.TopEdge)) { BounceCollision(squareA, squareB); } eventBus.Publish(new OnPhysicsObjectCollide(squareA, squareB)); // chamando o evento. Analogo ao "Invoke". } }
public void CollisionBetweenCircleAndSquare(CustomCircleCollider circle, CustomSquareCollider square) { if (circle == null || square == null) { return; } float Cx = circle.transform.position.x; float Cy = circle.transform.position.y; float Sx = square.transform.position.x; float Sy = square.transform.position.y; //float minDistanceTest = square.transform.position.x + square.size.x - circle.transform.position.x + circle.CircleDiameter; //float distanceBetweenObjects = (Cx - Sx * Cx - Sx) + (Cy - Sy * Cy - Sy); float distanceBetweenObjects = Vector2.Distance(square.transform.position, circle.gameObject.transform.position); if (distanceBetweenObjects < circle.CircleDiameter + square.size.x) { /*Testando se as bordas do circulo (circulo + raio) estão sobreponto alguma das bordas do quadrilatero em questão*/ if (Cx + circle.CircleRadius > square.LeftEdge && Cx - circle.CircleRadius < square.RightEdge && (Cy + circle.CircleRadius > square.BottomEdge && square.TopEdge > Cy - circle.CircleRadius || Cy - circle.CircleRadius < square.TopEdge && square.BottomEdge < Cy + circle.CircleRadius)) { if (circle.PhysicsProperties.canBounce) { BounceCollision(circle, square); } if (circle.PhysicsProperties.stopOnCollide || square.PhysicsProperties.stopOnCollide) { if (circle.PhysicsProperties.stopOnCollide) { StopOnCollide(circle, square); } else { StopOnCollide(square, circle); } } eventBus.Publish(new OnPhysicsObjectCollide(circle, square)); // chamando o evento. Analogo ao "Invoke". } else { return; } eventBus.Publish(new OnPhysicsObjectCollide(square, circle)); // chamando o evento. Analogo ao "Invoke". } }