unity tag layer内置的Tag和Layer都有什么用

Unity3D&射线指定层获取GameObject&注意
转载:http://blog.csdn.net/lzhq1982/article/details/
这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点
穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的,
好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。
方案一:利用标签(Tag)拦截射线消息。
每个GameObject的Inspector面板最上方都有个Tag选项,也就是说我们可以给所有的物体加个标签,Unity3d已经默认有了几
个标签,这里我们可以自定义个UI的标签,然后把所有UI都用这个标签。点击Tag右方的选项,选Add
Tag,Size调成2,Element 0的值改成UI。
<img src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/55609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHpocTE5ODI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" ALT=""
TITLE="Unity3D&射线指定层获取GameObject&注意" />
然后你所有不想被点穿的UI都选成这个标签。
除了设置标签,还有一点很重要,就是界面要加碰撞器Collider,有的UI默认就有碰撞器,比如NGUI的按钮,你可以看到有一个Box
Collider,如果没有的你就要自己加了,Size那里要调成这个UI的尺寸:
<img src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/24234" ALT=""
TITLE="Unity3D&射线指定层获取GameObject&注意" />
这样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的层。
<img src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.blog.csdn.net/48812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHpocTE5ODI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" ALT=""
TITLE="Unity3D&射线指定层获取GameObject&注意" />
然后我们看一下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,
&&&&&&&&&&&
MeshFilter _meshFilter = _newObj.GetComponent();
&&&&&&&&&&&
_meshFilter = _meshFilter == null ? _newObj.AddComponent() :
&&&&&&&&&&&
Mesh _mesh = ModelResManager.AddTerrainGrassMesh(10, 10);
&&&&&&&&&&&
_meshFilter.mesh = _
&&&&&&&&&&&
MeshRenderer _meshRender = _newObj.GetComponent();
&&&&&&&&&&&
_meshRender = _meshRender == null ? _newObj.AddComponent() :
&&&&&&&&&&&
//指向父子节点关系,只需指定其位置组件父子关系;
&&&&&&&&&&&
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值,用于射线检测。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Unity3D中Layers和LayerMask解析 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了25367字,被130人关注,获得了91个喜欢
Unity3D中Layers和LayerMask解析
Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。在Unity中可编辑的Layer如下图所示:
在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!
LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。
按位运算符:~、|、&、^。位运算符主要用来对二进制位进行操作。
逻辑运算符:&&、||、!。逻辑运算符把语句连接成更复杂的复杂语句。
按位运算符:左移运算符&&,左移表示乘以2,左移多少位表示乘以2的几次幂。
举个栗子:
var temp = 14 && 2; 表示十进制数14转化为二进制后向左移动2位。
temp最后计算的值为 14乘以2的平方,temp = 56;
同理,右移运算符&&,移动多少位表示除以2的几次幂。
具体可以转到博客:.
上面是个基础知识的补充。
在Unity中是用LayerMask
官方给出的描述是:Layers are most commonly used by Cameras to render only a part of the scene, and by Lights to illuminate only parts of the scene. But they can also be used by raycasting to selectively ignore colliders or to create collisions。
翻译下就是:Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些collder或Collision使用。
在代码中使用时如何开启某个Layers?
LayerMask mask = 1 && 你需要开启的Layers层。
LayerMask mask = 0 && 你需要关闭的Layers层。
举几个个栗子:
LayerMask mask = 1 && 2; 表示开启Layer2。
LayerMask mask = 0 && 5;表示关闭Layer5。
LayerMask mask = 1&&2|1&&8;表示开启Layer2和Layer8。
LayerMask mask = 0&&3|0&&7;表示关闭Layer3和Layer7。
上面也可以写成:
LayerMask mask = ~(1&&3|1&&7);表示关闭Layer3和Layer7。
LayerMask mask = 1&&2|0&&4;表示开启Layer2并且同时关闭Layer4.
using UnityE
using System.C
public class example : MonoBehaviour {
LayerMask mask =
~(1&&3|1&&7);
void Update() {
if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))
Debug.Log("Hit something");
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
Unity3D引擎技术讨论专题
· 540人关注
简介:Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互...
· 291人关注
无论你是新手,还是老司机。都可以为新生代血液尽一份绵薄之力!
· 81人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 unity tag 与 layer 的文章

 

随机推荐