首先,我们现在的需求是这样的,我定义了一个脚本,里面有一个枚举,还有一个Public的枚举类型变量,现在我们就可以在Unity的工程里的Inspector面板中通过手动的选择来控制这个枚举变量到底选择什么了,就像我们Unity中的摄像机自带的那种可以选择遮罩层次的感觉,但是现在的问题是,我们只能选择一个,并不能多选,现在我们要解决的就是,给这个枚举变量写一段让它可以多选的代码。
效果图如下:
这里的变量名我改成了自定义的中文,其实在代码中大家可以根据自己的需求更改
和上一篇一样,我先说一下这个工程里一共有3个脚本,分别是:
(1)EnumFlagsExample.cs
(2)EnumFlagsAttribute.cs
(3)EnumFlagsAttributeDrawer.cs
——————————————————————————————————————————————————————————————————————————
脚本(1)EnumFlagsExample.cs我们是吧它挂载到了主摄像机的身上
(2)EnumFlagsAttribute.cs(3)EnumFlagsAttributeDrawer.cs哪里都没有挂载,他们两个是对[EnumFlagsAttribute("喜欢吃的水果")]功能的编写
——————————————————————————————————————————————————————————————————————————
(1)EnumFlagsExample.cs
using UnityEngine; using System.Collections; /// <summary> /// 脚本位置:主摄像机 /// 脚本功能:实现类似摄像机层次遮罩的多选效果 /// 创建时间:2015.07.26 /// </summary> public class EnumFlagsExample : MonoBehaviour { // 定义一个枚举 public enum fruit { apple, pineapple, cherry } // 使用我们自己自定义的一个特性 [EnumFlagsAttribute("喜欢吃的水果")] // 这样在面板中就可以通过选择的方式来操作了 public fruit likeFruit; }
(2)EnumFlagsAttribute.cs
using UnityEngine; using System.Collections; /// <summary> /// 脚本位置:要求放在Editor文件夹下,其实不放也可以运行 /// 脚本功能:实现一个在Inspector面板中可以用滑动条来控制变量的大小 /// 创建事件:2015.07.26 /// </summary> public class EnumFlagsAttribute : PropertyAttribute { // 当脚本(1)使用[EnumFlagsAttribute("喜欢吃的水果")]的时候 // "喜欢的水果"就是这个string public string heatFoods; // 一个参数类型的[EnumFlagsAttribute("string")] public EnumFlagsAttribute(string label) { heatFoods = label; } // 如果需要一个没有参数的类型,可以使用重载 public EnumFlagsAttribute() { } }
(3)EnumFlagsAttributeDrawer.cs
using UnityEngine; using System.Collections; // 引入Editor命名空间 using UnityEditor; // 使用绘制器,如果使用了[EnumFlagsAttribute]的这种自定义特性 // 就执行下面代码对EnumFlagsAttribute进行补充 [CustomPropertyDrawer(typeof(EnumFlagsAttribute))] public class EnumFlagsAttributeDrawer : PropertyDrawer { public override void OnGUI(Rect _position, SerializedProperty _property, GUIContent _lable) { // attribute 是PropertyAttribute类中的一个属性 // EnumFlagsAttribute中的所有属性都可以调用 EnumFlagsAttribute flags = attribute as EnumFlagsAttribute; // 枚举值的数值最后为一个数字,如果要取得其代表的或包含的数值必须通过按位运算来提取 // 绘制出一个下拉菜单,枚举类型 _property.intValue = EditorGUI.MaskField(_position, flags.heatFoods, _property.intValue, _property.enumDisplayNames); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 11:20:45