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++;
}
}