翻译Unity中文版的初衷是因为官方提供的中文版存在缺陷,而且翻译的不全。现在基于Unity2023.2版本对官方文档进行翻译。
Layers and layerMasks 🔗
每个GameObject都存在于一个单独的图层上,但是用于设置API影响哪些图层的Unity API不直接使用图层。相反,它们使用图层掩码(layerMask)。
图层是一个标准的整数,但图层掩码是一个按位掩码形式格式化的整数,其中每个1
表示要包含的图层,每个0
表示要排除的图层。这意味着您可以将一个图层传递给期望一个图层掩码的API,并且脚本仍然会编译,因为图层和图层掩码使用相同的基础类型。然而,API调用将不会产生您期望的行为。
例如,如果您想对第9层的GameObject执行射线投射,如果在Physics.Raycast调用中传递9
作为layerMask,Unity实际上会对第3
层和0
层上的GameObject执行射线投射。这是因为9的二进制表示是00001001
,如果将其视为掩码,1
出现在第3
层和0
层的位置。
有关如何设置要在API调用中使用的layerMask的信息,请参阅设置一个layerMask。
设置一个layerMask 🔗
本页面解释了如何正确设置一个layerMask,以便您可以在使用序列化的layerMask属性的API调用中使用它。
使用序列化的layerMask属性 🔗
在Unity编辑器中设置一个layermask的最简单方法是创建一个使用Unity的LayerMask类的属性。如果该属性是“public”或使用SerializeField属性,Unity将在Inspector中提供一个界面,您可以使用该界面选择layermask所代表的图层。
using UnityEngine;
public class LayerMaskExample : MonoBehaviour
{
[SerializeField] private LayerMask layermask;
}
从一个图层转化 🔗
如果您想要在运行时将一个图层转化为layermask,请使用二进制左移运算符将1
按图层左移。结果是一个表示单个图层的layermask。
using UnityEngine;
public class LayerExample : MonoBehaviour
{
[SerializeField] private int layer = 10;
private int layerAsLayerMask;
private void Start()
{
layerAsLayerMask = (1 << layer);
}
}
将图层添加到layerMask中 🔗
要将图层添加到layermask中,请在原始layermask和要添加的图层上使用逻辑OR运算符。
originalLayerMask |= (1 << layerToAdd);
从layerMask中移除图层 🔗
要从layermask中移除图层,请使用原始layermask和要移除的图层的按位取反的逻辑AND运算符。
originalLayerMask &= ~(1 << layerToRemove);
结论 🔗
搬砖愉快!