LayerMask的使用

一.
LayerMask可以让你在Inspector中选择层级
在脚本中定义

[code]csharpcode:

public LayerMask mask;

就可以在Inspector中选择层级,可以单选,可以多选

如果我们在脚本中这样写:

[code]csharpcode:

	void Start () 
	{
		mask.value=1<<8;
//		mask=1<<8; 这样写也可以
	}

运行时就会变成这样

其中Layer的定义如下:

二.

可以看到Layer从0(Default)到31一共可定义32个。

实际上,我们用一个32位整数表示层级

00000000 00000000 00000000 00000000到11111111 11111111 11111111 11111111

这32位整数哪一位为1,就表示包含了对应的层级

如00000000 00000000 000000001 00000001就代表了Cube和Default这两个层级。

上面的整数可以用1<<0|1<<8来表示

[code]csharpcode:

	void Start () 
	{
		mask.value=1<<0|1<<8;
//		mask=1<<0|1<<8;这样写也可以
		Debug.Log(mask.value);
	}

运行时可以看到选择了Default和Cube两个层级

并且打印输出的值为257

我们将上面的32位整数按位取反看看

~(00000000 00000000 000000001 00000001)得到11111111 11111111 11111110 11111110

因为只有第一位和第9位为0,其余都为1,所以这表示包含除了Default和Cube的所有层级

在代码中用~(1<<0|1<<8)来表示

[code]csharpcode:

	void Start () 
	{
		mask.value=~(1<<0|1<<8);
//		mask=~(1<<0|1<<8);这样写也可以
		Debug.Log(mask.value);
	}

运行时看到,Default和Cube外的所有层级都被选中了。

并且打印输出的值为

11111111 11111111 11111110 11111110正是-258的32位补码。可见,Unity将层级的值看做补码。

将一个整数值(可正可负)赋给一个LayerMask(或LayerMask.value)时,先将该整数以32位补码表示出来,再看看这个补码哪些位为1,哪些为0,来判断包含了哪些层级。

比如public LayerMask mask=-1;

-1的32补码为全1:11111111 111111111 111111111 11111111,所以-1代表所有层级,也就是上面层级列表中的Everything

从上面的代码示例可以看到,完全可以把LayerMask值看作一个整数(它的值为mask.value),它可以与整数进行运算,也可以与整数类型变量相互赋值。

三.

LayerMask有两个静态方法LayerToName和NameToLayer,用于实现从层级号(如8)到层级名(如Cube)的相互转换。

四.

常用的使用步骤为:

[code]csharpcode:

	void Update () 
	{
		int layerNum=LayerMask.NameToLayer("Cube");//获取Cube层的层级号
		LayerMask mask=1<<layerNum;//取得Cube的层级值
		if(Physics.Raycast(transform.position,transform.forward,10,mask.value))//只检测Cube层级的碰撞。
		{
			Debug.Log("the ray hit something");
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值