unity 怎么判断是不是在地上ios layer.mask 遮罩mask

20730人阅读
Unity3D(23)
最近看别人写的Demo,里面这个Linecast字段的LayerMask参数看了半天也没看懂
void&Update()
&&&&&&&&//&The&player&is&grounded&if&a&linecast&to&the&groundcheck&position&hits&anything&on&the&ground&layer.
&&&&&&&&grounded&=&Physics2D.Linecast(transform.position,&groundCheck.position,&1&&&&LayerMask.NameToLayer(&Ground&));&&
&&&&&&&&//&If&the&jump&button&is&pressed&and&the&player&is&grounded&then&the&player&should&jump.
&&&&&&&&if(Input.GetButtonDown(&Jump&)&&&&grounded)
&&&&&&&&&&&&jump&=&true;
后来去官网看,半天也没个例子,还是google吧,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Layers一共有32层,这个是不能增加或者减少的:
摘自官网:
Layers&are used throughout Unity as
a way to create groups of objects that share particular characteristics (see&&for
further details). Layers are primarily used to restrict operations such as raycasting or rendering so that they are only applied to the groups of objects that are relevant. In the manager, the first eight layers are defaults used by Unity and are not editable.
However, layers from 8 to 31 can be given custom names just by typing in the appropriate text box. Note that unlike tags,
the number of layers cannot be increased.
所以那个LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。
回到上面的例子:
1&&&&LayerMask.NameToLayer(&Ground&)
这一句实际上表示射线查询只在Ground所在这个层级查找。
再来看看NameToLayer是干嘛的。
官网解释:
Given a layer name, returns the layer index as defined by either a Builtin or a User Layer in the&.
是返回的该名字所定义的层的层索引,注意是从0开始。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:236677次
积分:2114
积分:2114
排名:第14403名
原创:22篇
转载:34篇
评论:21条
(2)(11)(19)(8)(6)(2)(8)Unity3D(11)
这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点 穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的, 好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。
方案一:利用标签(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&:&,&out
hitInfo&:&,&distance&:
float =&,&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.center = Vector3.
&&&&&&&&&&&&_collider.size = new Vector3(10f, CommonDef.Layer0_Terrain_Grass, 10f);
&&&&&&&&&&&&MeshFilter _meshFilter = _newObj.GetComponent();
&&&&&&&&&&&&_meshFilter = _meshFilter == null ? _newObj.AddComponent() : _meshF
&&&&&&&&&&&&Mesh _mesh = ModelResManager.AddTerrainGrassMesh(10, 10);
&&&&&&&&&&&&_meshFilter.mesh = _
&&&&&&&&&&&&MeshRenderer _meshRender = _newObj.GetComponent();
&&&&&&&&&&&&_meshRender = _meshRender == null ? _newObj.AddComponent() : _meshR
&&&&&&&&&&&&//指向父子节点关系,只需指定其位置组件父子关系;
&&&&&&&&&&&&GameObject _subObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
&&&&&&&&&&&&_subObj.transform.parent = _newObj.
以上是创建一个GameObject,赋上Collider组件用于射线碰撞检测,以下是获取指定Layer射线的方法:
&&&&&&&&&&LayerMask mask = 1 && LayerMask.NameToLayer(&CommObj&);
&&&&&&&&&&Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
&&&&&&&&&&RaycastHit _hitI
&&&&&&&&&&if (Physics.Raycast(ray, out _hitInfo, 1000f,&mask.value))
&&&&&&&&&&{
&&&&&&&&&&&&&m_currSelectObj = _hitInfo.collider.gameO
&&&&&&&&&&&&&m_mouseMovePos = _hitInfo.
&&&&&&&&&}
黑体字为获取指定Layer的mask值,用于射线检测。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50252次
积分:1027
积分:1027
排名:千里之外
原创:60篇
(1)(2)(2)(8)(1)(3)(1)(11)(10)(5)(7)(1)(3)(7)unity里的layermask为什么要用位移运算啊?位移运算原理我懂?_词汇网
unity里的layermask为什么要用位移运算啊?位移运算原理我懂?
责任编辑:词汇网 发表时间: 6:13:19
求助。layermask位移原理
上一集:没有了 下一集:
相关文章:
最新添加资讯
24小时热门资讯
附近好友搜索

我要回帖

更多关于 ios layer.mask 详解 的文章

 

随机推荐