From 1983ad53fc7db3bb43622392271071896cc39870 Mon Sep 17 00:00:00 2001 From: bottlefish <781230111@qq.com> Date: Sat, 17 May 2025 04:51:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=BD=BF=E8=BD=AE=E5=90=B8?= =?UTF-8?q?=E9=99=84=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FixSystemNew/BodyModule/GearFollower.cs | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs b/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs index 818f6fc67..927052937 100644 --- a/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs +++ b/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs @@ -8,6 +8,7 @@ public class GearFollower : MonoBehaviour public float snapDistance = 0.3f; public float detachDistance = 1.0f; public float tractionSpeed = 2f; + public float edgePointsScale = 1.2f; // 边缘点缩放倍率 [Header("切割轨迹")] public LineRenderer cutLineRenderer; @@ -15,6 +16,7 @@ public class GearFollower : MonoBehaviour public float noiseAmount = 0.05f; // 毛刺偏移幅度 private List edgePoints; + private List originalEdgePoints; // 存储原始边缘点 private int currentEdgeIndex = 0; private int tractionDirection = 1; @@ -66,6 +68,7 @@ public class GearFollower : MonoBehaviour private void LoadEdgePointsFromSprite() { edgePoints = new List(); + originalEdgePoints = new List(); // 初始化原始边缘点列表 if (targetSpriteRenderer == null) { Debug.LogError("targetSpriteRenderer 为空"); @@ -84,26 +87,42 @@ public class GearFollower : MonoBehaviour float desiredSegmentLength = 0.1f; edgePoints.Clear(); + originalEdgePoints.Clear(); + + // 计算中心点 + Vector2 center = Vector2.zero; + foreach (Vector2 point in shapePoints) + { + center += point; + } + center /= shapePoints.Count; for (int i = 0; i < shapePoints.Count; i++) { Vector2 p1 = targetSpriteRenderer.transform.TransformPoint(shapePoints[i]); Vector2 p2 = targetSpriteRenderer.transform.TransformPoint(shapePoints[(i + 1) % shapePoints.Count]); - float segmentLength = Vector2.Distance(p1, p2); + // 计算缩放后的点 + 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(p1, p2, t); + Vector2 interpolated = Vector2.Lerp(scaledP1, scaledP2, t); + Vector2 originalInterpolated = Vector2.Lerp(p1, p2, t); edgePoints.Add(interpolated); + originalEdgePoints.Add(originalInterpolated); } } if ((edgePoints[0] - edgePoints[edgePoints.Count - 1]).sqrMagnitude > 0.0001f) { edgePoints.Add(edgePoints[0]); + originalEdgePoints.Add(originalEdgePoints[0]); } Debug.Log($"边缘点数量:{edgePoints.Count}"); @@ -200,8 +219,13 @@ public class GearFollower : MonoBehaviour transform.position += (Vector3)(moveDir.normalized * maxStep); } + // 使用原始边缘点来记录切割线 + Vector2 originalFrom = originalEdgePoints[currentEdgeIndex]; + Vector2 originalTo = originalEdgePoints[nextIndex]; + Vector2 originalTargetPoint = GetClosestPointOnSegment(originalFrom, originalTo, transform.position); + // 记录切割点(带噪声模拟毛糙) - Vector3 noisyPoint = transform.position; + Vector3 noisyPoint = originalTargetPoint; noisyPoint.x += Random.Range(-noiseAmount, noiseAmount); noisyPoint.y += Random.Range(-noiseAmount, noiseAmount); AddCutPoint(noisyPoint);