Перемещение объектов мышкой
Хочу создать примитивный редактор карт (скрин ниже), пытаюсь придумать как можно перетаскивать участки дороги и соединять их. Чуть больше года назад помогал делать морской бой и там написал данный скрипт, думаю что это очень костыльно и можно гораздо проще, но никак не могу нарыть информацию.
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; //возвращаем на место, где стоял
}
}
}
}
}
