Делаю скрипт для перетаскивания объектов как в skyrim. Сделал, но когда я беру объект я могу его по всей карте перемещать. Теперь я туплю как переделать скрипт для нормального перемещения.
Код
using UnityEngine;
using System.Collections;
using System;
using System.Text.RegularExpressions;
//Скрипт вешаем на камеру
public class Drag : MonoBehaviour
{
public int ID;
public int layerObj;
public bool memoryLayer;
public float yObj;
public string nameIgnore;
public float hitPoint;
RaycastHit hit;
Ray ray;
public GameObject obj;
void Start()
{
memoryLayer = true;
}
void Update()
{
Motionobject();
}
//проверка перетаскиваемых объектов осуществляется по ID в имени объекта
void Motionobject()
{
//проверяем нажатие кнопки мышки
if (Input.GetMouseButtonDown(0))
{
//задаем направление луча
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//пускаем луч на 10 метров и если попали куда то, то
if (Physics.Raycast(ray, out hit, 10))
{
//проверяем есть ли в имени десятичные цифры
var reg = @"[0-9]+";
//получаем имя того во что попал райкаст и убираем у него приставку ID
nameIgnore = hit.collider.gameObject.name.Replace("ID", "");
Debug.Log("Regex.IsMatch(nameIgnore, reg) = " + Regex.IsMatch(nameIgnore, reg));
if (Regex.IsMatch(nameIgnore, reg))
{
//Debug.Log("hit.collider.name = " + nameIgnore);
//и конвектируем в числовое значение
ID = Convert.ToInt32(nameIgnore);
if (ID != 1)
{
//запоминаем во что попали лучем, для дальнейшей работы с этим ГО
obj = hit.collider.gameObject;
Debug.Log("1");
}
}
}
}
//тут мы и будем перемещать наш ГО
if (obj != null)
{
Ray();
//ставим флаг что уже запомнили слой
if (memoryLayer)
{
//запоминаем слой ГО
layerObj = obj.layer;
memoryLayer = false;
}
//делаем ГО проницаемым для луча, что бы перемещать его в точку падения луча на терейне
obj.layer = 2;
//Debug.Log("hit.point = " + hit.point);
//присваиваем их объекту на который попал луч
//перемещаем соответственно только по горизонтальным плоскостям,
//new Vector3(0, 0.5f, 0); приподнимаем ГО что бы он не сидел в текстурах
//если подставить за место hit.distance например 10, то ГО будет двигаться на растоянии 10
obj.transform.position = ray.GetPoint(hit.distance) + new Vector3(0, 0.5f, 0);
}
//если кнопка была отжата то перестаем работать с ГО и обнуляем переменную, возвращаем слой обратно какой был
if (Input.GetMouseButtonUp(0))
{
if (obj != null)
{
obj.layer = layerObj;
memoryLayer = true;
obj = null;
}
}
}
void Ray()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hit);
}
}