UNITY3D拓展编辑器 - InspectorEditor(属性编辑器)1

前文:

本章节会对InspectorEditor(属性编辑器)的创建方式进行叙述.

正文:

1.代码最终效果

2. 架构阐述

一个InspectorEditor(属性编辑器)产生直接对应着一个继承MonoBehaviour的脚本文件,脚本文件中定义着不同的属性以供InspectorEditor(属性编辑器)去实现。我们可以通过EditorGUILayout/GUILayout来实现InspectorEditor(属性编辑器)界面。

3. EditorGUILayout脚本分析

EditorGUILayout 是绘制InspectorEditor(属性编辑器)的脚本类,脚本内部方法大致分为两类,一类是:手动布局,另外一类是:组件绘制。

4. 开始实现切入正题

4.1 大家都知道拓展器的脚本都需要放置在Editor文件下进行预编译,所以我们也为自己的项目创建一个Editor目录。额外在创建一个Script目录存储脚本文件。

4.2 在Script文件下创建继承自MonoBehaviour的脚本类,维护自定义编辑器属性.有人会问这个类到底用来干什么的,以当下的理解来讲,用于存储编辑器数据用的.下面将我创建的代码贴到下面以供大家参考。

using UnityEngine;using System.Collections;public enum VirtualRoomColor{    Black,    Blue,    Clear,    Cyan,    Gray,    Green,    Magenta,    Red,    White,    Yellow}public enum VirtualRoomAudioEffect{    Custom,    Default,    Cathedral,    Office,    Outside}public enum VirtualRoomMaterial{    Custom,    AcousticTile,    AcrylicGlass,    Air,    Asbestos,    BrickWall,    Dirt,    ExpandedPolystyrene,    Fiberboard,    Fiberglass,    Glass,    GlazedTile,    Grass,    Gravel,    Hardwood,    HeavyCarpet,    HeavyCurtain,    LeatherUpholstery,    Linoleum,    Marble,    MineralWool,    OfficeCarpet,    PaintedWood,    Plaster,    PolishedWood,    Polycarbonate,    PolyurethaneFoam,    RoughConcrete,    Rubber,    Sand,    SealedConcrete,    Tapestry,    Vinyl}public class VirtualRoomStruct{    private VirtualRoomMaterial m_RoomMaterial;    private float m_Vale;    public VirtualRoomMaterial RoomMaterial    {        get        {            return m_RoomMaterial;        }        set        {            m_RoomMaterial = value;        }    }    public float Vale    {        get        {            return m_Vale;        }        set        {            m_Vale = value;        }    }}public enum VirtualRoomWallDirection{    Left,    Right,    Back,    Front,    Ceiling,    Floor}public class SR3DVirtualRoom : MonoBehaviour{    private Vector3 m_RoomSize = new Vector3(100f, 40f, 50f);    private VirtualRoomColor m_RoomColor = VirtualRoomColor.White;    private VirtualRoomAudioEffect m_RoomEffect = VirtualRoomAudioEffect.Default;    private VirtualRoomStruct m_LeftWall = new VirtualRoomStruct();    private VirtualRoomStruct m_RightWall = new VirtualRoomStruct();    private VirtualRoomStruct m_FrontWall = new VirtualRoomStruct();    private VirtualRoomStruct m_BackWall = new VirtualRoomStruct();    private VirtualRoomStruct m_Ceiling = new VirtualRoomStruct();    private VirtualRoomStruct m_Floor = new VirtualRoomStruct();    private const float m_Interval = 3f;    public Vector3 RoomSize    {        get { return m_RoomSize; }        set { m_RoomSize = value; }    }    public VirtualRoomColor RoomColor    {        get { return m_RoomColor; }        set { m_RoomColor = value; }    }    public VirtualRoomAudioEffect RoomEffect    {        get { return m_RoomEffect; }        set { m_RoomEffect = value; }    }    public VirtualRoomStruct LeftWall    {        get { return m_LeftWall; }        set { m_LeftWall = value; }    }    public VirtualRoomStruct RightWall    {        get { return m_RightWall; }        set { m_RightWall = value; }    }    public VirtualRoomStruct FrontWall    {        get { return m_FrontWall; }        set { m_FrontWall = value; }    }    public VirtualRoomStruct BackWall    {        get { return m_BackWall; }        set { m_BackWall = value; }    }    public VirtualRoomStruct Ceiling    {        get { return m_Ceiling; }        set { m_Ceiling = value; }    }    public VirtualRoomStruct Floor    {        get { return m_Floor; }        set { m_Floor = value; }    }}

4.3 在Editor目录创建我们的InspectorEditor(属性编辑器)脚本文件,并放入以下代码.(具体代码含义见注释)

using System;using UnityEngine;using UnityEditor;using System.Collections;// 第1步:对SR3DVirtualRoom脚本进行编辑器重定义[CustomEditor(typeof(SR3DVirtualRoom))]public class SR3DGUIVirtualRoom : Editor{    private bool m_GroupState = true;         // 第2步:重写拓展编辑器方法    public override void OnInspectorGUI()    {        // 第3步:获取到对应实例        SR3DVirtualRoom room = target as SR3DVirtualRoom;                // 定义一个垂直自动排序的布局        EditorGUILayout.BeginVertical();                        // 添加空格行            EditorGUILayout.Space();            // 添加一个Label标签            EditorGUILayout.LabelField("Room Name", "VirtualRoom");            EditorGUILayout.Space();            // 添加一个Vector3类型的数据,用户编辑玩的数据将转存到我们的SR3DVirtualRoom属性中            room.RoomSize = EditorGUILayout.Vector3Field("Room Size", room.RoomSize);            EditorGUILayout.Space();            // 添加一个枚举类型的数据显示            room.RoomColor = (VirtualRoomColor)EditorGUILayout.EnumPopup("Room Color", room.RoomColor);            EditorGUILayout.Space();            room.RoomEffect = (VirtualRoomAudioEffect) EditorGUILayout.EnumPopup("Room Audio Effect", room.RoomEffect);        EditorGUILayout.EndVertical();        // 密度、反射设置        EditorGUILayout.Space();        // 添加可折叠标签        m_GroupState = EditorGUILayout.Foldout(m_GroupState, "Virtual Room Struct");        if (m_GroupState)        {            if (Selection.activeTransform)            {                EditorGUILayout.BeginVertical();                    EditorGUILayout.Space();                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.PrefixLabel("       Left Wall");                    room.LeftWall.RoomMaterial = (VirtualRoomMaterial)EditorGUILayout.EnumPopup(room.LeftWall.RoomMaterial);                    room.LeftWall.Vale = EditorGUILayout.Slider(room.LeftWall.Vale, 0, 1);                    EditorGUILayout.EndHorizontal();                    EditorGUILayout.Space();                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.PrefixLabel("       Right Wall");                    room.RightWall.RoomMaterial = (VirtualRoomMaterial)EditorGUILayout.EnumPopup(room.RightWall.RoomMaterial);                    room.RightWall.Vale = EditorGUILayout.Slider(room.RightWall.Vale, 0, 1);                    EditorGUILayout.EndHorizontal();                    EditorGUILayout.Space();                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.PrefixLabel("       Front Wall");                    room.FrontWall.RoomMaterial = (VirtualRoomMaterial)EditorGUILayout.EnumPopup(room.FrontWall.RoomMaterial);                    room.FrontWall.Vale = EditorGUILayout.Slider(room.FrontWall.Vale, 0, 1);                    EditorGUILayout.EndHorizontal();                    EditorGUILayout.Space();                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.PrefixLabel("       Back Wall");                    room.BackWall.RoomMaterial = (VirtualRoomMaterial)EditorGUILayout.EnumPopup(room.BackWall.RoomMaterial);                    room.BackWall.Vale = EditorGUILayout.Slider(room.BackWall.Vale, 0, 1);                    EditorGUILayout.EndHorizontal();                    EditorGUILayout.Space();                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.PrefixLabel("       Ceiling");                    room.Ceiling.RoomMaterial = (VirtualRoomMaterial)EditorGUILayout.EnumPopup(room.Ceiling.RoomMaterial);                    room.Ceiling.Vale = EditorGUILayout.Slider(room.Ceiling.Vale, 0, 1);                    EditorGUILayout.EndHorizontal();                    EditorGUILayout.Space();                    EditorGUILayout.BeginHorizontal();                    EditorGUILayout.PrefixLabel("       Floor");                    room.Floor.RoomMaterial = (VirtualRoomMaterial)EditorGUILayout.EnumPopup(room.Floor.RoomMaterial);                    room.Floor.Vale = EditorGUILayout.Slider(room.Floor.Vale, 0, 1);                    EditorGUILayout.EndHorizontal();                EditorGUILayout.EndVertical();            }        }                if (!Selection.activeTransform)        {            m_GroupState = false;        }    }}

4.4 思路整理

所有的编辑器都可以根据以下思路进行编写,完成代码后返回UNITY3D编辑器重新加载编译后,将脚本挂载到游戏对象中则显示出自定义编辑器内容,下一篇则对序列属性进行讲解,序列化属性是一种更简单的编辑器编写方式,但也要结合当前基础来编写才会更高效!

时间: 2024-10-10 21:35:57

UNITY3D拓展编辑器 - InspectorEditor(属性编辑器)1的相关文章

属性编辑器,即PropertyEditor-->Spring IoC

在Spring配置文件里,我们往往通过字面值为Bean各种类型的属性提供设置值:不管是double类型还是int类型,在配置文件中都对应字符串类型的字面值.BeanWrapper填充Bean属性时如何将这个字面值转换为对应的double或int等内部类型呢?我们可以隐约地感觉到一定有一个转换器在其中起作用,这个转换器就是属性编辑器. “属性编辑器”这个名字可能会让人误以为是一个带用户界面的输入器,其实属性编辑器不一定非得有用户界面,任何实现java.beans.PropertyEditor接口的

UNITY3D拓展编辑器 - 目录

前文: 最近在自学UNITY3D拓展器,对以上功能点做一些认知范围内的总结. 目录: 1. 属性编辑器 http://weizeteng.blog.51cto.com/5604545/1774431 2. 工具编辑器 3. 场景编辑器

Unity3D引擎扩展中的编辑器定制方法

http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速地以完全集成的方法来构建这些内容并极大地提升开发速度. 目前有大量复杂的软件包提供以基本Unity功能套件为基础的复杂工具,从视觉脚本编辑器到编辑器内导航网格生成.但是,有关如何自行构建此类事物的程序说明却很少.我将在下文列举某些在自己的工作中总结的编辑器定制相关信息. Unity-Window(f

SpringMVC类型转换器、属性编辑器

对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器.类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet,卸下请求中的数据 DisptacherServlet将请求中的数据发送给Controller 获取Controller需要接收的参数类型,将参数类型和请求数据发送给DataBinder DataBinder将参数类型和请求数据再发给TypeConverter,由Ty

Spring常用属性的注入及属性编辑器

对于对象的注入,我们使用ref方式,可以指定注入的对象,下面看下对于基本类型的注入,以及当spring无法转换基本类型进行注入时,如何编写一个类似转换器的东西来完成注入. 一,基本类型的注入 下面写一个简单类,来看下spring中对于基本类型的注入: <bean id="bean1" class="com.shuitian.spring.Bean1"> <!-- <property name="strValue" valu

(spring-第12回【IoC基础篇】)JavaBean的属性编辑器

在spring实例化bean的最后阶段,spring利用属性编辑器将配置文件中的文本配置值转换为bean属性的对应值,例如: 代码0011 <bean id="car" class="com.mesopotamia.test1.Car" 2 p:name="汽车" 3 p:brand="宝马" 4 p:maxSpeed="200"/> 上面是文本配置, 再看bean: 代码0021 public

(spring-第13回【IoC基础篇】)PropertyEditor(属性编辑器)--实例化Bean的第五大利器

上一篇讲到JavaBeans的属性编辑器,编写自己的属性编辑器,需要继承PropertyEditorSupport,编写自己的BeanInfo,需要继承SimpleBeanInfo,然后在BeanInfo中把特定的属性编辑器和需要编辑的属性绑定起来(详情请查看上一篇). Spring的属性编辑器仅负责将配置文件中的字面值转换成Bean属性的对应值.(而JavaBean的属性编辑器能够通过界面来手动设置bean属性的值).如果属性的类型不同,转换的方法就不同.正如javabean的属性编辑器一样,

smvc配置属性编辑器:

1 配置属性编辑器: 2 在springmvc.xml中配置: 3 4 <!-- 注解驱动 --> 5 <mvc:annotation-driven conversion-service="conversionService"> 6 7 </mvc:annotation-driven> 8 9 <!-- 自定义注册属性编辑器 --> 10 <bean id="conversionService" 11 class

用mel编写自定义节点的属性编辑器界面

用mel编写自定义节点的属性编辑器界面比较麻烦,而且网上例子又少,下面给出一个范例,说明基本的格式 // 初始化节点时调用 global proc initControl(string $attrName) { // 传进来的参数是节点属性名,使用这个方法获得节点名称 string $nodeName = `plugNode $attrName`; setUITemplate -pst "attributeEditorTemplate"; button -label "Com