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;
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这点的主要内容,如果未能解决你的问题,请参考以下文章
[Unity]Ray射线物理检测碰撞和LayerMask的使用