调整齿轮吸附位置

This commit is contained in:
2025-05-17 04:51:54 +08:00
parent b8709a86e7
commit 1983ad53fc
@@ -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<Vector2> edgePoints;
private List<Vector2> originalEdgePoints; // 存储原始边缘点
private int currentEdgeIndex = 0;
private int tractionDirection = 1;
@@ -66,6 +68,7 @@ public class GearFollower : MonoBehaviour
private void LoadEdgePointsFromSprite()
{
edgePoints = new List<Vector2>();
originalEdgePoints = new List<Vector2>(); // 初始化原始边缘点列表
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);