陈巧倩

Unity中文版-Create Gameplay Layers Layers and layerMasks(自翻译)

· 72 words · 1 minutes to read
Categories: Unity
Tags: Document

翻译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);

结论 🔗

搬砖愉快!