问题详情:
点击地面玩家行走,可是点击界面按钮的时候,事件触发不了,或者同时执行了玩家点地行走事件;当点击UIButton时,鼠标会透过button点到地面,人物会移动;点击UIbutton弹出背包弹窗,点击弹窗边缘,人物也会移动。这些都属于点透的情况。
解决方式:
1.在ngui事件代码中做一个判断
如:
viod OnClick()
{
// 如果鼠标下面有NGUI物体就执行
if(UICamera.hoveredObject !=null)
{
print("点到NGUI");
}
}
2.通过射线来检测
private RaycastHit _hit=newRaycastHit();.
//判断在UI界面层操作.
if(UICamera.Raycast (Input.mousePosition,out_hit) ==false)
{
...
}
或
Ray ray=UICamera.mainCamera.ScreenPointToRay(Input.mousePosition);// 向屏幕发射线
RaycastHit hit;
if(Physics.Raycast(ray,out hit,200))//射线的碰撞检测
{
print("点到NGUI");
}
3.用到UICamera中提供了一个方法专门来处理这个问题,static public bool Raycast (Vector3 inPos),可能不通的NGUI版本参数会有一点区别,这个函数的作用是,返回一个bool值判断传入的位置是点击到了NGUI的元素还是非NGUI的元素。
RaycastHit rayHit;
if(UICamera.Raycast(Input.mousePosition))
{
Debug.Log("你点击的是NGUI");
}
else
{
Debug.Log("你点击的是非NGUI");
}
4.NGUI提供的UICamera.isOverUI方法,就挂在你main Camera的射线扫描前就行,该语句是返回布尔值,当射线扫描到UI就截断射线,就会使射线禁止穿透,具体使用是
if (UICamera.isOverUI == false)
{
//鼠标没在部件上
}
网友评论