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()中。

时间: 2024-10-03 10:50:10

Unity扩展编辑器--类型3:Custom Editors的相关文章

Unity 扩展编辑器

扩展Inspector界面 继承自Editor,添加CustomEditorAttribute,传入定制的类型 定制显示的类型要求: 类型中所有的public 字段都会自动暴露给Inspector编辑器 类型中非public 字段,可通过使用SerializeFieldAttribute来暴露给Inspector 使用HideInspectorAttribute可隐藏字段 Unity消息接口: private void OnEnable(); private void OnDisable();

Unity扩展编辑器1:Editor Windows

Extending the Editor Unity允许你使用自己定制的inspectors和Editor Windows扩展编辑器,并且你可以使用定制的Property Drawers定义属性集在inspector中如何展示,这一块讲述如何使用这些特性. Editor Windows 你可以在你的app中创建任意数量的定制窗口.它们的表现就像Inspector,Scene或者其它内置的窗口.这是给你的游戏添加一个子系统用户接口的绝佳方式.[比如地图编辑器] 做一个自定义的Editor Wind

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

5 public static List<T> GetAssetsWithScript<T>(string path) where T:MonoBehaviour 6 { 7 T tmp; 8 string assetPath; 9 GameObject asset; 10 List<T> assetList = new List<T> (); 11 string[] guids = AssetDatabase.FindAssets ("t:Pre

Unity扩展编辑器二

Unity支持自行创建窗口,也支持自定义窗口布局,在Project视图中创建一个Editor文件夹,在文件夹中创建一条脚本 自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时在Unity导航菜单栏中GameObject-window就可创建一个自定义窗口? EditorWindow.GetWindowRect()和EditorWindow.GetWindow()都可以创建一个窗口,前者可以规定窗口的区域,后者通过鼠标动态的延伸窗口.参数1表示窗口的对象,参数2表示窗口的

Unity扩展编辑器三

Scene视图是编辑游戏模型的地方,其实它还可以进行编辑,如下图所示,我给Scene视图做了简单的编辑 Scene视图的扩展是基于对象的,意思是你必须在Hierarchy视图中选择一个对象才行,Hierarchy视图中选择不同的对象可以有不同的Scene视图.图中我么创建了一个立方体对象,接着给它绑定了一个Test3的脚本 Test3 在Project视图中创建一个Editor文件夹,把MyEditor放进去 最后再说一下,在OnSceneGUI()中只能通过Handles绘制新视图,如果你想引

Unity扩展编辑器四

Inspector视图中的get/set使用 get  set使用起来很方便,但编辑时,在Inspector视图中问题就来了,因为get/set的属性即使是public了,但是在Inspector视图中依然不显示 我偏偏就像在编辑器应set的操作怎么办?我想做的是在set里面加一个自己写的方法 MyEditor4放在Editor目录下 ? Test4挂在任意游戏对象上 ? 如图所示,在编辑器模式下用鼠标修改width的值,log输出说明了get set已经响应了 ? 原文地址:https://w

Unity基础-编辑器

编辑器 Special Folders Hidden Folder(start with .) Standard Assets:第一批加载的文件 Editor:只在编辑下才能使用, Plugins Resources:原生资源 Editor Default Resources Gizmos:Gizmos资源 StreamingAssets:自定义资源 编辑器功能扩展-EditorWindow 自定义一个编辑器窗口界面 Unity的编辑器的UI操作都很难用,继承EditorWindow 在OnGU

有关UnrealEngine材质编辑器中的Custom节点的一些小贴士

PS:本文写于2017.2.1日,使用版本为4.13. 一.前言在Unreal中材质编辑器提供了Custom节点,作为HLSL代码编写接口.以此可以实现更多的效果.虽然使用Custom节点会有若干限制,但是相对的比较方便,适合快速开发.如果遇到限制而导致无法使用Custom解决,此时就需要使用虚幻的RHI(硬件渲染接口)配合USF文件(虚幻着色器文件)来实现,这些我以后可能会写一篇文章来解析吧,如果着急可以参考Wiki上的HLSL插件.(竟然还可以使用计算着色器感觉好屌),目前类似Unity的材

onethink在mysql下不能新建编辑器类型字段

clone最新的代码安装完毕,继承基础文档,新增detaildesc字段为编辑器类型,没有新建表.且sql语句有误 主要原因是  MYSQL5.x是不允许BLOB/TEXT类型的字段拥有默认值的,暂时修复代码为Admin/Controller/AttributeController.class.php protected function updateField($field){ //检查表是否存在 $table_exist = $this->checkTableExist($field['mo