Unity中的Inspector面板可以显示的属性包括以下两类:
(1)C#以及Unity提供的基础类型;
(2)自定义类型,并使用[System.Serializable]关键字序列化,比如:
[System.Serializable]
public class TestClass
{
public Vector3 vec = Vector3.zero;
public Color clr = Color.green;
}

  也可以使用[System.NonSerialized]标记不需要显示的属性,比如:

public class TestClass
{
[System.NonSerialized]
public Vector3 vec = Vector3.zero;
}

  有的时候对于U3D默认的Inspector不能满足需求,则可以对特定类型的Inspector面板进行自定义:编写一个对应的Editor类,然后重写其OnInspector方法,比如我们有如下类型:

using UnityEngine;
using System.Collections; [System.Serializable]
public class TestClass
{
public Vector3 vec = Vector3.zero;
[System.NonSerialized]
public Color clr = Color.green;
} [ExecuteInEditMode()]
[RequireComponent(typeof(TestComponent))]
public class TestInspector : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
public Vector3 pos = Vector3.zero;
public TestClass testObj = new TestClass(); void Update()
{
transform.LookAt(lookAtPoint);
transform.position = pos;
}
}

  然后在Editor目录下添加如下脚本:

using UnityEngine;
using UnityEditor;
using System.Collections; [CustomEditor(typeof(TestInspector))]
public class TestInspectorEditor : Editor
{
private SerializedObject obj;
private SerializedProperty lookAtPoint;
private SerializedProperty pos;
private SerializedProperty testObj; // 添加TestInspector组件的GameObject被选中时触发该函数
void OnEnable()
{
obj = new SerializedObject(target);
lookAtPoint = obj.FindProperty("lookAtPoint");
pos = obj.FindProperty("pos");
testObj = obj.FindProperty("testObj");
} // 重写Inspector检视面板
public override void OnInspectorGUI()
{
obj.Update(); EditorGUILayout.PropertyField(lookAtPoint);
EditorGUILayout.PropertyField(pos);
EditorGUILayout.PropertyField(testObj, true); // 第二个参数表示有子节点需要显示 obj.ApplyModifiedProperties();
} }

  在OnInspector函数中就可以实现你想要的效果。

  上面的代码中有几点需要注意:

  (1)[ExecuteInEditMode()]这个函数可以使代码在编辑模式下运行,不需要运行游戏;

  (2)TestInspectorEditor类必须继承自Editor,CustomEditor告诉U3D哪个组建类型需要自定义,OnInspectorGUI在显示组件的Inspector面板时调用;

  (3)SerializedObject序列化物体、SerializedProperty序列化属性和Editor这三者一起使用,用来访问和更新组件的属性,SeriailzedProperty能够以通用的方式访问所有的基础类型,包括对数组的控制等;

  (4)可以在OnInspectorGUI中调用DrawDefaultInspector函数用来显示默认的监事面板内容;

  (5)EditorGUILayout.PropertyField(testObj, true);如果该类型有子节点,第二个参数需要设置为true才能正确的展开;

   (6)[HideInInspector]也可用于隐藏属性显示。

******************************************************************************************

  除了自定义Inspector检视面板,我们还可以类似的方法自定义场景视图中对物体的控制,方法是重定义Editor的OnSceneGUI()函数,比如:

using UnityEngine;
using UnityEditor;
using System.Collections; [CustomEditor(typeof(TestInspector))]
public class TestInspectorEditor : Editor
{ private SerializedObject obj;
private SerializedProperty lookAtPoint;
private SerializedProperty pos;
private SerializedProperty testObj; // 添加TestInspector组件的GameObject被选中时触发该函数
void OnEnable()
{
obj = new SerializedObject(target);
lookAtPoint = obj.FindProperty("lookAtPoint");
pos = obj.FindProperty("pos");
testObj = obj.FindProperty("testObj");
} // 重写Inspector检视面板
public override void OnInspectorGUI()
{
obj.Update(); EditorGUILayout.PropertyField(lookAtPoint);
EditorGUILayout.PropertyField(pos);
EditorGUILayout.PropertyField(testObj, true); // 第二个参数表示有子节点需要显示 obj.ApplyModifiedProperties();
} void OnSceneGUI()
{
// 绘制一条由target到世界坐标原点的直线,颜色为黄色
Handles.color = Color.yellow;
Handles.DrawLine((target as TestInspector).transform.position, Vector3.zero);
// 创建一个位置控制柄
Handles.PositionHandle(Vector3.zero, Quaternion.identity);
// 创建一个滑动控制柄,可以沿某个方向滑动target
Handles.Slider((target as TestInspector).transform.position, Vector3.zero); (target as TestInspector).transform.position = Handles.FreeMoveHandle((target as TestInspector).transform.position, Quaternion.identity, 2.0f, Vector3.zero, Handles.DrawRectangle); if (GUI.changed)
{
EditorUtility.SetDirty(target);
}
} }

  主要是使用Handles编辑器类来进行自定义,该类型提供了很多方便的操作接口,比如DrawLine、DrawCube、DrawBezier等。

  注意,不能在OnSceneGUI中使用SerializedObject。

  这篇帖子写得很不错:http://blog.csdn.net/lilanfei/article/details/7680802

自定义Inspector检视面板的更多相关文章

  1. Unity 自定义Inspector面板时的数据持久化问题

    自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...

  2. Unity检视面板的继承方法研究 (二)

    之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢? 万变不离其宗,  仍然是围绕UnityEditor.Editor.CreateEditor 这 ...

  3. Unity检视面板的继承方法研究 (一)

    对于检视面板 Inspector 的面板继承方式对项目来说是很有必要的, 比如一个基类, 写了一个很好看的检视面板[CustomEditor(typeof(XXX))], 可是所有子类的面板无法直接继 ...

  4. unity3d编辑器——检视面板部分(一)

    最近在学习unity编辑器,so,记录总结一下. 以下介绍了一些简单的unity3d检视面板部分的使用技巧. using UnityEngine; using System.Collections; ...

  5. Android自定义系统分享面板

    在Android中实现分享有一种比较方便的方式,调用系统的分享面板来分享我们的应用.最基本的实现如下: public Intent getShareIntent(){ Intent intent = ...

  6. U3D自定义Inspector项未触发保存事件的解决方案

    1.问题描述与解决方案 1.1.说明 应该只有起步做U3D编辑器插件的部分同行需要了解本文. 该问题源于在做UI插件的时候,发现Inspector面板上手动修改值后,没有触发U3D编辑器本身的修改事件 ...

  7. Unity获取脚本的CustomEditor(自定义编辑)数据

    在此之前,粗略的介绍下 CustomEditor(自定义编辑). Unity对于我们创建的Mono脚本提供了属性面板的展示和修改.默认情况下,Inspector面板中会显示当前脚本类的公开字段(pub ...

  8. Unity3D用户手册

    Unity Manual 用户手册 Welcome to Unity. 欢迎使用Unity. Unity is made to empower users to create the best int ...

  9. Unity 5.6 beta版本新特性

    http://manew.com/thread-98549-1-1.html 最新发布的beta版改进了编辑器和2D功能,图形性能更佳,加入新的视频播放器,并添加了对Facebook Gameroom ...

随机推荐

  1. Azkaban源码学习笔记

    1. ConnectorParams (interface): 定义了各种常量参数,没有声明任何方法. 2. ExecutorServlet.java类   2.1 继承类HttpServlet和接口 ...

  2. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  3. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  4. MyEclipse生成注册码

    今天正在使用的MyEclipse出现了使用过期,在网上发现一个可以生成注册码的程序,现在分享给各位. /** * myEclipse生成注册码 * 点击顶部:MyEclipse --> subs ...

  5. MVC通过路由实现URL重写

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Ro ...

  6. C#与C++通信

    # C#与C++相互发送消息 # ## C#端: ## namespace CshapMessage { /// /// MainWindow.xaml 的交互逻辑 /// public partia ...

  7. ios 获取或修改网页上的内容

    UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌     入页面中,通过这个方法我们可 ...

  8. 在 Windows7 上按照 MySQL5.7

    在 Windows7 上按照 MySQL5.7 1.从官网下载最新版本的 MySQL,这里下载的是 mysql-5.7.17-win32: 2.将下载的 mysql-5.7.17-win32.zip ...

  9. 修改MySQL默认字符集编码

    好记心不如烂笔头,很多东西当时没记下来,过了就忘了,下次用到时又得浪费好多时间才能解决.今天又遇到修改MySQL默认字符集编码的问题,折腾了半天解决了,赶快记录下来,以后就不用每次折腾了. 查看MyS ...

  10. mono for android学习过程系列教程(3)

    服务 接着上一讲的内容,咱们继续来唠叨概念性的东西.服务,内容提供器,广播接收器等理论知识. 首先是服务,它不是一个可视化的组件或者视图.他是由我们开发人员来定义,可以一直一直运行 的工作单元.跟活动 ...