Unity学习 —鼠标框选和计算Rect

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


猜你喜欢

转载自blog.csdn.net/vr851130674/article/details/79063314