参考网址:https://msdn.microsoft.com/zh-cn/library/system.enum.hasflag.aspx
使用[Flags],就是用一个int数值存储多个状态位,所有的数据在计算机里计算都会转换为二进制, 1 是 0 否。
所以枚举标志位就是根据状态依次设置值。
举例:
[Flags] public enum FruitItems { Strawberry = 1, //草莓 Apple = Strawberry * 2, //苹果 Blueberry = Apple * 2, //蓝莓 Cherry = Blueberry * 2, //樱桃 Grape = Cherry * 2, //葡萄 Peach = Grape *2 //桃 } void Start() { FruitItems myOrder = FruitItems.Apple | FruitItems.Cherry | FruitItems.Grape; //Debug.Log("" + myOrder.HasFlag(FruitItems.Apple)); }
用物品的开头字母代表枚举,从后往前依次是:
P G C B A S
例如myOrder, A 1、C 1、G 1,所以二进制依次是 011010,转换为十进制就是26。这样一个int值就可以储存多个状态。
很遗憾,untiy运行提示无HasFlag方法。可以导入dll,但是这样无疑复杂了。只能自己写了:
void Start() { FruitItems myOrder = FruitItems.Apple | FruitItems.Cherry | FruitItems.Grape; FruitItems checkContain1 = FruitItems.Blueberry | FruitItems.Peach; FruitItems checkContain2 = FruitItems.Cherry | FruitItems.Peach; FruitItems checkContain3 = FruitItems.Cherry & FruitItems.Peach; Debug.Log(string.Format("{0},{1},{2}", Contains(myOrder, FruitItems.Apple), Contains(myOrder, FruitItems.Cherry), Contains(myOrder, FruitItems.Grape))); Debug.Log(string.Format("{0},{1}", Contains(myOrder, FruitItems.Blueberry), Contains(myOrder, FruitItems.Peach))); Debug.Log(string.Format("{0},{1},{2}", Contains(myOrder, checkContain1), Contains(myOrder, checkContain2), Contains(myOrder, checkContain3))); } public bool Contains(Enum enums, Enum target) { int enumNum = (int)Convert.ChangeType(enums, TypeCode.Int32); return (Convert.ToInt32(target) & enumNum) > 0; }
运行输出结果:
希望大家指点一下,可能算法不是很好。