using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; //============================================================ //支持中文,文件使用UTF-8编码 //@author #AUTHOR# //@create #CREATEDATE# //@company #COMPANY# // //@description: //============================================================ public class DragController : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler { public DragTest1 oriObjectPrefab; private DragTest1 targetObject; private UPosItem currentUPosItem; public Func DragCondition; public Action DragAction; public Action BeginDragAction; public Action EndDragAction; //public DragTest1 currentDevice; public UPosManger uPosManger; public DeviceManager deviceManager; public bool isSaveMode = false; // Start is called before the first frame update void Start() { BeginDragAction = (target) => { target.gameObject.SetActive(true); }; DragAction = (target) => { //target.transform.position = Camera.main.GetComponent().ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 5)); OnRay(target.gameObject); }; } public void OnBeginDrag(PointerEventData eventData) { if (!isSaveMode) targetObject = Instantiate(oriObjectPrefab); else { targetObject = oriObjectPrefab; targetObject.gameObject.SetActive(true); } //currentDevice = targetObject.GetComponent(); targetObject.transform.eulerAngles = oriObjectPrefab.transform.eulerAngles; targetObject.transform.localScale = oriObjectPrefab.transform.lossyScale; BeginDragAction?.Invoke(targetObject); } public void OnDrag(PointerEventData eventData) { if (DragCondition != null && DragCondition.Invoke()) { DragAction?.Invoke(targetObject); } else if (DragCondition == null) { DragAction?.Invoke(targetObject); } } public void OnEndDrag(PointerEventData eventData) { EndDragAction?.Invoke(targetObject); CountUPos(); currentUPosItem = null; targetObject = null; } /// /// 计算U位数量 /// private void CountUPos() { if (targetObject == null) return; if (currentUPosItem == null) { if (!isSaveMode) Destroy(targetObject.gameObject); else targetObject.gameObject.SetActive(false); return; } if (currentUPosItem.isOccupied) { if (!isSaveMode) Destroy(targetObject.gameObject); else targetObject.gameObject.SetActive(false); return; } int index = uPosManger.CountUPos(targetObject.volume, currentUPosItem.ID); //Debug.Log("index-------------" + index); if (!CountUPos(targetObject, index)) { if (isSaveMode) { targetObject.gameObject.SetActive(false); } else { Destroy(targetObject.gameObject); } } else { if (isSaveMode) { deviceManager.SwitchStagingPanel(this.gameObject); } } } /// /// 自动生成设备 /// /// /// 机位号码,从0开始 public bool CountUPos(DragTest1 dt, int index) { if (index >= 0) { dt.transform.SetParent(uPosManger.uPosItems[index].transform); dt.transform.localPosition = new Vector3(0.25f, 0, -0.045f * dt.volume + 0.0225f); uPosManger.SetCurrentUPosIsOccupied(index, dt.volume, true); DeviceItem di; if (dt.gameObject.GetComponent() == null) di = dt.gameObject.AddComponent(); else di = dt.GetComponent(); if (di.gameObject.GetComponent() == null) di.gameObject.AddComponent(); di.Init(deviceManager, index, dt.volume, oriObjectPrefab); deviceManager.SetDeviceItem(di); return true; } else { //Destroy(dt.gameObject); return false; } } private void OnRay(GameObject target) { currentUPosItem = null; target.transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 2)); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, 100, 1 << 10)) { if (hitInfo.collider != null && hitInfo.collider.GetComponent()) { currentUPosItem = hitInfo.collider.GetComponent(); if (!EventSystem.current.IsPointerOverGameObject()) { if (!currentUPosItem.isOccupied) { target.transform.position = hitInfo.point; } } } else { } } } }