unity 3D var layerMask = 1 << 8;是啥意思?尤其不懂1<<8这点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity 3D var layerMask = 1 << 8;是啥意思?尤其不懂1<<8这点相关的知识,希望对你有一定的参考价值。

ty 3D var layerMask = 1 << 8;是什么意思?尤其不懂1<<8这点

如题
var layerMask = 1 << 8;

var 声明一个变量
layerMask为变量的名字
1 << 8是位运算,<<符号是左移符号,即将二进制的每一位向左移动
1的二进制左移8位的运算方法如下:
首先将1转为2进制,设二进制为16位的二进制数,则16位二进制数1表示如下:
0000 0000 0000 0001
左移即将所有二进制位向左移动,如果超过16位,则溢出舍弃,右面移入的位为0
左移8位后结果为
0000 0001 0000 0000,即十进制的256
扩展:
左移n位可以看做2的n次方,1<<8即1*2^8=256
参考技术A << 和 >> 都是位操作符号,举个栗子~
如果是 1 << 2 那么这个表达式的值就等于2的2次方,等于 4
因为 1 的二进制可以写成 0001 (假设这是一个四位的二进制数)
那么 << 符号后面的 2 就表示要把上面那个二进制数全部向左移动 2 位
那移动后的二进制结果就为 0100 ,转成十进制就是 4
你那个 1 << 8 也是同样的道理,1 << 8的结果就是 2 的8次方 ,等于 256
纯手打~还有不懂的不本回答被提问者和网友采纳
参考技术B 这个是用来设置摄像机的过滤的渲染层的! 你可以在编辑器中查看,当代码激活时你的gameobject所处在哪一个渲染层就明白了,你这代码是unity 3d中那个沟边外挂的代码吧? 参考技术C unity中Layer最多32个,对应一个Int32类型数据变量,其中每一个bit对应一个Layer。当该bit为1时表示开启该layer,为0时表示关闭该layer。 参考技术D << 和>>都是偏移符号就是将数字转换成二进制然后向左(<<)或向右(>>)偏移(移动)n个位置(看后面的数字)

Unity LayerMask 的位运算

 

Unity的Layer

Unity是用 int32来表示32个Layer层,int32用二进制来表示一共有32位。

0000 0000 0000 0000 0000 0000 0000 0000

31                                                                 0

看几个例子

开启layer 2

LayerMask mask = 1<<2;

其中 <<左边的 1表示有[开启],0表示没有该layer[忽略] 。右边的2表示左移2位即是 layer2层的位置。

 

开启layer 0和layer 2

LayerMask mask = 1 << 0 |  1 << 2;

 

开启Layer0 并关闭 Layer2

LayerMask mask = 1 << 0 | 0 << 2

 

开启Layer Default

LaserMask mask=1 << LayserMask.NameToLayer(“Default”);

脚本例子

下面是一个脚本例子,把它绑定在Camera上

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Camera))]
public class LayerMaskTest : MonoBehaviour {

    //打开Npc层,变1 或 运算符
    private void Show()
    {
        //camera.cullingMask |= 1 << LayerMask.NameToLayer("Npc");
        camera.cullingMask = (int) 1<<LayerMask.NameToLayer("Npc");//写法二
    }

    // 关闭Npc层,变0 按位与 &  按位取反 ~
    private void Hide()
    {
        camera.cullingMask &= ~(1 << LayerMask.NameToLayer("Npc"));
    }

    // 开关Npc层,按位异或    ^
    private void Toggle()
    {
        camera.cullingMask ^= 1 << LayerMask.NameToLayer("Npc");
    }

    void OnGUI()
    {
        if (GUILayout.Button("Show")) Show();
        if (GUILayout.Button("Hide")) Hide();
        if (GUILayout.Button("Toggle")) Toggle();
    }
}

实际应用

Unity的碰撞检测

static bool Raycast(Vector3 origin, Vector3 direction, float distance = Mathf.Infinity, int layerMask = DefaultRaycastLayers);

物理碰撞互斥

我们项目中自己写的物理碰撞互斥

//开启Npc层的碰撞
LayerMask mask = 1 << (int)GameLayerDef.Npc;
float bounds = 2;
RaycastHit2D raycastHit = Physics2D.CircleCast(transform.position, bounds, Vector2.right, Mathf.Infinity, mask.value);

资料文献

部分内容参考自: 【风宇冲】二进制:四 Unity

以上是关于unity 3D var layerMask = 1 << 8;是啥意思?尤其不懂1<<8这点的主要内容,如果未能解决你的问题,请参考以下文章

unity3d 启用某层设置

[Unity]Ray射线物理检测碰撞和LayerMask的使用

[Unity]Ray射线物理检测碰撞和LayerMask的使用

Unity3D Layer要点

Unity学习笔记--LayerMask的使用方法和易错点

Unity2D重叠圆LayerMask不起作用