Добрый день. Я рисую линию через LineRenderer и перемещаю объект по точкам этой линии впоследствии.
Есть скрипт DrawManager, который отвечает за создание префаба с линией с компонентом LineRender, есть скрипт Line1, который весит на этом префабе и есть PlayerController который управляет объектом.
Всё работает нормально, но если я создаю клон объекта и пытаюсь от него начать рисовать линию, то всё ломается.
Не пойму, как мне сделать независимые друг от друга эти объекты. Я хочу повесить на сцену 4 объекта, чтобы была возможность рисовать для каждого из них линию и чтобы каждый объект, не обращая внимание на другие линии двигался по своей. Вот код:
DrawManager.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawManager : MonoBehaviour
{
private Camera _cam;
[SerializeField] private Line1 _linePrefab;
public const float RESOLUTION = .3f;
private Line1 _currentLine;
void Start()
{
_cam = Camera.main;
}
void Update()
{
Vector2 mousePos = _cam.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0) && PlayerController.canDraw) _currentLine = Instantiate(_linePrefab, mousePos, Quaternion.identity);
if (Input.GetMouseButton(0) && PlayerController.canDraw) _currentLine.SetPosition(mousePos);
}
}
Line1.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Line1 : MonoBehaviour
{
[SerializeField] private LineRenderer _renderer;
private readonly List<Vector2> _points = new List<Vector2>();
private float _deleteDistance = .5f;
public void SetPosition(Vector2 pos)
{
if (!CanAppend(pos)) return;
_points.Add(pos);
_renderer.positionCount++;
_renderer.SetPosition(_renderer.positionCount - 1, pos);
}
private bool CanAppend(Vector2 pos)
{
if (_renderer.positionCount == 0) return true;
return Vector2.Distance(_renderer.GetPosition(_renderer.positionCount - 1), pos) > DrawManager.RESOLUTION;
}
private void OnDestroy()
{
_points.Clear();
_renderer = new LineRenderer();
}
private void Update()
{
if (PlayerController.isMoving)
{
if (_renderer.positionCount > 0 && Vector2.Distance(_renderer.GetPosition(0), PlayerController.positionGlobal.transform.position) < _deleteDistance)
{
_points.RemoveAt(0);
_renderer.positionCount--;
}
}
if (PlayerController.finalMoving) {
if (_points.Count > 1)
_points.Clear();
}
UpdateLine();
}
private void UpdateLine()
{
_renderer.positionCount = _points.Count;
for (int i = 0; i < _points.Count; i++)
{
_renderer.SetPosition(i, _points[i]);
}
}
}
PlayerController.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 10f;
public float rotationSpeed = 20f;
public static bool canDraw = false;
public static bool isMoving = false, finalMoving = false;
public static Transform positionGlobal;
[SerializeField]
private LineRenderer lineRenderer;
private List<Vector3> linePoints = new List<Vector3>();
private int targetPointIndex = 0;
private Vector3 targetPoint, transformParking, centerPosition;
private Vector3 lastPosition = new Vector3(0f, 0f, 0f), rotationParking;
private Quaternion rotationCar, endRotation;
private float lineLength;
private float elapsedTime;
private float resolutionPoints = 0.02f;
public string colorCar;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
}
void Update()
{
if (Input.GetMouseButton(0) && canDraw)
{
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePosition.z = 0;
if (mousePosition.x + resolutionPoints <= lastPosition.x || mousePosition.x - resolutionPoints >= lastPosition.x && mousePosition.y + resolutionPoints <= lastPosition.y || mousePosition.y - resolutionPoints >= lastPosition.y)
{
linePoints.Add(mousePosition);
}
if (lineRenderer != null)
{
lineRenderer.positionCount = linePoints.Count;
lineRenderer.SetPosition(linePoints.Count - 1, mousePosition);
}
lastPosition = mousePosition;
}
if (Input.GetMouseButtonUp(0))
{
lineLength = 0;
for (int i = 1; i < linePoints.Count; i++)
{
lineLength += Vector3.Distance(linePoints[i], linePoints[i - 1]);
}
targetPointIndex = 1;
if (canDraw)
{
targetPoint = linePoints[targetPointIndex];
Quaternion targetRotation = Quaternion.LookRotation(Vector3.forward, targetPoint - transform.position);
transform.rotation = targetRotation;
isMoving = true;
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D hit = Physics2D.Raycast(mousePos, Vector2.zero);
if (hit.collider != null && hit.collider.gameObject.GetComponent<SpriteRenderer>().sprite.name == colorCar)
{
if (hit.collider.CompareTag("Parking"))
{ // Приехали на паркову
}
}
else
{
CleanCarOpt();
}
}
}
if (isMoving && linePoints.Count > 1 && targetPointIndex < linePoints.Count)
{
Quaternion targetRotation = Quaternion.LookRotation(Vector3.forward, targetPoint - transform.position);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
Vector3 direction = (targetPoint - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;
positionGlobal = transform;
if (Vector3.Distance(transform.position, targetPoint) < 0.1f)
{
targetPointIndex++;
if (targetPointIndex < linePoints.Count)
{
targetPoint = linePoints[targetPointIndex];
}
}
}
}
void OnMouseDown()
{
if (Input.GetMouseButtonDown(0))
{
canDraw = true;
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("DirectEntry"))
{
transformParking = collision.gameObject.GetComponentInParent<Transform>().position;
rotationParking = collision.gameObject.GetComponentInParent<Transform>().eulerAngles;
Debug.Log(rotationParking);
centerPosition = new Vector3(transformParking.x / 1f, transformParking.y / 1f, 0f);
finalMoving = true;
}
}
void CleanCarOpt()
{
Quaternion currentRotation = transform.rotation;
Quaternion newRotation = Quaternion.Euler(currentRotation.eulerAngles.x, currentRotation.eulerAngles.y, 0f);
transform.rotation = newRotation;
linePoints.Clear();
canDraw = false;
targetPointIndex = 0;
targetPoint = new Vector3(0f, 0f, 0f);
lastPosition = new Vector3(0f, 0f, 0f);
lineLength = 0;
isMoving = false;
GameObject[] gameObjects = GameObject.FindGameObjectsWithTag("Lines");
if (gameObjects.Length > 0)
{
GameObject lastGameObject = gameObjects[gameObjects.Length - 1];
Destroy(lastGameObject);
}
}
}