首先,我们现在的需求是这样的,我定义了一个脚本,里面有一个枚举,还有一个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;
}
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()
{
}
}
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);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
讲解如何在Unity的Inspector面板实现类似摄像机层次遮罩的多选效果
原文地址:http://blog.csdn.net/sinat_20559947/article/details/47101113