您的位置:首页 > 移动开发 > Unity3D

Unity 鼠标批量选择物体

2014-06-03 18:27 405 查看


/// <summary>
/// 鼠标选择物体
/// </summary>
public class TestControl
{
    Vector3 mBtnDownPos = Vector3.zero;
    List<LineRenderer> lines = new List<LineRenderer>();

    List<GameObject> cubes = new List<GameObject>();

    public void Init()
    {
        GameObject prefabLine = Resources.Load<GameObject>("Line");
        for (int i = 0; i < 4; i++)
        {
            lines.Add((GameObject.Instantiate(prefabLine) as GameObject).GetComponent<LineRenderer>());
        }

        GameObject _cubes = GameObject.Find("Cubes");
        for (int i = 0; i < _cubes.transform.childCount; i++)
        {
            cubes.Add(_cubes.transform.GetChild(i).gameObject);
        }
    }

    public void Update()
    {
        //按下
        if (Input.GetMouseButtonDown(0))
        {
            foreach (LineRenderer line in lines)
                line.renderer.enabled = true;

            mBtnDownPos = Helper.GetMouseWorldPos(new Plane(Vector3.up, Vector3.zero));
            lines[0].SetPosition(0, mBtnDownPos);
            lines[3].SetPosition(0, mBtnDownPos);
        }

        //持续
        if (Input.GetMouseButton(0))
        {
            Vector3 mouseWorldPos = Helper.GetMouseWorldPos(new Plane(Vector3.up, Vector3.zero));

            Vector3 pos1 = new Vector3(mBtnDownPos.x, 0, mouseWorldPos.z);
            Vector3 pos3 = new Vector3(mouseWorldPos.x, 0, mBtnDownPos.z);
            lines[0].SetPosition(1, pos1);
            lines[3].SetPosition(1, pos3);

            lines[1].SetPosition(0, mouseWorldPos);
            lines[2].SetPosition(0, mouseWorldPos);
            lines[1].SetPosition(1, pos1);
            lines[2].SetPosition(1, pos3);

            DelectSelect(mBtnDownPos, mouseWorldPos, pos1, pos3);
        }

        //放开
        if (Input.GetMouseButtonUp(0))
        {
            foreach (LineRenderer line in lines)
                line.renderer.enabled = false;

            foreach (GameObject c in cubes)
                c.renderer.material.SetColor("_TintColor", Color.blue);
        }
    }

    //检测是否选中
    void DelectSelect(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4)
    {
        Vector3 leftUp;
        Vector3 rightDown;
        FindPoint(out leftUp, out rightDown, v1, v2, v3, v4);

        foreach (GameObject c in cubes)
        {
            if (c.transform.position.x > leftUp.x && c.transform.position.x < rightDown.x &&
                c.transform.position.z < leftUp.z && c.transform.position.z > rightDown.z)
            {
                c.renderer.material.SetColor("_TintColor", Color.green);
            }
            else
            {
                c.renderer.material.SetColor("_TintColor", Color.blue);
            }
        }
    }

    //找出左上角和右下角
    void FindPoint(out   Vector3 leftUp, out Vector3 rightDown, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4)
    {
        List<Vector3> point = new List<Vector3>();
        point.Add(v1);
        point.Add(v2);
        point.Add(v3);
        point.Add(v4);

        point.Sort((a, b) =>
        {
            if (a.x > b.x)
                return 1;
            if (a.x < b.x)
                return -1;
            return 0;
        });
        leftUp = point[0];
        rightDown = point[3];

        point.Sort((a, b) =>
        {
            if (a.z > b.z)
                return 1;
            if (a.z < b.z)
                return -1;
            return 0;
        });

        leftUp.z = point[3].z;
        rightDown.z = point[0].z;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: