using UnityEngine; namespace XericUI.VisualForm { /// /// 碰撞分离静态工具类。 /// 提供两个矩形之间的排斥力计算,用于屏幕空间UI碰撞分离。 /// 算法参考 BubblePhysicsSolver.CalculateRepulsionForce。 /// public static class CollisionUtils { /// /// 计算两个重叠矩形的相互排斥向量(从A推离B的方向)。 /// 沿最小重叠轴方向推开,推力大小 = 重叠深度 × 推力系数。 /// /// 矩形A /// 矩形B /// 推力系数(0到1),默认0.5 /// A应受到的推离向量(B应施加相反向量) public static Vector2 CalculateRepulsion(Rect rectA, Rect rectB, float pushForce = 0.5f) { Vector2 centerA = rectA.center; Vector2 centerB = rectB.center; Vector2 delta = centerA - centerB; float halfW = (rectA.width + rectB.width) * 0.5f; float halfH = (rectA.height + rectB.height) * 0.5f; float overlapX = halfW - Mathf.Abs(delta.x); float overlapY = halfH - Mathf.Abs(delta.y); if (overlapX <= 0f || overlapY <= 0f) return Vector2.zero; // 沿最小重叠轴推开 if (overlapX < overlapY) { return new Vector2(Mathf.Sign(delta.x) * overlapX * pushForce, 0f); } else { return new Vector2(0f, Mathf.Sign(delta.y) * overlapY * pushForce); } } /// /// 判断两个矩形是否重叠 /// public static bool Overlaps(Rect a, Rect b) { return a.xMin < b.xMax && a.xMax > b.xMin && a.yMin < b.yMax && a.yMax > b.yMin; } } }