Я хочу рисовать объект и делать его физическим, но проблема! Если быстро дёрнуть мышкой, то линия будет длиннее, чем если бы я рисовал медленно. Из-за того, что я ограничиваю возможность рисовать (тип, не больше 90 точек). Получается, что если игрок делает быстрые движения, то линия в 2-5 раз длиннее, чем у тех, кто медленно рисует. Как быть?
Первый скрипт
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawManager : MonoBehaviour
{
private Camera _cam;
[SerializeField]
private Line _linePrefab;
private Line _currentLine;
public const float RESOLUTIO = 0.1f;
public int MaxValueDistance = 500;
public int currnetValueDistance;
private void Start()
{
_cam = Camera.main;
}
private void OnEnable()
{
EventBus.LineWasDrawing += AddCurnetValueDistance;
}
private void OnDisable()
{
EventBus.LineWasDrawing -= AddCurnetValueDistance;
}
private void AddCurnetValueDistance()
{
currnetValueDistance++;
}
private void Update()
{
if (currnetValueDistance < MaxValueDistance)
{
Vector2 mousePos = _cam.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0)) _currentLine = Instantiate(_linePrefab, mousePos, Quaternion.identity);
if (Input.GetMouseButton(0)) _currentLine.SetPosition(mousePos, currnetValueDistance, MaxValueDistance);
}
}
}
Второй, который отвечает за линию саму
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Line : MonoBehaviour
{
[SerializeField]
private LineRenderer _renderer;
[SerializeField]
private EdgeCollider2D _collider;
private List<Vector2> _points = new List<Vector2>();
void Start()
{
_collider.transform.position -= transform.position;
}
public void SetPosition(Vector2 pos, int currnetValueDistance, int MaxValueDistance)
{
if(currnetValueDistance < MaxValueDistance)
{
if (!CanAppend(pos)) return;
_points.Add(pos);
_renderer.positionCount++;
_renderer.SetPosition(_renderer.positionCount - 1, pos);
_collider.points = _points.ToArray();
EventBus.LineWasDrawing?.Invoke();
}
}
private bool CanAppend(Vector2 pos)
{
if (_renderer.positionCount == 0) return true;
return Vector2.Distance(_renderer.GetPosition(_renderer.positionCount - 1), pos) > DrawManager.RESOLUTIO;
}
}