У меня была точно такая же проблема в моем проекте. Я исправил это, настроив transform.position объекта linerenderer к местоположению следующей точки. И после установки точек я бы сбросил положение игрового объекта на ноль (последняя строка кода). Это сработало для меня, потому что мой игровой объект всегда должен быть на абсолютном нуле. Но если это не так, просто измените его на относительное положение и присвойте ему игровой объект, если это еще не сделано.
Вот мой код, надеюсь, он вам поможет.
public GameObject LineDrawPrefab;
private LineRenderer lineRenderer;
private EdgeCollider2D edgeCollider;
private List<Vector2> edgePoints;
private GameObject activeLineGameObject;
private List<GameObject> lineGameObjects;
private void StartLine(Vector3 start, Color color)
{
var targetPos = new Vector3 { x = start.x, y = start.y, z = 0.1f };
drawing = true;
activeLineGameObject = Instantiate(LineDrawPrefab, Vector3.zero, Quaternion.identity);
lineGameObjects.Add(activeLineGameObject);
lineRenderer = activeLineGameObject.GetComponent<LineRenderer>();
edgeCollider = activeLineGameObject.GetComponent<EdgeCollider2D>();
lineRenderer.sortingOrder = 1;
lineRenderer.material = LineRendererMaterial;
lineRenderer.startColor = color;
lineRenderer.endColor = color;
lineRenderer.startWidth = 0.3f;
lineRenderer.endWidth = 0.3f;
lineRenderer.SetPosition(0, targetPos);
lineRenderer.SetPosition(1, targetPos);
edgePoints.Clear();
edgePoints.Add(targetPos);
edgeCollider.points = edgePoints.ToArray();
}
private void ExtendLine(Vector3 nextpoint)
{
if (lineRenderer == null))
{
StartLine(Camera.main.ScreenToWorldPoint(Input.mousePosition), color);
return;
}
var targetPos = new Vector3 { x = nextpoint.x, y = nextpoint.y, z = 0.1f };
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, lineRenderer.transform.position = targetPos); // manipulate position to avoid the collider from spawning out of the object.
edgePoints.Add(nextpoint);
edgeCollider.points = edgePoints.ToArray();
activeLineGameObject.transform.position = Vector3.zero; // reset position
}
Редактировать: дополнительный совет. Я (и ты) использовал Camera.main
здесь. Это не эффективно, потому что каждый раз вызывается дорогой поиск.
(GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>()
)
Я предлагаю кэшировать его при запуске или пробуждении, а затем повторно использовать эту переменную. Это может потенциально привести к значительному увеличению производительности.
private Camera mainCamera;
private void Start()
{
mainCamera = Camera.main;
}