我的一个同事写了一份声明,我不完全理解。不幸的是,他现在不在,所以这里是(用修改后的名字,我们正在统一的游戏)。

private readonly int FRUIT_LAYERS =
          (1 << LayerMask.NameToLayer("Apple"))
        | (1 << LayerMask.NameToLayer("Banana"));

nametolayer接受一个字符串并返回一个整数。我经常看到左移位运算符与右边的常量整数一起使用,而不是左边的常量整数一起使用,我通过google找到的所有示例都遵循这种方法。在这种情况下,我认为他把苹果和香蕉推到了同一个相对层上(稍后我将使用这个相对层进行过滤)。将来会有更多的“水果”来过滤。有谁能给我解释这些线路上发生了什么?

最佳答案

你的同事基本上是用int代替bool[32]来节省空间。您显示的代码块类似于

bool[] FRUIT_LAYERS = new bool[32];
FRUIT_LAYERS[LayerMask.NameToLayer("Apple")] = true;
FRUIT_LAYERS[LayerMask.NameToLayer("Banana")] = true;

您可能需要考虑更像这样的模式:
[Flags]
enum FruitLayers : int
{
    Apple = 1 << 0,
    Banana = 1 << 1,
    Kiwi = 1 << 2,
    ...
}

private readonly FruitLayers FRUIT_LAYERS = FruitLayers.Apple | FruitLayers.Banana;

10-01 09:10