Перемещение объектов мышкой

Хочу создать примитивный редактор карт (скрин ниже), пытаюсь придумать как можно перетаскивать участки дороги и соединять их. Чуть больше года назад помогал делать морской бой и там написал данный скрипт, думаю что это очень костыльно и можно гораздо проще, но никак не могу нарыть информацию.

using UnityEngine;
 
public class MoveMouse : MonoBehaviour
{
    Vector2 startPos, startCollider; //структура из 2 значений (х,у)
    Quaternion startRot; //как изначально был повернут объект
    RaycastHit2D lastHit; //структура кот просто содержит информацию о том, куда попал луч(объект, расстояние)
    bool _StartValues = false;  //обозначает получили ли мы начальные значения
 
    void Update() //вызывается каждый кадр
    {
        if (Input.GetMouseButtonDown(0)) //была ли нажата ЛКМ
        {
            if (!_StartValues)
            {
                RaycastHit2D ray = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, 15f);
 
                //Physics2D.Raycast() - запускает луч
                //Camera.main.ScreenToWorldPoint - ScreenToWorldPoint- преобразует позицию с экрана(курсор с монитора) в координаты мира игры
                //Vector2.zero - вектор с координатами (0,0)  15f-длина луча(чтоб бесконечный не был)
 
                if (ray.transform != null) //transform-позиции, вращение и размер объекта. Мы смотрим если куда попал луч
                {
                    startPos = ray.transform.position;
                    startRot = ray.transform.rotation;
                    _StartValues = true;
                    startCollider = ray.transform.GetComponent<BoxCollider2D>().size; //запоминаем размер коллайдера корабля
                    ray.transform.GetComponent<BoxCollider2D>().size = new UnityEngine.Vector2(100, 100);
                }
            }
        }
        else
             if (Input.GetMouseButton(0)) //зажата ли ЛКМ
        {
            if (_StartValues)
            {
                Vector2 cur = Camera.main.ScreenToWorldPoint(Input.mousePosition); //преобразуем позицию в координаты игры
                RaycastHit2D hit = Physics2D.Raycast(cur, Vector2.zero, 15f); //запускаем луч
                if (hit.transform != null) //если мы во что-то попали
                {
                    UnityEngine.Vector3 buf = Camera.main.ScreenToWorldPoint(Input.mousePosition); //преобразуем в координаты игры
                    buf.z = -9;  //меняем координату чтоб камера видела объект
                    hit.transform.position = buf; //координаты курсора в игровом мире присваиваем тому объекту в который мы попали
                    if (Input.GetMouseButtonDown(1))//если нажата правая кнопка мыши
                    {
                        hit.transform.Rotate(new UnityEngine.Vector3(0, 0, -90)); //вращение объекта
                    }
                    lastHit = hit; //запоминаем объект в который мы попали(информацию)
                }
            }
        }
        else if (Input.GetMouseButtonUp(0)) //отжата
        {
            if (_StartValues)
            {
                if (InternalStructure.ValidPosition(lastHit.transform, InternalStructure.playerMap))
                {
                    InternalStructure.ScenePosition(lastHit.transform);
                    lastHit.transform.GetComponent<BoxCollider2D>().size = startCollider;
                    InternalStructure.GivePosition(lastHit.transform, InternalStructure.playerMap);
                    _StartValues = false;
                }
                else
                {
                    lastHit.transform.position = startPos;
                    lastHit.transform.rotation = startRot;
                    lastHit.transform.GetComponent<BoxCollider2D>().size = startCollider;
                    _StartValues = false;
                }
            }
        }
        else if (Input.GetMouseButtonDown(1)) //если нажата ПКМ
        {
            RaycastHit2D ray = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), UnityEngine.Vector2.zero, 15f);
            if (ray.transform != null)
            {
                startRot = ray.transform.rotation; //запоминаем начальное значение
                ray.transform.Rotate(new UnityEngine.Vector3(0, 0, -90)); //вращаем объект
                if (InternalStructure.ValidPosition(ray.transform, InternalStructure.playerMap)) // если можно поставить корабль
                {
                    InternalStructure.ScenePosition(ray.transform);
                    InternalStructure.GivePosition(ray.transform, InternalStructure.playerMap); //ставим корабль
                }
                else
                {
                    ray.transform.rotation = startRot; //возвращаем на место, где стоял
                }
            }
        }
    }
}

Редактор


Ответы (0 шт):