NGUI解决鼠标穿透问题即判断当前是否在控制UI

在开发中,时常会遇到界面和叠加界面上其它对象操作冲突的问题,举个简单例子做一个地球仪,用鼠标控制地球仪旋转,同时在屏幕上又用了ScrollView视图当用鼠标去拖拽ScrollView视图中的内容时,地球仪也随着旋转了,我们需要解决这个问题.

一般来讲,如果界面固定(在屏幕下部等),省事的做法就是把菜单区和地球仪控制区进行划分,使用 Rect.Contains(Input.mousePosition) 进行鼠标位置的判断,在地球仪控制区就控制地球旋转,在菜单区就响应菜单暂时禁用地球旋转控制.

而界面相对复杂或者位置动态变化等,上面的方法用清楚就比较麻烦了,好在现在的NGUI版本提供了一个方法,可以非常渐变的判断鼠标或手指是否在界面上,如果是即返回true.

UICamera.isOverUI

直接用在要进行判断的代码处就好,比如在地球旋转控制条件中加上”&& !UICamera.isOverUI”,如果鼠标或手指在UI之上时,就不执行控制地球旋转的代码,要注意的是UI组件上要含有碰撞器才会被检测到.不建议放在Update中不停的监测状态,这会相对增加资源消耗,在满足一定条件下再去判断是否介于UI之上比较好,如Input.GetMouseButton(0)时再”UICamera.isOverUI”后进行执行与否的代码.