Unity扩展编辑器--类型3:Custom Editors
Custom Editors
加速游戏制作过程的关键是为哪些频繁使用的组件创建自定义的编辑器,为了举例,我们将会使用下面这个极其简单的脚本进行讲解,它的作用是始终保持一个对象注视某一点。
public class LookAtPoint : MonoBehaviour {
public Vector3 lookAtPoint = Vector3.zero;
void Update ()
{
transform.LookAt (lookAtPoint);
}
}
这个脚本会让一个对象保持面向世界空间中的某一点,让我们做的更酷一点!
第一步是让它在编辑器里面正常工作:即使你没有测试游戏,也能让这个脚本运行。我们对它添加ExecuteInEditMode属性来做这件事。
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour { public Vector3 lookAtPoint = Vector3.zero; void Update () {
transform.LookAt (lookAtPoint);
}
}
你可以把这个脚本加在main camera上,然后在Scene视图中拖拽相机测试一下。
Making a Custom Editor
测试发现工作正常表现良好,但我们可以为它定制一个编辑器使其更加nice。为了实现这个目的,我们需要为它创建一个编辑器,在名为"Editor"的文件夹里面创建一个LookAtPointEditor的C#脚本。
using UnityEngine;
using UnityEditor;
using System.Collections; [CustomEditor(typeof(LookAtPoint))]
public class LookAtPointEditor : Editor
{
public void OnInspectorGUI()
{
LookAtPoint lap = (LookAtPoint)target;
lap.lookAtPoint = EditorGUILayout.Vector3Field("Look At Point", lap.lookAtPoint);
if(GUI.changed)
EditorUtility.SetDirty(lap);
}
}
这个类必须继承Editor类。CustomEditor属性告知Unity哪个组件需要表现为编辑器
OnInspectorGUI方法中的代码,当Unity在Inspcetor中显示这个编辑器时执行。你可以在这里放入任何GUI代码--它的工作和游戏中的OnGUI方法类似,只不过它是在Inpector中执行,Editor定义了target属性,以便让你能够获得被检视的对象。
通过检查GUI.changed,如果发现用户修改了任何值,EditorUtility.SetDirty代码就会执行。其作用是将指定对象标记为脏。
[Unity内部使用dirty标记去确定资源什么时候被修改,并且需要被存盘。比如,你修改了一个prefab的MonoBehaviour或者ScriptableObject变量,你必须告诉Unity这个值被改变。Unity内置的组件,其内部在属性变化时自动调用SetDirty方法,而像MonoBehaviour或者ScriptableObject却不自动做这件事,所以如果你想让变化的值能够存储下来,你必须要调用SetDirty方法]
在这个例子中,我们创建了一个类似于Transform编辑器中的3维向量编辑框,如下图:

这儿还可以做更多更多,但是目前就此为止,我们还要去钓更大的鱼...^~^
Scene View Additions
你可以在你自定义的编辑器中实现OnSceneGUI方法来为Scene视图添加额外代码。在这个例子中,我们会添加第2个位置处理器,以便让用户可以在Scene视图中拖拽注视点。
using UnityEngine;
using UnityEditor;
using System.Collections; [CustomEditor(typeof(LookAtPoint))]
public class LookAtPointEditor : Editor
{
public void OnInspectorGUI()
{
LookAtPoint lap = (LookAtPoint)target;
lap.lookAtPoint = EditorGUILayout.Vector3Field("Look At Point", lap.lookAtPoint);
if(GUI.changed)
EditorUtility.SetDirty(lap);
} public void OnSceneGUI()
{
LookAtPoint lap = (LookAtPoint)target;
lap.lookAtPoint = Handles.PositionHandle (lap.lookAtPoint, Quaternion.identity);
if(GUI.changed)
EditorUtility.SetDirty(lap);
}//这个没看到什么效果,还没太懂
}
OnSceneGUI工作就像OnInspectorGUI方法--除了它是在Scene视图中运行。为了帮助你制作编辑接口,你可以使用Handles类中定义的方法。里面定义的所有方法都是为了在3D Scene
视图中工作设计的。
如果你想放置2D GUI对象(GUI,EditorGUI或者其它的),你需要将他们包装在Handles.BeginGUI()和Handles.EndGUI()中。
Unity扩展编辑器--类型3:Custom Editors的更多相关文章
- Unity扩展编辑器--类型1:Editor Windows
Extending the Editor Unity允许你使用自己定制的inspectors和Editor Windows扩展编辑器,并且你可以使用定制的Property Drawers定义属性集在i ...
- Unity 扩展编辑器
扩展Inspector界面 继承自Editor,添加CustomEditorAttribute,传入定制的类型 定制显示的类型要求: 类型中所有的public 字段都会自动暴露给Inspector编辑 ...
- Unity扩展编辑器学习笔记--从路径下找到拥有某个组件类型的预设
public static List<T> GetAssetsWithScript<T>(string path) where T:MonoBehaviour { T tmp; ...
- Unity扩展编辑器一
将Test1脚本挂在摄像机上 如图展示 下面我们需要在代码中动态的编辑它,请在你的Project视图中创建一个Editor文件夹,把MyEditor放进Editor文件夹中 在OnInsp ...
- Unity扩展编辑器五
扩展系统自带组件Inspector 可以在系统摄像机组建上添加一个按钮,这样就可以单独处理逻辑了
- Unity扩展编辑器四
Inspector视图中的get/set使用 get set使用起来很方便,但编辑时,在Inspector视图中问题就来了,因为get/set的属性即使是public了,但是在Inspector视图 ...
- Unity扩展编辑器三
Scene视图是编辑游戏模型的地方,其实它还可以进行编辑,如下图所示,我给Scene视图做了简单的编辑 Scene视图的扩展是基于对象的,意思是你必须在Hierarchy视图中选择一个对象才行,Hie ...
- Unity扩展编辑器二
Unity支持自行创建窗口,也支持自定义窗口布局,在Project视图中创建一个Editor文件夹,在文件夹中创建一条脚本 自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时 ...
- Unity基础-编辑器
编辑器 Special Folders Hidden Folder(start with .) Standard Assets:第一批加载的文件 Editor:只在编辑下才能使用, Plugins R ...
随机推荐
- 【最短路】血色先锋军(scarlet) 解题报告
问题来源 BYVoid魔兽世界模拟赛 [问题描述] 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭 ...
- MVC4中EasyUI Tree异步加载JSON数据生成树
1,首先构造tree接受的格式化数据结构MODEL /// <summary> /// 定义EasyUI树的相关数据,方便控制器生成Json数据进行传递 /// </summar ...
- 一些正则在js使用方法
输入框直接正则判断 <input type="password" name="pwd" placeholder="密码只能以数字\英文\@\.& ...
- GitLib
http://www.360doc.com/content/15/0603/14/21631240_475362133.shtml 原文 http://blog.csdn.net/williamwan ...
- 《JS原型》
@(JavaScript原型) JavaScript中最晦涩难懂的恐怕就是原型了.故以此笔记本来记录原型的学习过程,日后忘了可来温习. 一切皆为对象 null--Object&Function ...
- 3DS MAX 导出FBX到Unity3D设置
- Jupyter Notebook 对LaTeX 的支持
Jupyter的Markdown模式比我原来想想的更加强大:它支持LaTeX! 支持的特性不多,应该能满足一般的需求了.
- [转] boost::function用法详解
http://blog.csdn.net/benny5609/article/details/2324474 要开始使用 Boost.Function, 就要包含头文件 "boost/fun ...
- Java中Long与long的区别(转)
Java中Long与long的区别(转) [本文转载自:http://www.cnblogs.com/bluestorm/archive/2012/04/22/2464739.html] 转载请联系原 ...
- python 之路,Day11(上) - python mysql and ORM
python 之路,Day11 - python mysql and ORM 本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...