自定义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 ...
随机推荐
- HTML5 介绍
本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...
- [APUE]标准IO库(下)
一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- C# 用SoapUI调试WCF服务接口(WCF中包含用户名密码的验证)
问题描述: 一般调试wcf程序可以直接建一个单元测试,直接调接口. 但是,这次,我还要测试在接口内的代码中看接收到的用户名密码是否正确,所以,单一的直接调用接口方法行不通, 然后就想办法通过soapU ...
- 28个你必须知道的HTML5的新特性,技巧以及技术
崭新新的页面布局 传统的: HTML5: 1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<f ...
- Git快速入门
如果你不想看长篇的Git教程,想快速了解Git的使用,那么本文可能会对你入门Git有所帮助.由于笔者用的是Windows系统,所以本文只写Git在Windows上的使用. 一.Git安装 去Git官网 ...
- i++、++i 、i--、--i
总结: i++ 先用后加, ++i先加后用: i--先用后减, --i先减后用: //int i = 1; //Console.WriteLine(i);//1 //Console.WriteLine ...
- 理解JavaScript中的“this”
对于javascript的初学者来说,一般对“this”关键字都感到非常迷惑.本文的目的旨在让你全面的了解“this”,理解在每一个情景下如何使用“this”,希望通过本文,可以帮助同学们不在害怕“t ...
- Storm构建分布式实时处理应用初探
最近利用闲暇时间,又重新研读了一下Storm.认真对比了一下Hadoop,前者更擅长的是,实时流式数据处理,后者更擅长的是基于HDFS,通过MapReduce方式的离线数据分析计算.对于Hadoop, ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...