【Unity】讲解如何在Unity的Inspector面板实现类似摄像机层次遮罩的多选效果

来源:互联网 发布:现在开淘宝店还挣钱吗 编辑:程序博客网 时间:2024/05/22 01:26

首先,我们现在的需求是这样的,我定义了一个脚本,里面有一个枚举,还有一个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("喜欢吃的水果")]的时候// "喜欢的水果"就是这个stringpublic 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);}}




1 0
原创粉丝点击