分类:Unity、C#、VS2015

创建日期:2016-04-27

一、简介

可以通过编辑器窗口 (Editor Windows) 创建自己在 Unity 中的自定义设计工具。来自EditorWindow (而非 MonoBehaviour )的脚本可以影响 GUI/GUILayout 和 EditorGUI/EditorGUILayout 控件。或者,你可以使用自定义检视器 (Custom Inspectors) 显示游戏对象检视器 (GameObject Inspector) 中的 GUI 控件。

二、自定义编辑器窗口

你可以在应用程序中创建任意数量的自定义窗口。这些窗口和检视器 (Inspector)、场景 (Scene) 及其他内置窗口的作用相似。这非常适合用来为游戏的子系统添加用户界面。

制作一个自定义编辑窗口 (Editor Window) 包括以下几个步骤:

1. 创建一个来自 EditorWindow 的脚本。

2. 使用代码触发窗口自动显示。

3. 执行工具的 GUI 代码。

1、编辑器窗口 (EditorWindow)

为制作编辑器窗口,脚本必须存储在一个叫“Editor”的文件夹中。在这个源自编辑器窗口 (EditorWindow) 的脚本中编写一个类。然后,在内部 OnGUI 函数中编写 GUI 控件。

下面是JavaScript代码示例(当然也可以用C#实现):

class MyWindow extends EditorWindow {

function OnGUI () {

// 实际的窗口代码到这里

}

}

MyWindow.js文件放置于工程中名为“Editor” 的文件夹中。

2、显示窗口

为了在屏幕上显示窗口,需要制作一个用于显示的菜单项。这可以通过创建一个可由 菜单项 (MenuItem) 属性激活的函数来完成。

Unity 中的默认行为是重复使用窗口。所以,再次选择菜单项将显示现有的窗口。可以通过使用EditorWindow.GetWindow 函数实现,下面是JavaScript代码示例(当然你也可以改为用C#实现):

class MyWindow extends EditorWindow {

@MenuItem ("Window/My Window")

static function ShowWindow () {

EditorWindow.GetWindow (MyWindow);

}

function OnGUI () {

// 实际的窗口代码到这里

}

}

这样将创建一个标准的、可停靠的编辑器窗口,该窗口可以将其位置存储在调用之间,可以在自定义布局中使用……等等。如果需要更多地控制创建的窗口,你可以使用 GetWindowWithRect。

3、实施窗口的GUI

该窗口的实际内容通过执行 OnGUI 函数进行渲染。您可以使用游戏 GUI 中使用的 UnityGUI 类( GUI 和GUILayout)。除此之外,Unity还另外提供 了一些 GUI 控件,位于仅编辑器类EditorGUI 和EditorGUILayout中。这些类将添加到常规类中已经可用的控件上,所以你可以随意混合和匹配。

以下 C# 代码显示您如何能将 GUI 元素添加至您的自定义编辑器窗口:

using UnityEditor;
using UnityEngine;public class MyWindow : EditorWindow
{string myString = "Hello World";bool groupEnabled;bool myBool = true;float myFloat = 1.23f;// 将名为“My Window”的菜单项添加到窗口菜单[MenuItem("Window/My Window")]public static void ShowWindow(){//显示现有窗口实例(如果不存在,请先创建一个)EditorWindow.GetWindow(typeof(MyWindow));}void OnGUI(){GUILayout.Label ("Base Settings", EditorStyles.boldLabel);myString = EditorGUILayout.TextField ("Text Field", myString);groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);myBool = EditorGUILayout.Toggle ("Toggle", myBool);myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3);EditorGUILayout.EndToggleGroup ();}
}

这个示例产生如下所示的窗口:

三、自定义检视器

提高游戏创建速度的关键是为常用组件创建自定义检视器。为了方便举例,我们将使用一个非常简单的脚本,该脚本可以保持对象始终看着一个点。

下面是LookAtPoint.js示例:

var lookAtPoint = Vector3.zero;

function Update () {

transform.LookAt (lookAtPoint);

}

这将保持对象朝向世界坐标空间的一个点。让我们来让它变得酷点!

使编辑器良好运行的第一步是让脚本即使在您未进行游戏测试时也在运行。我们通过为其添加 ExecuteInEditMode 属性来实现:

@script ExecuteInEditMode()

var lookAtPoint = Vector3.zero;

function Update () {

transform.LookAt (lookAtPoint);

}

尝试将脚本添加至您的主相机并在“场景”(Scene) 视图中将其四处拖动。

1、制作一个自定义编辑器

这已经很好了,但是我们可以通过自定义检视器使其更加美观。为此,我们需要为它创建一个Editor 。

下面是在Editor文件夹中创建的一个叫做 LookAtPointEditor的JavaScript文件:

@CustomEditor (LookAtPoint)

class LookAtPointEditor extends Editor {

function OnInspectorGUI () {

target.lookAtPoint = EditorGUILayout.Vector3Field ("Look At Point", target.lookAtPoint);

if (GUI.changed)

EditorUtility.SetDirty (target);

}

}

注意该类必须继承自Editor。其中,@CustomEditor 属性报告 Unity 它将作为哪个组件的编辑器。

每当 Unity 显示检视器时,OnInspectorGUI 中的代码都会被执行。因此,你可以在此处放任何 GUI 代码 - 它像游戏的 OnGUI() 一样运行,但却是在检视器内部运行的。编辑器定义可用于访问正被检查的对象的目标属性。

当用户通过检查 GUI.changed 而更改任何值时,EditorUtility.SetDirty 代码将会被执行。

在这种情况下,我们会将向量 3 (Vector3) 字段之一用于变换检视器 (Transform Inspector) - 如下:

还有很多工作没有做,但是我们先到此为止了 - 重头戏还在后面…

2、场景视图添加

你可以通过在自定义编辑器中执行 OnSceneGUI() 来为场景视图 (Scene View) 添加附加代码。在这种情况下,将添加第二个位置控制手柄,使用户可以在场景视图中拖动观察目标点。下面是JavaScript代码示例:

@CustomEditor (LookAtPoint)

class LookAtPointEditor extends Editor {

function OnInspectorGUI () {

target.lookAtPoint = EditorGUILayout.Vector3Field ("Look At Point", target.lookAtPoint);

if (GUI.changed)

EditorUtility.SetDirty (target);

}

function OnSceneGUI () {

target.lookAtPoint = Handles.PositionHandle (target.lookAtPoint, Quaternion.identity);

if (GUI.changed)

EditorUtility.SetDirty (target);

}

}

OnSceneGUI 的运行和 OnInspectorGUI 一样 - 除了前者是在场景视图中运行的之外。为便于制作编辑界面,可以使用手柄 (Handles) 类中定义的函数。其中所有的函数都是为三维场景 (3D Scene) 视图设计的。 如果您想放置二维 GUI 对象(GUI、EditorGUI),需要将这些对象包含在 Handles.BeginGUI() 和 Handles.EndGUI() 的调用中。

【Unity】8.5 扩展编辑器相关推荐

  1. 自定义Unity 容器的扩展 --- Unity Application Block Event Broker

    Unity快速入门的例子中有一个Block Event Broker通过对容器功能的扩展来实现事件截获,其中扩展的代码在项目EventBrokerExtension.该项目允许在应用程序种使用自定义的 ...

  2. unity 手机端和编辑器下播放带有透明通道的视频详解

    unity 手机端和编辑器下播放带有透明通道的视频详解 在项目开发中,可能会涉及到视频的播放,普通的视频播放如果大家不会的请自行百度,今天主要讲解带有透明通道的视频的播放问题,尤其是在手机端的处理,下 ...

  3. Lua For Unity 你使用什么编辑器做开发 ???

    前言 博主近期在写Lua代码,一直没有找到写Lua好用的编辑器,本文介绍了博主尝试使用过的几个Lua编辑器,强烈推荐在寻找编写Lua的用户来看看,避免自己尝试浪费过多的时间,若您有更好的编辑器也欢迎您 ...

  4. Unity学习之_编辑器扩展

    Unity编辑器扩展是对现有的Unity进行自定义功能扩展的一种方法,可以简化一些重复的开发动作,也可以用于制作插件 unity编辑器模式 unity的编辑器扩展绝大部分是用于unity的编辑器模式下 ...

  5. Unity扩展编辑器二

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

  6. Unity扩展编辑器五

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

  7. Unity编辑器扩展——编辑器样式预览窗口

    一:前言 创建控件的时候可以通过EditorStyles设置控件样式 二:效果演示 三:代码实现 using UnityEngine; using UnityEditor; using System. ...

  8. UnityEditor扩展 - 编辑器中的内置属性Attribute

    Unity内置属性[Attribute]是一种类似修饰功能的标签.可以对OnSceneGUI,InspectorGUI,MenuGUI,WindowGUI等实现各种各样的GUI扩展.在这一章里将举例介 ...

  9. 编辑器扩展_开发者必备,可扩展编辑器tui.editor和TOAST UI组件家族

    介绍 TOAST UI Editor是一个所见即所得的开源编辑器,GFM标准+图表和UML可扩展.它是我目前见过的功能最强大的开源MarkDown编辑器,具备强悍的生产力能力以及丰富的扩展性功能,总之 ...

最新文章

  1. 选择之后触_如果有朋友在做选择时左右为难,我应该该给出什么样的建议
  2. 图像检索:CNN对Hash组算法的颠覆
  3. Boost:bind绑定__cdecl(成员函数)测试程序
  4. 计算机组成原理——计算机系统的性能指标(机器字长、存储容量、运算速度)
  5. 系统调用跟我学(4)
  6. andrioid 图像视频处理
  7. 【数据库/数据挖掘/内容检索】 2019年-中国计算机学会推荐国际学术会议和期刊目录(五)
  8. android api 完整翻译之Contacts Provider (学习安卓必知的api,中英文对照)
  9. 安捷伦频谱仪的使用方法图解_频谱仪的简单操作使用方法lbrack;1rsqb;
  10. JSch连接SFTP Exception:Algorithm negotiation fail问题解决
  11. 华为热设计工程师待遇_【华为热设计工程师面试】华为热设计工程师大家要慎重考虑。-看准网...
  12. img html 文件怎么打开,img文件怎么打开?img文件用什么打开?
  13. 基于原生小程序精仿的猫眼电影(可预览)
  14. 實戰案例 - 資料對接工具程式碼重構 (2)
  15. 3.27 期货每日早盘操作建议
  16. 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)
  17. 解析几何--对称,平移和旋转
  18. 常用日期时间处理类封装DateTime(基于Carbon)
  19. 《深入理解计算机系统》实验二Bomb Lab
  20. bootstra select 下拉框多选,搜索效果

热门文章

  1. centos 安装sublime3
  2. 如何删除集合(数组)中指定的元素
  3. Go内存管理之代码的逃逸分析
  4. 讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术
  5. 分布式理论-BASE理论
  6. springboot整合使用rocketMq
  7. Redis 哨兵(sentinel)模式集群配置(5.0.3版本)
  8. 单实例activemq 数据测试
  9. python中的URL编码和解码
  10. 阿里云释放数据能力 开启大数据元年