208 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
using UnityEngine.EventSystems;
 | 
						|
 | 
						|
[AddComponentMenu("设备预制体")]
 | 
						|
public class DragTest : MonoBehaviour
 | 
						|
{
 | 
						|
    public List<GameObject> listTargets = new List<GameObject>();
 | 
						|
    /// <summary>
 | 
						|
    /// 设备一列层数
 | 
						|
    /// </summary>
 | 
						|
    [Header("设备一列层数")]
 | 
						|
    public int PerTier = 6;
 | 
						|
    /// <summary>
 | 
						|
    /// 设备一个区域列数
 | 
						|
    /// </summary>
 | 
						|
    [Header("设备一个区域列数")]
 | 
						|
    public int PerRow = 5;
 | 
						|
 | 
						|
    public bool isExit = false;
 | 
						|
    public bool isClicked = false;
 | 
						|
    public bool isray;
 | 
						|
 | 
						|
    private void Update()
 | 
						|
    {
 | 
						|
        RaycastHit hit;
 | 
						|
        if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 999, 1 << 6 | 1 << 8))
 | 
						|
        {
 | 
						|
            isray = true;
 | 
						|
        }
 | 
						|
        else isray = false;
 | 
						|
        //Debug.Log(isray);
 | 
						|
        if (isray) { Debug.Log(hit.transform.name); }
 | 
						|
        if (isExit)
 | 
						|
        {
 | 
						|
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Vector3.Distance(Camera.main.transform.position, listTargets[0].transform.position));
 | 
						|
            var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace)/* + offset*/;
 | 
						|
            transform.position = curPosition;
 | 
						|
 | 
						|
            if (Input.GetMouseButtonUp(0))
 | 
						|
            {
 | 
						|
                if (isray)
 | 
						|
                {
 | 
						|
                    bool isTarget = false;
 | 
						|
                    foreach (GameObject item in listTargets)
 | 
						|
                    {
 | 
						|
                        if (GetOverGameObject(Camera.main.gameObject).Contains(item))
 | 
						|
                        {
 | 
						|
                            if (item.transform.childCount >= 1)
 | 
						|
                            {
 | 
						|
                                break;
 | 
						|
                            }
 | 
						|
                            isTarget = true;
 | 
						|
                            transform.position = item.transform.position;
 | 
						|
                            //设置父物体
 | 
						|
                            transform.SetParent(item.transform, true);
 | 
						|
                            isExit = false;
 | 
						|
 | 
						|
 | 
						|
                            //判断当前为第几个子物体
 | 
						|
                            int rank = item.transform.GetSiblingIndex() + 1;
 | 
						|
                            int isarea = 1; int isrow = 1; int istier = 0;
 | 
						|
 | 
						|
 | 
						|
                            for (int i = 1; i <= rank; i++)
 | 
						|
                            {
 | 
						|
                                if (istier < PerTier)
 | 
						|
                                {
 | 
						|
                                    istier++;
 | 
						|
                                }
 | 
						|
                                else
 | 
						|
                                {
 | 
						|
                                    if (isrow < PerRow)
 | 
						|
                                    {
 | 
						|
                                        isrow++;
 | 
						|
                                    }
 | 
						|
                                    else
 | 
						|
                                    {
 | 
						|
                                        isarea++;
 | 
						|
                                        isrow = 1;
 | 
						|
                                    }
 | 
						|
                                    istier = 1;
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
 | 
						|
 | 
						|
                            //设备第几个区域
 | 
						|
                            gameObject.GetComponent<Device>().mydata.area = isarea.ToString();
 | 
						|
                            //设备第几列
 | 
						|
                            gameObject.GetComponent<Device>().mydata.row = isrow.ToString();
 | 
						|
                            //设备第几层
 | 
						|
                            gameObject.GetComponent<Device>().mydata.tier = istier.ToString();
 | 
						|
                            Debug.Log("第" + isarea + "区,第" + isrow + "列,第" + istier + "层");
 | 
						|
                            gameObject.GetComponent<Device>().isPut = true;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    if (isTarget == false)
 | 
						|
                    {
 | 
						|
                        isExit = false;
 | 
						|
                        Destroy(gameObject);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    isExit = false;
 | 
						|
                    Destroy(gameObject);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    //public void OnMouseUp()
 | 
						|
    //{
 | 
						|
    //    if (isray)
 | 
						|
    //    {
 | 
						|
    //        bool isTarget = false;
 | 
						|
    //        foreach (GameObject item in listTargets)
 | 
						|
    //        {
 | 
						|
    //            if (GetOverGameObject(Camera.main.gameObject).Contains(item))
 | 
						|
    //            {
 | 
						|
    //                if (item.transform.childCount >= 1)
 | 
						|
    //                {
 | 
						|
    //                    break;
 | 
						|
    //                }
 | 
						|
    //                isTarget = true;
 | 
						|
    //                transform.position = item.transform.position;
 | 
						|
    //                //设置父物体
 | 
						|
    //                transform.SetParent(item.transform, true);
 | 
						|
    //                isExit = false;
 | 
						|
 | 
						|
 | 
						|
    //                //判断当前为第几个子物体
 | 
						|
    //                int rank = item.transform.GetSiblingIndex() + 1;
 | 
						|
    //                int isarea = 1; int isrow = 1; int istier = 0;
 | 
						|
 | 
						|
 | 
						|
    //                for (int i = 1; i <= rank; i++)
 | 
						|
    //                {
 | 
						|
    //                    if (istier < PerTier)
 | 
						|
    //                    {
 | 
						|
    //                        istier++;
 | 
						|
    //                    }
 | 
						|
    //                    else
 | 
						|
    //                    {
 | 
						|
    //                        if (isrow < PerRow)
 | 
						|
    //                        {
 | 
						|
    //                            isrow++;
 | 
						|
    //                        }
 | 
						|
    //                        else
 | 
						|
    //                        {
 | 
						|
    //                            isarea++;
 | 
						|
    //                            isrow = 1;
 | 
						|
    //                        }
 | 
						|
    //                        istier = 1;
 | 
						|
    //                    }
 | 
						|
    //                }
 | 
						|
 | 
						|
 | 
						|
    //                //设备第几个区域
 | 
						|
    //                gameObject.GetComponent<Device>().mydata.area = isarea.ToString();
 | 
						|
    //                //设备第几列
 | 
						|
    //                gameObject.GetComponent<Device>().mydata.row = isrow.ToString();
 | 
						|
    //                //设备第几层
 | 
						|
    //                gameObject.GetComponent<Device>().mydata.tier = istier.ToString();
 | 
						|
    //                Debug.Log("第" + isarea + "区,第" + isrow + "列,第" + istier + "层");
 | 
						|
    //                gameObject.GetComponent<Device>().isPut = true;
 | 
						|
    //            }
 | 
						|
    //        }
 | 
						|
    //        if (isTarget == false)
 | 
						|
    //        {
 | 
						|
    //            isExit = false;
 | 
						|
    //            Destroy(gameObject);
 | 
						|
    //        }
 | 
						|
    //    }
 | 
						|
    //    else
 | 
						|
    //    {
 | 
						|
    //        isExit = false;
 | 
						|
    //        Destroy(gameObject);
 | 
						|
    //    }
 | 
						|
    //}
 | 
						|
    //获取光标停留的3D物体
 | 
						|
    public List<GameObject> GetOverGameObject(GameObject raycaster)
 | 
						|
    {
 | 
						|
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
 | 
						|
        pointerEventData.position = Input.mousePosition;
 | 
						|
        PhysicsRaycaster pr = raycaster.GetComponent<PhysicsRaycaster>();
 | 
						|
        List<RaycastResult> results = new List<RaycastResult>();
 | 
						|
        pr.Raycast(pointerEventData, results);
 | 
						|
        List<GameObject> listObjs = new List<GameObject>();
 | 
						|
        if (results.Count != 0)
 | 
						|
        {
 | 
						|
            foreach (RaycastResult item in results)
 | 
						|
            {
 | 
						|
                if (item.gameObject.layer != 8)
 | 
						|
                    listObjs.Add(item.gameObject);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return listObjs;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    private void OnMouseDrag()
 | 
						|
    {
 | 
						|
        isExit = true;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |