using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class T2 : MonoBehaviour
{
[Tooltip("Объект с моделями")]
public GameObject ModelGO;
// в этот объект будем помещать объект со всеми моделями
private GameObject TempGo;
// запомним позицию TempGo перед перемещение
private GameObject SavePosGO;
// знак можно ли перемещаться по местности
private bool isDrag;
void Start()
{
TempGo = new GameObject();
TempGo.name = "TempGo";
SavePosGO = new GameObject();
SavePosGO.name = "SavePosGO";
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
// данный тег должен быть на объекте за который можно тянуть, он должен быть горизонтальным
// иначе камера будет перемещаться не горизонтально а так по какой плоскости тянем
// если тянуть по вертикальной плоскости то камера будет перемещаться вверх/вниз
// иначе говоря камера перемещается паралельно плоскости
if (hit.transform.gameObject.tag == "EarthMoved")
{
TempGo.transform.position = hit.point;
// запомним начальную позицию
SavePosGO.transform.position = TempGo.transform.position;
ModelGO.transform.parent = TempGo.transform;
isDrag = true;
}
}
if (Input.GetMouseButton(0))
{
if (!isDrag)
return;
// пустим луч и найдем объект с тегом
RaycastHit hit;
Ray ray = GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
if (hit.transform.gameObject.tag == "EarthMoved")
{
// точка перемещения = точка луча
TempGo.transform.position = hit.point;
// перенесем камеру в точку пересечения луча с землей
transform.parent = TempGo.transform;
// теперь точку осмотра вместе с моделями и камерой вернем на стартовую позицию
// тем самым мы передвинем камеру а модели остануться на своих позициях
TempGo.transform.position = SavePosGO.transform.position;
// без этой строчки камера будет трястись
TempGo.transform.position = hit.point;
// уберем камеру с точки пересечения чтоб могли двигать землю а камера оставалась на месте
transform.parent = null;
}
else
{
// если на объекте который на земле какой то коллайдер то проигнорируем его и пустим луч дальше чтоб достать до земли
GameObject _go = hit.transform.gameObject;
// если на нем боксколлайдер/мешколлайдер то отключим на мгновенье
if (_go.GetComponent<BoxCollider>())
_go.GetComponent<BoxCollider>().enabled = false;
if (_go.GetComponent<MeshCollider>())
_go.GetComponent<MeshCollider>().enabled = false;
// пустим луч еще раз сквозь попавшего ненужного нам объетка
RaycastHit hit2;
if (Physics.Raycast(ray, out hit2))
{
if (hit2.transform.gameObject.tag == "EarthMoved")
{
TempGo.transform.position = hit2.point;
transform.parent = TempGo.transform;
TempGo.transform.position = SavePosGO.transform.position;
transform.parent = null;
}
}
// включим обратно
if (_go.GetComponent<BoxCollider>())
_go.GetComponent<BoxCollider>().enabled = true;
if (_go.GetComponent<MeshCollider>())
_go.GetComponent<MeshCollider>().enabled = true;
}
}
}
if (Input.GetMouseButtonUp(0))
{
transform.parent = TempGo.transform;
TempGo.transform.position = SavePosGO.transform.position;
transform.parent = null;
ModelGO.transform.parent = null;
isDrag = false;
}
}
}