using UnityEngine; using System.Collections.Generic; public static class CuttingUtils { public static int FindNearestEdgePointIndex(Vector2 pos, List edgePoints, out float minDist) { int nearestIndex = 0; minDist = float.MaxValue; for (int i = 0; i < edgePoints.Count; i++) { float dist = Vector2.Distance(pos, edgePoints[i]); if (dist < minDist) { minDist = dist; nearestIndex = i; } } return nearestIndex; } public static Vector2 GetClosestPointOnSegment(Vector2 a, Vector2 b, Vector2 p) { Vector2 ab = b - a; float t = Vector2.Dot(p - a, ab) / ab.sqrMagnitude; t = Mathf.Clamp01(t); return a + ab * t; } public static int WrapIndex(int index, int count) { if (index < 0) return count - 2; if (index >= count - 1) return 0; return index; } public static List GetSpritePhysicsShapePoints(SpriteRenderer spriteRenderer) { List shapePoints = new List(); spriteRenderer.sprite.GetPhysicsShape(0, shapePoints); if (shapePoints.Count == 0) { Debug.LogError("目标Sprite没有物理形状点"); return null; } return shapePoints; } public static (List scaledPoints, List originalPoints) ProcessEdgePoints( List shapePoints, SpriteRenderer spriteRenderer, float edgePointsScale = 1.2f, float desiredSegmentLength = 0.1f) { if (shapePoints == null || shapePoints.Count == 0) return (null, null); List scaledPoints = new List(); List originalPoints = new List(); // 计算中心点 Vector2 center = Vector2.zero; foreach (Vector2 point in shapePoints) { center += point; } center /= shapePoints.Count; // 处理每个线段 for (int i = 0; i < shapePoints.Count; i++) { Vector2 p1 = spriteRenderer.transform.TransformPoint(shapePoints[i]); Vector2 p2 = spriteRenderer.transform.TransformPoint(shapePoints[(i + 1) % shapePoints.Count]); Vector2 scaledP1 = center + (p1 - center) * edgePointsScale; Vector2 scaledP2 = center + (p2 - center) * edgePointsScale; float segmentLength = Vector2.Distance(scaledP1, scaledP2); int steps = Mathf.Max(1, Mathf.CeilToInt(segmentLength / desiredSegmentLength)); for (int s = 0; s < steps; s++) { float t = (float)s / steps; Vector2 interpolated = Vector2.Lerp(scaledP1, scaledP2, t); Vector2 originalInterpolated = Vector2.Lerp(p1, p2, t); scaledPoints.Add(interpolated); originalPoints.Add(originalInterpolated); } } // 确保首尾相连 if ((scaledPoints[0] - scaledPoints[scaledPoints.Count - 1]).sqrMagnitude > 0.0001f) { scaledPoints.Add(scaledPoints[0]); originalPoints.Add(originalPoints[0]); } return (scaledPoints, originalPoints); } }