unity中设置ui不被穿透

版权声明:他人成果,为我所用。留下足迹,美名杰成。 https://blog.csdn.net/weixin_41814169/article/details/88682164

在项目中会遇到弹出的UI窗口会对其进行相关的操作,这时候就会出现,在对UI操作的时候,他下面的3d的模型也会有相关的连锁穿透操作,这是我们不想看到的结果。怎么才能避免这样的现象出现,就需要让射线不穿透UI层,这样就可以了。

做一个简单的案例:已经有大神做好了,我只是在其上稍微修改了一下。

https://www.cnblogs.com/fly-100/p/4570366.html

主要的操作的有以下几个方面:

首先看一下场景的搭建,来进行UI是否穿透的测试

在Cube上挂载脚本:

 void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            GetComponent<Renderer>().material.color = new Color(Random.value, Random.value, Random.value, 1.0f);
        }
    }

这样点击Cube会变颜色,可是问题是在点击Button的时候也会变颜色,这个就不好了,下面我们修改一下脚本:

原理就不说了,上面博主的文章都讲的很明白,是基于UGUI底层实现原理

主要的就是这个原理:使用的UGUI中的每个组件都是继承自Graphic或者依赖一个继承自Graphic的组件 

直接上代码,脚本挂载到cube(3d物体)上

void Start () {
		
	}


    bool CheckGuiRaycastObjects()
    {
        // PointerEventData eventData = new PointerEventData(Main.Instance.eventSystem);

        PointerEventData eventData = new PointerEventData(EventSystem.current);
        eventData.pressPosition = Input.mousePosition;
        eventData.position = Input.mousePosition;

        List<RaycastResult> list = new List<RaycastResult>();
        // Main.Instance.graphicRaycaster.Raycast(eventData, list);
        EventSystem.current.RaycastAll(eventData, list);
        //Debug.Log(list.Count);
        return list.Count > 0;
    }

    void Update()
    {
        if (CheckGuiRaycastObjects()) return;
       // Debug.Log(EventSystem.current.gameObject.name);
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                //do some thing
                
                    GetComponent<Renderer>().material.color = new Color(Random.value, Random.value, Random.value, 1.0f);
                
            }
        }
    }

 说明:

1.在使用Input.GetMouseButtonDown(0)的地方加了一个检测函数,CheckGuiRaycastObjects

2.graphicRaycaster和eventSystem  这两个变量分别对应的是Canvas中的GraphicRaycaster组件,和创建UI时自动生成的“EventSystem”中的EventSystem组件

效果:

在点击button的时候就不会变颜色了,完成。这个问题困扰了我许久,之前的方法无非就是射线检测点击到的物体是UI层还是3d物体层,用起来不是很方面,这个方法应该是实用性强一点。解决问题的方法不止一个,希望有大神更好的方法赐教。

猜你喜欢

转载自blog.csdn.net/weixin_41814169/article/details/88682164