public List<GameObject> listObj=new List<GameObject>(); private List<GameObject> focusObjects; public GameObject obj1; public GameObject obj2; public GameObject obj3; private List<Bounds> bounds = new List<Bounds>(); private Vector3 mousePosStar;//记录鼠标开始位置 private Vector3 mousePosEnd;//记录鼠标抬起的位置 void Start () { listObj.Add(obj1); listObj.Add(obj2); listObj.Add(obj3); Bounds _bounds = obj1.GetComponent<SkinnedMeshRenderer>().bounds; //得到顶点数组 bounds.Add(_bounds); } void Update () { if (Input.GetMouseButtonDown(0)) { mousePosStar = Input.mousePosition; } else if (Input.GetMouseButtonUp(0)) { mousePosEnd = Input.mousePosition; CheckSelection(mousePosStar, mousePosEnd); } } void CheckSelection(Vector3 start, Vector3 end)//获得画框4个顶点的坐标位置 { Vector3 p1 = Vector3.zero; Vector3 p2 = Vector3.zero; if (start.x > end.x) {//这些判断是用来确保p1的xy坐标小于p2的xy坐标,因为画的框不见得就是左下到右上这个方向的 p1.x = end.x; p2.x = start.x; } else { p1.x = start.x; p2.x = end.x; } if (start.y > end.y) { p1.y = end.y; p2.y = start.y; } else { p1.y = start.y; p2.y = end.y; } float w= Mathf.Abs(p1.x - p2.x);//绝对值 float h = Mathf.Abs(p1.y - p2.y); Rect rect = new Rect(p1.x, p1.y, w, h); GetFocusObjects(rect, listObj, bounds, ref focusObjects); } void GetFocusObjects(Rect rect, List<GameObject> list, List<Bounds> bounds, ref List<GameObject> focusObjects) { //循环遍历list,找到选中的一些物体。赋值到focusObjects容器中 //记录鼠标一开始点击的位置,和鼠标做i后的位置,计算生成矩形, //通过矩形选中后的物体的包围盒显示在里面,如果一个物体的包围盒的8个顶点全在这个矩形里 //则是选中的这个物体,否则没选中 focusObjects = new List<GameObject>(); int index = 0; foreach (GameObject item in list) { //判断这个物体是不是在这个矩形里面,如果在,是选中的,返回给focusObjects, Vector3 itemPos = Camera.main.WorldToScreenPoint(item.transform.position); if (rect.Contains(itemPos)) { Vector3 centerPOs = bounds[index].center;//中心点 Vector3 extens = bounds[index].size / 2; //8个点顶点 Vector3 MaxPos = centerPOs + extens;//最大顶点 Vector3 MinPos = centerPOs - extens;//最小顶点 Vector3 A = new Vector3(MinPos.x, MaxPos.y, MinPos.z); Vector3 B = new Vector3(MinPos.x, MaxPos.y, MaxPos.z); Vector3 C = new Vector3(MaxPos.x, MaxPos.y, MaxPos.z); Vector3 D = new Vector3(MaxPos.x, MaxPos.y, MinPos.z); Vector3 A1 = new Vector3(MinPos.x, MinPos.y, MinPos.z); Vector3 B1 = new Vector3(MinPos.x, MinPos.y, MaxPos.z); Vector3 C1 = new Vector3(MaxPos.x, MinPos.y, MaxPos.z); Vector3 D1 = new Vector3(MaxPos.x, MinPos.y, MinPos.z); Vector3[] points = {A,B,C,D,A1,B1,C1,D1 }; Vector3 AA = Camera.main.WorldToScreenPoint(A); Vector3 BB = Camera.main.WorldToScreenPoint(B); Vector3 CC = Camera.main.WorldToScreenPoint(C); Vector3 DD = Camera.main.WorldToScreenPoint(D); Vector3 A11 = Camera.main.WorldToScreenPoint(A1); Vector3 B11 = Camera.main.WorldToScreenPoint(B1); Vector3 C11 = Camera.main.WorldToScreenPoint(C1); Vector3 D11 = Camera.main.WorldToScreenPoint(D1); if (rect.Contains(AA) && rect.Contains(BB) && rect.Contains(CC) && rect.Contains(DD) && rect.Contains(A11) && rect.Contains(B11) && rect.Contains(C11) && rect.Contains(D11)) { focusObjects.Add(item); Debug.Log("aaaaaa"); } } index++; } }
Unity学习 —鼠标框选和计算Rect
猜你喜欢
转载自blog.csdn.net/vr851130674/article/details/79063314
今日推荐
周排行