关于LayerMask的解释

本文主要写给新手看的,是关于LayerMask类的一个解释,当然也在一定程度上看得到unity3d对层的管理方式。
本文大部分内容来自于http://www.ceeger.com/forum/read.php?tid=15997

老手欲拍砖望手下留情。

之所以会发此贴,是因为在网上搜了一圈,发现手册说明过于简单,别的文章或帖子解答也有些不全,新手上来,难免有些理解吃力。

转载请注明作者及出处,复制粘贴就以原创自居,对你没什么好处。

下面正文

LayerMask类

其中的值为一个32位值。

层蒙板类,UNITY3D支持0~31共32个层,第0层为default,整数值为-1

接下来,除第0层(default)外,其余的层都用对应的那一个二进制位表示

第一层就是00000000000000000000000000000010
第二层就是00000000000000000000000000000100
其余类推

如果要表示某个层生效,就将这个层对应的位置1,否则置0,而default层的值比较特殊,为-1,转为二进制,就是所有的位都是1,表示是所有的层都生效。
这里要注意的是这个LayerMask值(简单这么理解吧,关于类的知识请自行参考别的文献)仅表示哪些层生效,哪些层不生效,而不是直接应用到层,所以这个值还必须应用到各种层操作的函数(接口)才得到最终的目的。

在对某个层生效置1操作时,一般使用将值“1”进行左移操作
比如要编号为10的层生效,可以使用:1<<10,这样行到的值就是:00000000000000000000010000000000

如果对多个层置1操作,那么要使用多值“或”操作完成
比如要使编号为2、5、11三个层生效,可以这样:(1<<2)|(1<<5)|(1<<11)

在旧的LayerMask类的值基础上新增置位操作的值,也要用“|=”使之结合。

该类有一个函数,是将层名转换为对应的编号(索引)值的,是NameToLayer,其Unity3dJS定义如下:

static function NameToLayer (layerName : string) : int

该函数接收一个字符串,返回此字符串所表示的层的编号(索引)值。

如果找不到相应的层,返回的值是-1,也就是default层。

关键点,值得注意的是:
操作是 1<<(-1) 是不是相当怪异?别以为相当于1>>1这个操作啊,后有解释。
如果使用该函数配合移位操作使相应层置1生效,那么不要尝试对default进行此操作,而应该直接使用值1表示default层或使用0xFFFFFFFF表示使所有层,如果转换的层名称无法找到,那么移位操作最后得到的结果也不一定是正确的。

解释是,-1这个值在计算机中的二进制值是所有位都为1,也就是如果是32位值 ,那-1就是11111111111111111111111111111111,换成十进制就是4294967295,这是32位无符号整型值的最大值。

由于不理解unity3dJS中对这些数据的类型自动转换规则是怎么样的,但脚本解释机制为了保证脚本的正常运行,应该会自动将该值临时转换为无符号的整型值或64位值,也就是4294967295,所以

1<<(-1)

这个操作就是将1左移4294967295次,因为只有32个位,所以移了4294967295次后,这个整型值应该是0,理论上就是没有任何层被置1生效,

但unity3dJS的实际运行结果是0x80000000,也就是10000000000000000000000000000000

这个结果是因为这个1移到第31位(最高位)时再执行左移的话,结果会得0x100000000,也就是100000000000000000000000000000000

这个1已经超出了32位的范围,被保留在中间值寄存器中,但这个中间值不能就这样扔了,所以在再次对这个数执行操作时,又将这个1放到了这个数的最高位(也就是符号位)上。

之所以这样操作,可能是unity3dJS会默认将一个数看作有符号值,这样就存在了符号位,当然得到这个运行结果的过程仅为猜测,本人对unity3d脚本解释引擎的工作机制还是两眼一抹黑,完全不懂。

同时也望使用C#的各位贴出C#脚本运行 1<<LayerMask.NameToLayer(“default”) 的结果值是多少
在此先谢过各位
Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。

代码释义:

LayerMask mask = 1 << 你需要开启的Layers层。
LayerMask mask = 0 << 你需要关闭的Layers层。   等价于  LayerMask mask = ~( 1 << 你需要关闭的Layers层。)

猜你喜欢

转载自blog.csdn.net/qq_34562355/article/details/91876362
今日推荐