Unity实现多选枚举

Unity-c#枚举多选

在Unity开发程序过程中,枚举是一种比较常用的数据类型,一般我们会定义枚举的多个状态来分别控制不同状态的行为或者变化;
但是Unity提供的枚举定义一般只会支持每次选中一个枚举状态,对于多状态并发执行的条件判断来说又带来了局限性,下面就介绍一下,
在Unity 中我们应该怎么来定义多选变量;

Unity 正常枚举定义

先来看一下正常的枚举定义

//先来定义一个枚举
public enum Types{
Type1,
Type2,
Type3
}

public class NormalEnum:MonoBehaviour
{
public Types type;

void Start(){
//给type枚举赋一个值
type= Types.Type1;
//现在我们打印的type值就已经是Type1了
Debug.Log(type);


//情况有变  我现在想给type赋值为Type2
type = Types.Type2;
//此时的type值就为Type2了,但是我们也会发现,此时的type值仅仅只是Type.Type2而已,而不是我们想要的同时具有Type1和Type2两个值
Debug.Log(type);
}

}

上方的代码就是最进本的正常枚举定义赋值,但是不支持枚举同时具备多个值,下面我们来实现,多值枚举的实现;
来看看正常枚举的样子
Unity实现多选枚举_第1张图片
现在的枚举不能多选,只能选择一个。

//和上面一样我们先定义一个枚举,不过在定义的时候有一点点的小变化,我们要给枚举在定义的时候加上一个Unity 的特性标签
[System.Flags]
public enum BigTypes{
Type1=1,
Type2=2,
Type3=4
}
//看到上面的定义方式,是不是又有哪里不一样??? 是的这次我们给每个枚举类型都默认了一个值,
//为什么多选的时候需要默认值???默认值有规范吗???如果有,那么给定值的时候又有什么规范???
//是不是想知道,想知道继续往下看。。。。。。

public class SpecialEnum:MonoBehaviour{

//这里也要价格特性标签,特殊就要有特殊的样子
[EnumFlags]
public BigTypes bigType;
//这样就实现了吗?现在我们的定义枚举在Inspector面板上还是不能够多选的,
//这个时候我们还需要再拓展一下Unity面板
}

//拓展Unity 面板,使其支持多选枚举
[CustomEditor(typeof(SpecialEnum))]
public class BigEnumEditor:Editor
{
private SpecialEnum se;
private SerializedObject obj;//序列化SpecialEnum


void OnEnable(){
obj = new SerializedObject(target);
se = target as SpecialEnum;
}


public override void OnInspectorGUI()
{
    obj.Update();
    EditorGUI.BeginChangeCheck();//开始检测更新
    se.bigType = (BigTypes)EditorGUILayout.EnumMaskField("选择类型",se.bigType);
    EditorGUI.EndChangeCheck();

    //结束检查是否有修改
    if (GUI.changed)
    {//提交修改
        obj.ApplyModifiedProperties();
    }
}

}

//经历了上面的努力,现在我们的枚举已经能够支持多选了,先上个图展示一下成果:
Unity实现多选枚举_第2张图片

是不是觉得结束了?? 现在我们已经解决了多选枚举的定义,那么我们该怎么使用我们定义的枚举呢???

Unity 多选枚举的使用

  • 得到多选枚举的所有元素名称
string[] allEnumItem = Enum.GetNames(typeof(BigTypes));

  • 当前枚举是否包含指定值
bool isContain = (bigType & BigTypes.Type1) != 0;
如果包含指定值则返回true

  • 多选枚举选中某个值(增加一个选项)
bigType = bigType | BigTypes.Type2;

  • 多选枚举取消选中某个值(减少一个选项)
bigType = bigType&~BigTypes.Type2;

好了就说这些比较常用的方法吧。。。其他用法自己摸索吧。

好像还有一个问题
为什么多选的时候需要默认值???默认值有规范吗???如果有,那么给定值的时候又有什么规范???
一般来说多选枚举是需要手动赋值的,而且默认值也是需要满足一定的条件,在上面的多选枚举的使用方法的运算,其实就是
通过加减运算来判断枚举是否包含某个值,如果我们不进行手动赋值则会默认为是有序的排列:1,2,3,4,5。。。
这种排序方式在加减运算的时候具有耦合性,会给多选枚举的使用带来不确定性;故:我们手动赋值的规律一般为2的n次幂,这样就
规避了运算过程中的耦合性;

你可能感兴趣的:(Unity,c#)