В качестве альтернативы я бы предложил вместо этого использовать
lineRenderer.useWorlsSpace = false;
, чтобы точки больше не устанавливались в мировом пространстве, а в локальном пространстве относительно преобразования linerenderer.
Теперь вы можетепросто поверните преобразование linerenderer, чтобы указать на последнюю позицию пользовательского ввода.
Я не мог использовать ваш пример кода, так как я не знаю, какие у вас префабы, и поэтому я создал свой собственный изкод в данном видео.Я надеюсь, что вы можете повторно использовать / воссоздать необходимые детали
public class SinusWave : MonoBehaviour
{
public Vector3 initalPosition;
public int pointCount = 10;
public LineRenderer line;
private Vector3 secondPosition;
private Vector3[] points;
private float segmentWidth;
private void Awake()
{
line = GetComponent<LineRenderer>();
line.positionCount = pointCount;
// tell the linerenderer to use the local
// transform space for the point coorindates
line.useWorldSpace = false;
points = new Vector3[pointCount];
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
// Camera.main.ScreenToWorldPoint needs a value in Z
// for the distance to camera
secondPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition - Vector3.forward * Camera.main.transform.position.z);
secondPosition.z = 0;
var dir = secondPosition - initalPosition;
// get the segmentWidth from distance to end position
segmentWidth = Vector3.Distance(initalPosition, secondPosition) / pointCount;
// get the difference angle in the Z axis between the current transform.right
// and the direction
var angleDifference = Vector3.SignedAngle(transform.right, dir, Vector3.forward);
// and rotate the linerenderer transform by that angle in the Z axis
// so the result will be that it's transform.right
// points now towards the clicked position
transform.Rotate(Vector3.forward * angleDifference, Space.World);
}
for (var i = 0; i < points.Length; ++i)
{
float x = segmentWidth * i;
float y = Mathf.Sin(x * Time.time);
points[i] = new Vector3(x, y, 0);
}
line.SetPositions(points);
}
}
Кстати, я просто предполагаю, что GameObject.FindGameObjectsWithTag("PointMarker");
на самом делеперезапускает все до сих пор порожденные linePointPrefab
объекты.
Было бы лучше сохранить их сразу, когда вы породите их как
private List<Transform> allPoints = new List<Transform>();
...
allPoints.Add(Instantiate(linePointPrefab, pointPosition, Quaternion.identity).transform);
, тогда вы можете пропустить использование FindObjectsWithType
полностью
Для принятия этой позиции локального пространства также для префабов точки строки, которые вы создаете, просто создайте их как дочерние элементы преобразования linerenderer или порождайте их и linerenderer под тем же родителем, чтобы относительные позиции были одинаковыми,В этом случае вы бы не поворачивали linerenderer, а весь родительский объект, поэтому порожденные точки линии вращаются вместе с ним