下面代码主要实现的是类似camera中的Culling Mask。可多选标签。
首先创建一个我们自己的特性类,继承自PropertyAttribute:
public class MyAttribute : PropertyAttribute { }然后创建一个我们自己的属性绘制器,继承自PropertyDrawer,代码如下:
[CustomPropertyDrawer(typeof(MyAttribute))] public class MyPropertyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { property.intValue = EditorGUI.MaskField(position, label, property.intValue, property.enumNames); } }注意:MyPropertyDrawer 继承自GUIDrawer,属于编辑器的功能,所有我们要把此脚本放到Editor文件夹下。
我们声明一个我们需要的枚举类型来代表标签:
public enum ExclusionType { InfoPanel, OtherPanel, Other, LeftMenuPanel, } 我们在类中给我们声明的枚举类型打上标签,这样就可以实现我们的多选了。注意0代表所有选中,-1代表全部未选中 [MyAttribute][Header("面板类型,如果没有互斥 选择nothing 有互斥选择自己属于的面板类型 相同类型的面板互斥 面板可设置多类型")] public ExclusionType ExclusionType;以上就是多选标签的实现方法。
应用:本文实现这个主要是想要做面板互斥功能,而互斥的选择在面板动态设定。比如同为other标签的面板互斥。
互斥的代码如下:
public bool IsExclusion(int type) { return !((int)ExclusionType & type).Equals(0); }ExclusionType为自身面板的类型,type为其他面板类型。
我们设置自身面板为infopanel和OtherPanel时,对应的ExclusionType为0000 0011,与传进来的面板类型数据进行与计算,如果有相同位,则一定不为0,如果为0,则代表不为同一种类型面板。即不互斥。