一、Flags

在Unity中,[Flags] 属性用于一个枚举(enum)类型,表示该枚举可以被视作一个位字段(bit field),也就是一组标志(flags)。这允许你将枚举值组合使用,使用按位运算符(如 |&)来设置、查询或组合这些值。这对于表示一组开/关状态或其他组合属性特别有用。

例如,如果你有一个枚举定义了各种权限,使用 [Flags] 属性就可以轻松地表示一个实体具有多种权限的组合:

[Flags]
public enum Permissions
{
    Read = 1,
    Write = 2,
    Execute = 4,
    Full = Read | Write | Execute // 表示具有全部权限
}

这样,就可以使用 Permissions 来检查、设置或清除特定权限,这在需要管理复杂权限模型的应用程序中非常有用。

二、Map多选跳值问题

在Unity或其他使用C#的环境中,当你使用[Flags]属性标记一个枚举时,通常会给枚举成员赋予2的幂次方的数值,这是因为每个枚举值都将代表一个独立的位位置。这样设计的目的是为了让每个枚举值在位字段中占据唯一的位置,从而可以通过位运算(如按位“或”(|)、按位“与”(&)等操作)来组合或检查多个枚举值。

使用2的幂次方数值(例如1, 2, 4, 8, 16等)作为枚举值是因为在二进制表示中,这样的值每次只会有一个位是1,其他位都是0。这种特性允许你通过按位运算来组合多个枚举值,每个值都可以独立开关,而不会互相影响。

比如,如果你定义了一个如下的枚举:
【两种写法都可以】

[Flags]
public enum Options
{
    None = 0,
    Option1 = 1,  // 二进制表示 0001
    Option2 = 2,  // 二进制表示 0010
    Option3 = 4,  // 二进制表示 0100
    Option4 = 8   // 二进制表示 1000
}
[Flags]
public enum Options
{
    None = 0,
    Option1 = 1 << 1,  // 二进制表示 0001
    Option2 = 1 << 2,  // 二进制表示 0010
    Option3 = 1 << 3,  // 二进制表示 0100
    Option4 = 1 << 4   // 二进制表示 1000
}

你可以组合多个选项,比如 Option1 | Option3,这在二进制中表示为 0001 | 0100 = 0101。这种方法允许你在一个变量中存储和管理多个开/关状态,而且可以非常灵活地查询和修改这些状态。因此,在使用[Flags]属性时,赋予枚举成员2的幂次方数值是为了充分利用位运算的特性,以便有效地管理和检查标志的组合。