
层掩码是一个32位的标志,用整数表示,位移位用于更改图层蒙版标志的值。
例如:
位移位 (C#) | 32 位标志 | 整数值 |
1<<0 | 0000 0000 0000 0000 0000 0000 0000 0001 | 1个 |
1<<8 | 0000 0000 0000 0000 0000 0001 0000 0000 | 256 |
1<<9 | 0000 0000 0000 0000 0000 0010 0000 0000 | 512 |
在Unity软件中的右上角可以看到Layer菜单,可以通过单击编辑图层下拉选项来添加和编辑图层,前8层(0-7)是无法编辑的内置层,但可以添加接下来的24层(8-31),称为用户层。

如果想要对某些特定层的光线投射碰撞器进行光线投射时,层蒙版非常有用,例如:在游戏中只想将子弹打到敌人或任何特定的游戏对象,那么就可以使用图层蒙版。
Raycast使用图层蒙版来实现
先从这里下载本案例的演示项目。
在场景中添加三种类型的游戏对象,现在在场景中添加了立方体、球体和圆柱体。

为这三种类型的游戏对象添加三个不同的层。

在Unity软件中为每种类型的游戏对象添加合适的图层,现在正在为立方体类型的游戏对象等添加立方体层。

仅命中蒙版层碰撞器
在项目的资产文件夹中创建脚本LayerMaskDemo,按照下面给定的代码编辑脚本并将其附加到Main Camera(主摄像机)游戏对象。
using UnityEngine;
using System.Collections;
public class LayerMaskDemo : MonoBehaviour {
RaycastHit rayhit;
int CubeLayerMask;
int SphereMask;
int CylinderMask;
// Use this for initialization
void Start () {
CubeLayerMask = 1 << 8;
SphereMask = 1 << 9;
CylinderMask = 1 << 10;
Debug.Log ("Cube Layer Mask: " + CubeLayerMask);
}
// Update is called once per frame
void Update () {
// Hide the game object on click if it is cube
if (Input.GetMouseButtonDown (0)) {
if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayhit, 100f, CubeLayerMask)) {
if (rayhit.collider != null) {
rayhit.collider.gameObject.SetActive(false);
}
}
}
}
}
现在运行应用程序并单击场景中的游戏对象,如果单击的游戏对象是立方体,它将从场景中隐藏起来。

还可以使用图层名称获取图层,NameToLayer和LayerToName方法可用于将图层名称转换为其索引,反之亦然。
// will print "8" in console
Debug.Log(LayerMask.NameToLayer("Cube"));
// will print "Cube" in console
Debug.Log(LayerMask.LayerToName(8));
// create variable of type LayerMask or Integer
LayerMask CubeLayerMask = 1 << LayerMask.NameToLayer("Cube");
可以使用逻辑或运算符来屏蔽多个层,如下所示编辑LayerMaskDemo脚本。
void Update () {
// Hide the game object on click if it is cube
if (Input.GetMouseButtonDown (0)) {
if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayhit, 100f, CubeLayerMask | CylinderMask)) {
if (rayhit.collider != null) {
rayhit.collider.gameObject.SetActive(false);
}
}
}
}
现在运行软件,因为已经屏蔽了立方体和圆柱体,所以它们会在点击时隐藏。

不要击中蒙版层碰撞体
如果想打所有其他层而不是蒙版层,也可以使用图层蒙版,再次更改脚本。
using UnityEngine;
public class Demo2 : MonoBehaviour {
RaycastHit rayhit;
int CubeLayerMask;
// Use this for initialization
void Start () {
CubeLayerMask = 1 << 8;
CubeLayerMask = ~CubeLayerMask;
}
// Update is called once per frame
void Update () {
// Hide the game object on click if it is not cube
if (Input.GetMouseButtonDown (0)) {
if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayhit, 100f, CubeLayerMask)) {
if (rayhit.collider != null) {
rayhit.collider.gameObject.SetActive(false);
}
}
}
}
}
再次运行代码。现在立方体类型的游戏对象不会隐藏,但其他人会隐藏。

…
以上是3D天堂关于了解Unity图层蒙版的全部内容,如果你有任何反馈,请随时在本页面下方留言。