版权声明:他人成果,为我所用。留下足迹,美名杰成。 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物体层,用起来不是很方面,这个方法应该是实用性强一点。解决问题的方法不止一个,希望有大神更好的方法赐教。