@yraiv

Как сделать адекватное рисование в unity?

Я хочу рисовать объект и делать его физическим, но проблема! Если быстро дёрнуть мышкой, то линия будет длиннее, чем если бы я рисовал медленно. Из-за того, что я ограничиваю возможность рисовать (тип, не больше 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;
    }
}
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Попробуйте заменить Update рисования корутиной с меньшей задержкой. Если не поможет, попробуйте сделать общий лимит длинны фигуры.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы