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);// 创建一个滑动控制柄,可以沿某个方向滑动targetHandles.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 面板编辑器Chinar

    Chinar blog :www.chinar.xin 自定义Inspector 面板编辑器 本文提供全流程,中文翻译. Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 ...

  2. Unity检视面板重构(OnInspectorGUI重写)

    前言 使用GF框架时,有没有发现很神奇的情况,继承任何模块的辅助器基类脚本(Helper)都会被检视面板自动识别,这里以GF框架为例讲述一下如何做到自动识别脚本的. 1.自动识别脚本 不知道GF框架是 ...

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

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

  4. seaborn使用displot函数实现多面板直方图(Multi-panel)可视化:使用set_title函数自定义设置多面板直方图标题(Multi-panel histograms’ title)

    seaborn使用displot函数实现多面板直方图(Multi-panel)可视化:使用set_title函数自定义设置多面板直方图标题(Multi-panel histograms' title) ...

  5. seaborn使用axes_dict函数获取displot函数生成的图像所有标题信息、使用set_title函数自定义设置多面板直方图标题(Multi-panel histogram‘s title)

    seaborn使用axes_dict函数获取displot函数生成的图像所有标题信息.使用set_title函数自定义设置多面板直方图标题(Multi-panel histogram's title) ...

  6. Inspector检视视图

    检查器窗口 检查员在Unity中的默认位置 检查员在Unity中的默认位置 检查游戏对象 显示一个典型的游戏对象及其组件 显示一个典型的游戏对象及其组件 该督察是用来查看和编辑器中编辑游戏对象,资产, ...

  7. photoshop 快捷键_如何自定义Photoshop的面板,快捷方式和菜单

    photoshop 快捷键 One of the often overlooked features of Photoshop is the easily customizable GUI. If y ...

  8. Houdini 自定义节点参数面板 hou.ParmTemplate学习笔记

    hou.ParmTemplate 继承图 子类 hou.ButtonParmTemplate hou.ParmTemplate hou.DataParmTemplate hou.FloatParmTe ...

  9. 制作自定义的 Flash 面板组件

    Flash 有很多内置面板,调色面板.对齐面板.元件库面板等等. 有时为了工作方便,我们需要自己编写一些脚本加快处理一些重复性较大的工序,这里所说的"脚本"就是 JSFL. JSF ...

  10. Unity编辑器扩展 自定义脚本属性面板--基础篇

    开发中,如果使用插件会发现插件的组件,在属性面板上的设计非常方便,看着很高大上,他们是怎么做到的呢 基础 在Editor文件夹下,创建我们的属性面板编辑脚本 using UnityEditor的命名空 ...

最新文章

  1. 局部变量 final Java_Java局部变量final
  2. ios遍历模块的方式
  3. mysql中rpl_MySQL管理工具MySQL Utilities — mysqlrplcheck(44)
  4. Vue.js not detected 解决办法
  5. oracle错误27101,ORA-27101ORA-01034错误解决
  6. 素短语,最左素短语-编译原理
  7. C++:extern关键字
  8. 随机数的生成 java
  9. 2017.6.15 数字表格 思考记录
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生考勤管理系统
  11. 什么是GC Roots
  12. 百度怎么进行模糊搜索_怎么在百度上准确搜索,提高10倍效率?
  13. python 趋势线表达式_python添加趋势线
  14. 软件项目管理的基本概念
  15. RFC1867协议介绍
  16. IDEA中 Maven name group、artifact、package区别
  17. 文华软件登录显示请选择服务器,文华随身行 请先登入云服务器
  18. zxing二维码的使用
  19. UsbDeviceManager.java
  20. 周赛 Newstar 解题

热门文章

  1. 15-07-22 数据库--存储过程、触发器
  2. hibernate Restrictions用法
  3. C++ cin, cin.get, cin.getline. (iostream, std)
  4. Maxtocode 2.0 试用版发布
  5. 如何利用Chrome工具进行前端js调试
  6. 提高页面渲染速度的建议以及方案
  7. 欧拉工程第60题:Prime pair sets
  8. 安卓程序代写 网上程序代写[原]Android开发技巧--ListView
  9. 使用ConfigurationManager来写自己的配置文件
  10. 深度梯度压缩:减小分布式训练的通信带宽