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

本系列文章由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才能接收碰撞,这里才能判断到。

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


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学习Unity3D时,以下是一些重要的笔记: 1. Unity3D基础知识: - 游戏对象(Game Objects)和组件(Components):了解游戏对象的层次结构和组件的作用。 - 场景(Scenes)和摄像机(Cameras):学会如何创建场景并设置摄像机视角。 - 材质(Materials)和纹理(Textures):掌握如何创建和应用材质和纹理。 - 动画(Animations):学习如何创建和控制游戏对象的动画。 2. 脚本编程: - C#语言基础:了解C#语言的基本语法和面向对象编程概念。 - Unity脚本编写:学习如何编写脚本来控制游戏对象的行为和交互。 - 常见组件和功能:掌握常见的Unity组件和功能,如碰撞器(Colliders)、刚体(Rigidbodies)、触发器(Triggers)等。 3. 游戏开发流程: - 设计游戏关卡:了解如何设计游戏场景和关卡,包括布局、道具、敌人等。 - 游戏逻辑实现:将游戏规则和玩家交互转化为代码实现。 - UI界面设计:学习如何设计游戏中的用户界面,包括菜单、计分板等。 - 游戏优化和调试:优化游戏性能,解决常见的错误和问题。 4. 学习资源: - Unity官方文档和教程:官方提供了大量的文档和教程,逐步引导你学习Unity3D。 - 在线教程和视频教程:网上有很多免费和付费的Unity教程和视频教程,可根据自己的需求选择学习。 - 社区论坛和博客:加入Unity开发者社区,与其他开发者交流并获取帮助。 通过系统地学习这些内容,你将能够掌握Unity3D的基础知识并开始开发自己的游戏项目。记得不断实践和尝试,不断提升自己的技能!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值