调整齿轮吸附位置
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user