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 ...
随机推荐
- expresscalculate
//本程序接受任意含有+.-.*./和()的数值表达式,数值允许带小数,输入以#结束.如:((2.4+3.5)*2-(2+3.5)/2)*(2+3)# #include <stdio.h> ...
- [Locked] Factor combinations
Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...
- 《University Calculus》-chaper8-无穷序列和无穷级数-比值审敛法
在分析等比级数的过程中,我们发现对于q<1的等比级数是收敛的,它表示级数每一项与它前一项的比值小于1,我们能否将这种方法推广起来用于一般级数的审敛呢? 从极限的定义出发:
- 使用Java Mail发送邮件
本笔记参考自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17839983 JavaMail是SUN提供给开发人员在应用程序中实现 ...
- 《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式
设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建 ...
- linux下显卡信息的查看
lspci | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i vga01:00.0 VGA compat ...
- 第四篇:R语言数据可视化之折线图、堆积图、堆积面积图
折线图简介 折线图通常用来对两个连续变量的依存关系进行可视化,其中横轴很多时候是时间轴. 但横轴也不一定是连续型变量,可以是有序的离散型变量. 绘制基本折线图 本例选用如下测试数据集: 绘制方法是首先 ...
- Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twice
Eclipse项目中的混淆配置文件 复制到AS中 在混淆的过程中提示如下错误 Error:Execution failed for task ':app:proguardDemoRelease ...
- picasso_强大的Android图片下载缓存库
tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...
- Android运行时注解
Android的注解有编译时注解和运行时注解,本文就介绍下运行时注解. 其实非常简单,直接上代码:本文主要是替代传统的findViewById()的功能,就是在我们Activity中不需要再使用fin ...