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的更多相关文章

  1. Unity扩展编辑器--类型1:Editor Windows

    Extending the Editor Unity允许你使用自己定制的inspectors和Editor Windows扩展编辑器,并且你可以使用定制的Property Drawers定义属性集在i ...

  2. Unity 扩展编辑器

    扩展Inspector界面 继承自Editor,添加CustomEditorAttribute,传入定制的类型 定制显示的类型要求: 类型中所有的public 字段都会自动暴露给Inspector编辑 ...

  3. Unity扩展编辑器学习笔记--从路径下找到拥有某个组件类型的预设

    public static List<T> GetAssetsWithScript<T>(string path) where T:MonoBehaviour { T tmp; ...

  4. Unity扩展编辑器一

    将Test1脚本挂在摄像机上 ​ 如图展示 ​ 下面我们需要在代码中动态的编辑它,请在你的Project视图中创建一个Editor文件夹,把MyEditor放进Editor文件夹中 ​ 在OnInsp ...

  5. Unity扩展编辑器五

    扩展系统自带组件Inspector ​ 可以在系统摄像机组建上添加一个按钮,这样就可以单独处理逻辑了 ​

  6. Unity扩展编辑器四

    Inspector视图中的get/set使用 get  set使用起来很方便,但编辑时,在Inspector视图中问题就来了,因为get/set的属性即使是public了,但是在Inspector视图 ...

  7. Unity扩展编辑器三

    Scene视图是编辑游戏模型的地方,其实它还可以进行编辑,如下图所示,我给Scene视图做了简单的编辑 Scene视图的扩展是基于对象的,意思是你必须在Hierarchy视图中选择一个对象才行,Hie ...

  8. Unity扩展编辑器二

    Unity支持自行创建窗口,也支持自定义窗口布局,在Project视图中创建一个Editor文件夹,在文件夹中创建一条脚本 自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时 ...

  9. Unity基础-编辑器

    编辑器 Special Folders Hidden Folder(start with .) Standard Assets:第一批加载的文件 Editor:只在编辑下才能使用, Plugins R ...

随机推荐

  1. 《University Calculus》-chaper13-多重积分-三重积分的引入

    承接之前对一重积分和二重积分的介绍,这里我们自然的引出三重积分. 在二重积分的引入中,我们曾经埋下过一个小伏笔,二重积分的几何意义是求解一个体积,但是我们仅仅限定在了曲顶柱体的几何体,那么对于完全由曲 ...

  2. 用过coreData或者sqlite吗?读写是分线程的吗?

    文/natewang(简书作者)原文链接:http://www.jianshu.com/p/cb8dc61b12fa著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 如果不是要求特别高, ...

  3. 用Myeclipse 编写struts.xml时,自动提示

    之所以不自动提示,是因为这个xml它不知道自己的xml格式是什么有哪些标签,所以不知道该怎么提示 所以就要给它引入格式,所以要引入XSD或者DTD文件 1.首先打开MyEclipse的窗口,选择“Wi ...

  4. redis学习心得之三-【java操作redis】

    今天主要是讲讲java对redis的操作,来段代码掩饰下基本操作即可明白. java调用你需要下载jedis.jar包 下载网址:https://github.com/xetorthio/jedis/ ...

  5. Hadoop入门--HDFS(单节点)配置和部署 (一)

    一 配置SSH 下载ssh服务端和客户端 sudo apt-get install openssh-server openssh-client 验证是否安装成功 ssh username@192.16 ...

  6. java.lang.NoClassDefFoundError: com/ibatis/sqlmap/engine/mapping/result/BasicResultMap

    错误日志: java.lang.NoClassDefFoundError: com/ibatis/sqlmap/engine/mapping/result/BasicResultMap     at ...

  7. java 类型转换:

    数值数据类型: 1.自动类型转换 byte->short ->int->long-->float--->double 范转小的类型向范围大的类型号转换,由系统自动完成   ...

  8. Ext入门的第一个程序(1)

    1.Ext是什么? extjs是集UI和ajax框架与一身的,界面又好看,又有很强的ajax交互功能,适合不会做漂亮页面的程序员用的,缺点就是太大了,要导入近800KB左右的js和css文件,这对于w ...

  9. HeaderViewListAdapter

    该类其实就是普通使用的Adapter的一个包装类,就是为了添加header和footer而定义的.该类一般不直接使用,当ListView有header和footer时,ListView中会自动把Ada ...

  10. Oracle 安装中遇到的问题

    第一次用甲骨文,这期待!虽然mySQL也是甲骨文的. 去官网下了Oracle G11 R2 X64,本人的电脑是64位的win7,没开防火墙. 按照网上众多的教程,做完安装,可是安装过程不是那么的顺利 ...