Unity扩展编辑器--类型3:Custom Editors

摘要:
CustomEditors加速游戏制作过程的关键是为常用组件创建自定义编辑器。例如,我们将使用以下极其简单的脚本进行解释,该脚本用于使对象保持在某一点上。publicclassLookAtPoint:MonoBehavior{publicVector3lookAtPoint=Vector3.zero;voidUpdate(){transform.LookAt(look

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维向量编辑框,如下图:

Yay for shiny editors

这儿还可以做更多更多,但是目前就此为止,我们还要去钓更大的鱼...^~^

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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Phoenix】2、初始化 Phoenix 项目后的 目录结构GPU微观物理结构框架下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android开发笔记(二十一)——数据存储之SharedPreference轻量级数据存储

xml文件,K-V形式 SharedPreferences:读取数据 SharedPreferences.Editor:写入数据 代码示例: 在EditText中输入内容,点击保存,通过SharedPreferences来保存数据,点击显示按钮,把数据读取出来,显示在下面的TextView上。 SharedPreferencesActivity的jav...

Unity Kajiya Hair Shader Mod by Normals

Shader "HairShader" { Properties { _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _Color ("Main Color", Color) = (0,0,0,1) _SpecularTex ("Specular (R) Gloss (G) Anisotro...

Unity3D ZFBrowser (EmbeddedBrowser) 插件嵌入网页无法输入中文问题

  网页嵌入插件最好的应该就是ZFBrowser了, 可是使用起来也是问题多多, 现在最要命的是网页输入不能打中文, 作者也没打算接入IME, 只能自己想办法了...   搞了半天只想到一个办法, 就是通过Unity的IME去触发中文输入, 然后传入网页, 也就是说做一个透明的 InputField 盖住网页的输入文本框, 然后在 Update 或是 on...

Unity3D 物体移动方法总结

1. 简介     在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体     Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改...

一不注意,在Unity3D中DllImport 引起的Bug.

单要说这个Bug是很简单,但是得从头说起。  一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情。所以就需要用到动态加载,即AssetBundles。 引用自:http://bbs.9ria.com/thread-214663-1-1.html AssetBundle...

小程序使用 editor 富文本编辑器填坑指南

富文本编辑器文档:https://developers.weixin.qq.com/miniprogram/dev/component/editor.html 最近在做小程序上的富文本编辑器功能,发现几个隐藏点: 1. 小程序中的 editor 组件本质上是集成了 quill 编辑器:https://quilljs.com/,官方文档上也说明了,导出里面的...