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

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

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

一键展开关闭unity的 Inspector面板上的所有组件

孙广东  2015.12.11 using UnityEngine; using System.Collections.Generic; using System.Collections; using UnityEditor; using System.Reflection; using System; /// <summary> /// 描述:全部 展开/收起 Inspector面板的所有组件. /// author: 孙广东 /// todo 还可以深度定制,添加两个按钮切换 /// &l

unity中可以使一个私有的变量在Inspector面板中显示出来 和 SerializeField的使用

[HideInInspector] 可以使一个公有的变量在Inspector面板中隐藏起来 [SerializeField] 可以使一个私有的变量在Inspector面板中显示出来

Unity定制,将属性暴露在Inspector面板上

孙广东   2015.7.12 Unity的很多编辑器功能都是通过特性Attribute实现. 那么我们要自己扩展Inspector也是要自己写Attribute. 先说说为什么要这样做? 为了编写面向对象程序,封装特性 更优雅.下面的脚本使 属性 (即有 getter/setter 的成员) 的内容可以在Unity的Inspector上显示.这样就可以保密类的 字段,并限制所有的外部访问,只能通过 属性 访问, 看看代码吧! using System; [AttributeUsage(Attr

[译]如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的. 这篇教程假设你已经熟悉Unity的基本工作流程.如果你知道如何在编辑器中创建物体.预设.场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了. 最终结果预览 让我们看一下我们做出的最终结果是什么样子: 如你所见,我们会创建一个编辑

Unity3d Inspector面板实现set/get访问器

     简单说一下属性和字段的区别:字段就是成员变量,而属性确实提供给外部访问内部成员变量的接口.之所以会有属性的出现,就是为了避免外部对类的成员的直接访问,通俗的说就是OOP中的封装思想. using UnityEngine; using System.Collections; public class DemoTest : MonoBehaviour { private int _score; public int Score { get { return _score; } set {

Unity3D之如何扩展脚本的Inspector面板

关于扩展编辑器 Unity给我们提供了很好的可视化编程环境,但对于我们有些更懒蛋的程序猿来说,还不够方便.所以Unity也给我们提供了很友好的扩展方式. 今天来说一下如何自定义一个脚本的inspector面板. unity中所有编辑器相关的脚本,都放在Editor文件夹,所以建一个先. 假设有个脚本ABC.cs 我们想自定义它的Inspector面板. 现在上代码: // 要自定义的脚本 public class ABC : Monobehaviour{ public bool a; publi

拓展编辑器(二十)_面板拓展(Inspector面板

我们的Unity脚本挂在游戏对象上时,右侧会出现它的详细信息面板,这些信息是根据脚本中声明的public可序列化变量而来的.此外,也可以通过EditorGUI来对它进行绘制,让面板更具可操作性. Inspector面板: EditorGUI和GUI的用法几乎完全一致,目前来说前者多用于编辑器开发,后者多用于发布后调试编辑器.即他们都是起辅助作用的.EditorGUI提供丰富的组件非常丰富,常用的绘制元素包括文本,按钮,图片和滑动框等.做一个好的编辑器,是离不开EditorGUI的. 如图所示,我

从算法入手讲解如何在SQL Server中实现最优最简

算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键.在计算机世界中,算法无处不在.数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储.查询.统计.以解决现实世界中的问题已经是屡见不鲜.随着数据量的大幅度增加和业务规则的日益复杂,越来越需要一种专门的方法来满足效率和准确性方面的要求.如何把解决问题的复杂算法转换为数据库能够执行的命令,也是数据库应用技术研究的一个方面.本文以MSSQL中的命令来阐述例子. 数据库中可以存储实体的数据集合,在进行运算时,数据库

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android