码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-28 13:12:47      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:unity3d   unity   unity编辑器扩展   

首先,我们现在的需求是这样的,我定义了一个脚本,里面有一个枚举,还有一个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);
	}
	
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:unity3d   unity   unity编辑器扩展   

原文地址:http://blog.csdn.net/sinat_20559947/article/details/47101113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!