unity3d学习笔记(十三)--如何拦截射线碰撞界面的消息

来源:互联网 发布:pop3端口号是多少 编辑:程序博客网 时间:2024/05/24 07:26

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

http://blog.csdn.net/lzhq1982/article/details/12854527


这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的,好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。


方案一:利用标签(Tag)拦截射线消息。

每个GameObject的Inspector面板最上方都有个Tag选项,也就是说我们可以给所有的物体加个标签,Unity3d已经默认有了几个标签,这里我们可以自定义个UI的标签,然后把所有UI都用这个标签。点击Tag右方的选项,选Add Tag,Size调成2,Element 0的值改成UI。


然后你所有不想被点穿的UI都选成这个标签。

除了设置标签,还有一点很重要,就是界面要加碰撞器Collider,有的UI默认就有碰撞器,比如NGUI的按钮,你可以看到有一个Box Collider,如果没有的你就要自己加了,Size那里要调成这个UI的尺寸:


这样UI才能接收射线碰撞,然后代码可以这样写:

Ray ray1 = nguiCamera.camera.ScreenPointToRay(Input.mousePosition);RaycastHit hit1;if (Physics.Raycast(ray1, out hit1)) {if (hit1.collider.gameObject.tag == "UI")return;}

上面的nguiCamera是获取的NGUI下的Camera,因为是这个Camera发出的射线与UI的碰撞,而不是Main Camera,这点要注意。其他的不解释了,很简单,自己看。


方案二、利用层(Layer)拦截射线消息

每个GameObject的Inspector面板最上方都也有个Layer选项,就在Tag旁边,unity3d已经有了几个层,我们新建个层,也叫UI,点击Add Layer,可以看到从Layer0到Layer7都灰掉了,那是不能用的,从第八个起可以用,所以在第八个建个UI的层。


然后我们看一下Physics的Raycast的参数:

static function Raycast (ray : Rayout hitInfo : RaycastHitdistance : float = Mathf.InfinitylayerMask : int = kDefaultRaycastLayers) : bool

一般情况下我们只用前两个参数,distance表示射线距离,默认是无限远,重点是最后一个参数layerMask,专门处理layer过滤的,是个整型,怎么用呢,是靠layer的二进制位来操作的,看下面代码就清楚了:

Ray ray1 = nguiCamera.camera.ScreenPointToRay(Input.mousePosition);RaycastHit hit1;LayerMask mask = 1 << LayerMask.NameToLayer("UI");if (Physics.Raycast(ray1, out hit1, 600, mask.value)) {return;}

LayerMask的NameToLayer是通过层的名称返回该层的索引,这里是8,然后1<<8换算成LayerMask值,再用LayerMask的value就可以了。

注意也必须设置collider才能接收碰撞,这里才能判断到。

我这里提供了两个方案,如果有其他方案的欢迎留言,谢谢。


原创粉丝点击