Unity3D 射线指定层获取GameObject 注意 LayerMask
这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面居然能点 穿。我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要推断点击的物体名称吧。那界面多了会累死的, 好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。
方案一:利用标签(Tag)拦截射线消息。
每一个GameObject的Inspector面板最上方都有个Tag选项,也就是说我们能够给全部的物体加个标签,Unity3d已经默认有了几 个标签,这里我们能够自己定义个UI的标签。然后把全部UI都用这个标签。点击Tag右方的选项。选Add Tag。Size调成2。Element 0的值改成UI。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHpocTE5ODI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
然后你全部不想被点穿的UI都选成这个标签。
除了设置标签,另一点非常重要,就是界面要加碰撞器Collider,有的UI默认就有碰撞器,比方NGUI的button,你能够看到有一个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,这点要注意。其它的不解释了。非常easy,自己看。
方案二、利用层(Layer)拦截射线消息
每一个GameObject的Inspector面板最上方都也有个Layer选项,就在Tag旁边,unity3d已经有了几个层。我们新建个层。 也叫UI,点击Add Layer,能够看到从Layer0到Layer7都灰掉了,那是不能用的,从第八个起能够用。所以在第八个建个UI的层。
然后我们看一下Physics的Raycast的參数:
static function Raycast (ray : Ray, out
hitInfo : RaycastHit, distance :
float = Mathf.Infinity, layerMask :
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才干接收碰撞,这里才干推断到。
我这里提供了两个方案,假设有其它方案的欢迎留言,谢谢。
笔者补充内容:
假设是在代码中自己创建GameObject指定Layer的方法和获取Layer进行射线的注意地方。
例如以下创建一个GameObject:
GameObject _newObj = new GameObject();
_newObj.layer = LayerMask.NameToLayer("CommObj"); //指定Layer
_newObj.name = "Terrain0_Grass";
print(LayerMask.NameToLayer("CommObj"));
BoxCollider _collider = _newObj.GetComponent();
_collider = _collider == null ?
_newObj.AddComponent() : _collider;
_collider.center = Vector3.zero;
_collider.size = new Vector3(10f, CommonDef.Layer0_Terrain_Grass, 10f);
MeshFilter _meshFilter = _newObj.GetComponent();
_meshFilter = _meshFilter == null ?
_newObj.AddComponent() : _meshFilter;
Mesh _mesh = ModelResManager.AddTerrainGrassMesh(10, 10);
_meshFilter.mesh = _mesh;
MeshRenderer _meshRender = _newObj.GetComponent();
_meshRender = _meshRender == null ? _newObj.AddComponent() : _meshRender;
//指向父子节点关系,仅仅需指定其位置组件父子关系;
GameObject _subObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
_subObj.transform.parent = _newObj.transform;
以上是创建一个GameObject。赋上Collider组件用于射线碰撞检測。下面是获取指定Layer射线的方法:
LayerMask mask = 1 << LayerMask.NameToLayer("CommObj");
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit _hitInfo;
if (Physics.Raycast(ray, out _hitInfo, 1000f, mask.value))
{
m_currSelectObj = _hitInfo.collider.gameObject;
m_mouseMovePos = _hitInfo.point;
}
黑体字为获取指定Layer的mask值。用于射线检測。
Unity3D 射线指定层获取GameObject 注意 LayerMask的更多相关文章
- sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中+MD5加密
/****** Object: StoredProcedure [dbo].[getSplitValue] Script Date: 03/13/2014 13:58:12 ******/ SET A ...
- [ionic开源项目教程] - 第4讲 通Service层获取数据列表
第4讲:通Service层获取数据列表 上一讲中页面的基本架构已完成,这一讲介绍如何通过service层从服务器请求数据,在通过controller层为载体,显示到视图层. 1.在services.j ...
- caffe fine tune 复制预训练model的参数和freeze指定层参数
复制预训练model的参数,只需要重新copy一个train_val.prototxt.然后把不需要复制的层的名字改一下,如(fc7 -> fc7_new),然后fine tune即可. fre ...
- 计算 byte[] 转 int modebus 指定位数 获取值 使用
计算 byte[] 转 int modebus 指定位数 获取值 使用 if (bytetores.Length > 6) { int total = 0; for (int i = 0; i ...
- 在spring的业务层获取request,response
1.直接通过controller层获取到传输到业务层2.SpringMVC提供的RequestContextHolder可以直接获取代码: RequestAttributes requestAttri ...
- 【Unity笔记】鼠标射线由指定层接收
LayerMask mask = << LayerMask.NameToLayer("UI"); Ray ray = Camera.main.ScreenPointTo ...
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...
- unity3d 射线的原理,基础用法
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 . Ray射线类和RaycastHit射线投射信息类是射线中常用的两个工具类. 用途:射线多 ...
- Unity3D之随心所欲的获取对象
ps 1 建立一个cube 建立一个scripts 2 scripts 赋给cube 3 在script里面直接 gameObject.SetActive (false); 就是操作当前脚本绑定 ...
随机推荐
- Python 45 css三种引入方式以及优先级
一:css三种引入方式 三种方式为:行间式 | 内联式 | 外联式 行间式 1.在标签头部的style属性内 2.属性值满足的是css语法 3.属性值用key:value形式赋值,value具 ...
- Win10 计算机管理 打不开应急办法
最近Win10重置以后,计算机管理打不开了,经过一番尝试,通过以下命令在cmd下面可以直接打开 compmgmt 或者compmgmt.msc打开 在次特做一个记录,以备急用
- python重定向原理及实例
1. 前言 为了在Python编程中, 利用控制台信息, 我们需要对控制台输出进行接管(重定向).在Python中,控制台输出的接口是sys.stdout,通过分析print与sys.stdout之间 ...
- itext 生成pdf文档 小结(自己备忘)
1.引入maven <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf& ...
- C#开发微信公众号——网页开发之微信网页授权
首先咱们先看下公众号的文档里面的介绍 上述图片的文字描述就是讲述了网页授权有什么用,就是为了获取微信用户的基本信息:授权回调域名的规范,说到域名回调的事情就不得不提一下设置网页授权域名 最好将这三个域 ...
- Combotree--别样的构建层级json字符串
1.先看效果 2.需要使用层级json格式,如: 3.先不要着急怎么去实现它,先来想想怎么用对象来描述它 4.代码 protected void Page_Load(object sender, Ev ...
- bootstrap 网格布局
一:基本的网格布局 <div class="container"> <div class="row"> <div class=&q ...
- 时序分析:ARMA方法(平稳序列)
憔悴到了转述中文综述的时候了........ 在统计学角度来看,时间序列分析是统计学中的一个重要分支, 是基于随机过程理论和数理统计学的一种重要方法和应用研究领域. 时间序列按其统计特性可分为平稳性 ...
- 【JSP】上传图片到数据库中
第一步:建立数据库 create table test_img(id number(4),name varchar(20),img long raw); 第二步:(NewImg.html) <h ...
- express创建第一个web应用
Express 在初始化一个项目的时候需要指定模板引擎,默认支持Jade和ejs. 这里我们使用ejs模板引擎:(关于ejs的介绍可以先从百科里面了解一个大概)EJS是一个JavaScript模板库, ...