自定义Inspector检视面板
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检视面板的更多相关文章
- Unity 自定义Inspector面板时的数据持久化问题
自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...
- Unity检视面板的继承方法研究 (二)
之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢? 万变不离其宗, 仍然是围绕UnityEditor.Editor.CreateEditor 这 ...
- Unity检视面板的继承方法研究 (一)
对于检视面板 Inspector 的面板继承方式对项目来说是很有必要的, 比如一个基类, 写了一个很好看的检视面板[CustomEditor(typeof(XXX))], 可是所有子类的面板无法直接继 ...
- unity3d编辑器——检视面板部分(一)
最近在学习unity编辑器,so,记录总结一下. 以下介绍了一些简单的unity3d检视面板部分的使用技巧. using UnityEngine; using System.Collections; ...
- Android自定义系统分享面板
在Android中实现分享有一种比较方便的方式,调用系统的分享面板来分享我们的应用.最基本的实现如下: public Intent getShareIntent(){ Intent intent = ...
- U3D自定义Inspector项未触发保存事件的解决方案
1.问题描述与解决方案 1.1.说明 应该只有起步做U3D编辑器插件的部分同行需要了解本文. 该问题源于在做UI插件的时候,发现Inspector面板上手动修改值后,没有触发U3D编辑器本身的修改事件 ...
- Unity获取脚本的CustomEditor(自定义编辑)数据
在此之前,粗略的介绍下 CustomEditor(自定义编辑). Unity对于我们创建的Mono脚本提供了属性面板的展示和修改.默认情况下,Inspector面板中会显示当前脚本类的公开字段(pub ...
- Unity3D用户手册
Unity Manual 用户手册 Welcome to Unity. 欢迎使用Unity. Unity is made to empower users to create the best int ...
- Unity 5.6 beta版本新特性
http://manew.com/thread-98549-1-1.html 最新发布的beta版改进了编辑器和2D功能,图形性能更佳,加入新的视频播放器,并添加了对Facebook Gameroom ...
随机推荐
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...
- PHP实现RTX发送消息提醒
RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...
- JavaWeb——Filter
一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- TechEmpower 13轮测试中的ASP.NET Core性能测试
应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- 一个诡异的COOKIE问题
今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...
- MongoDB系列(一):简介及安装
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...