上一篇我们讲了如何定义菜单按钮

https://www.cnblogs.com/xiaoyulong/p/10115053.html

这一篇我们讲如何定义自己的窗口。

定义窗口我们需要继承 EditorWindow 类,这个类在 using UnityEditor 命名空间下。

创建窗口有两个方法可以使用:

  1、EditorWindow.GetWindow():创建出来的窗口可通过鼠标动态的延伸窗口。

    参数:Type t:窗口类型,注意是一定要继承自 EditorWindow

       bool utility:窗口是否浮动,如果是就不能内嵌到unity其他窗口中去,如果不是就能嵌入其他窗口。(可以省略,默认为内嵌入式)

       string title:窗口的标题,如果为空的话就采用类的名称来当标题。(可以省略,默认类的名称)

       bool focus:是否可以获得焦点,如果再次点击会给窗口一个焦点。

  2、EditorWindow.GetWindowWithRect():创建出来的窗口的大小是固定的,无法改变。

    参数:Type t:窗口类型,注意是一定要继承自 EditorWindow

       Rect rect:窗口的大小。

       bool utility:窗口是否浮动,如果是就不能内嵌到unity其他窗口中去,如果不是就能嵌入其他窗口。(可以省略,默认为内嵌入式)

       string title:窗口的标题,如果为空的话就采用类的名称来当标题。(可以省略,默认类的名称)

       bool focus:是否可以获得焦点,如果再次点击会给窗口一个焦点。

代码如下:

 using UnityEditor;
using UnityEngine; public class EditorWindowTest : EditorWindow
{
[MenuItem("MyWindow/EditorWindowTest1")]
private static void AddWindow1()
{
EditorWindowTest myWindow = (EditorWindowTest)EditorWindow.GetWindow(typeof(EditorWindowTest), false, "Window1 name", true);//创建窗口
myWindow.Show();
} [MenuItem("MyWindow/EditorWindowTest2")]
private static void AddWindow2()
{
Rect _rect = new Rect(, , , );
EditorWindowTest window = (EditorWindowTest)EditorWindow.GetWindowWithRect(typeof(EditorWindowTest), _rect, true, "Window2 name");
window.Show();
}
}

效果图:

窗口创建出来了,我们可以使用 GUIGUILayout 控件,还可以使用编辑器专用控件 EditorGUI 和 EditorGUILayout OnGUI() 回调函数中给窗口添加内容,下面就用一个小例子给大家演示下,并介绍下窗口支持的回调函数

代码:

using UnityEditor;
using UnityEngine; public class MyEditor : EditorWindow
{
[MenuItem("MyWindow/window")]
private static void AddWindow()
{
Rect wr = new Rect(, , , );
MyEditor window = (MyEditor)EditorWindow.GetWindowWithRect(typeof(MyEditor), wr, true, "widow name");
window.Show();
}
//输入文字的内容
private string text;
//选择贴图的对象
private Texture texture; //绘制窗口时调用
private void OnGUI()
{
//输入框控件
text = EditorGUILayout.TextField("输入文字:", text);
if (GUILayout.Button("打开通知", GUILayout.Width()))
{
//打开一个通知栏
this.ShowNotification(new GUIContent("This is a Notification"));
}
if (GUILayout.Button("关闭通知", GUILayout.Width()))
{
//关闭通知栏
this.RemoveNotification();
}
//文本框显示鼠标在窗口的位置
EditorGUILayout.LabelField("鼠标在窗口的位置", Event.current.mousePosition.ToString());
//选择贴图
texture = EditorGUILayout.ObjectField("添加贴图", texture, typeof(Texture), true) as Texture;
if (GUILayout.Button("关闭窗口", GUILayout.Width()))
{
//关闭窗口
this.Close();
}
} private void Awake()
{
Debug.Log("Awake");
}
private void Update()
{
Debug.Log("Update");
}
private void OnEnable()
{
Debug.Log("OnEnable");
}
private void OnDisable()
{
Debug.Log("OnDisable");
}
private void OnFocus()
{
Debug.Log("当窗口获得焦点时调用一次");
}
private void OnLostFocus()
{
Debug.Log("当窗口丢失焦点时调用一次");
}
private void OnHierarchyChange()
{
Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次");
}
private void OnProjectChange()
{
Debug.Log("当Project视图中的资源发生改变时调用一次");
}
private void OnInspectorUpdate()
{
Debug.Log("窗口面板的更新");
//这里开启窗口的重绘,不然窗口信息不会刷新
this.Repaint();
}
private void OnSelectionChange()
{
//当窗口处于开启状态,并且在Hierarchy视图中选择某游戏对象时调用
foreach (Transform t in Selection.transforms)
{
//有可能是多选,这里开启一个循环打印选中游戏对象的名称
Debug.Log("OnSelectionChange" + t.name);
}
}
private void OnDestroy()
{
Debug.Log("当窗口关闭时调用");
}
}

效果图:

最后介绍两个API:

fousedWindow(静态属性):键盘操作的窗口的焦点。键盘在对哪个窗口进行输入或者其他操作,这个静态变量就是那个窗口。

mouseOverWindow(静态属性):鼠标操作的窗口的焦点。鼠标悬停在哪个Window,这个静态变量就是那个窗口。

除了上面介绍的方法以外,Unity还提供了向导式的编辑窗口 ScriptableWizard,就是提供了一个简单的窗口模块,支持我们快速开发

创建函数介绍:

public static T DisplayWizard<T>(string title)
public static T DisplayWizard<T>(string title, string createButtonName)
public static T DisplayWizard<T>(string title, string createButtonName, string otherButtonName)
public static ScriptableWizard DisplayWizard(string title, Type klass, string createButtonName)

函数参数详解:

string title:窗口标题名称

string createButtonName:Create按钮名称

string otherButtonName: 其他按钮名称

Type klass:实现类类型

属性介绍:

createButtonName:修改 create button 的名称

otherButtonName: 设置 otherButtonName 的名称

helpString:允许您设置向导的帮助文本。

errorString:允许您设置向导的错误文本。

isValid:允许您启用和禁用向导创建按钮,以便用户不能点击。

回调函数介绍:

OnWizardUpdate:当向导被打开或只要用户在向导改变了某些东西时就会被自动的调用。

OnWizardCreate:当用户在创建按钮上点击是调用。

OnWizardOtherButton:当用户在其他按钮点击时,此函数会被调用

案例:

代码:

 using UnityEditor;
using UnityEngine; public class ScriptableWizardTest : ScriptableWizard
{
#region --变量定义
public float range = ;
public Color color = Color.red;
#endregion #region --自定义函数
[MenuItem("MyWindow/Create Light Wizard")]
static void CreateWizard()
{
ScriptableWizard.DisplayWizard<ScriptableWizardTest>("Create Light", "Create", "Apply");
}
void OnWizardCreate()
{
GameObject go = new GameObject("New Light");
Light lt = go.AddComponent<Light>();
lt.range = range;
lt.color = color;
}
void OnWizardUpdate()
{
helpString = "Please set the color of the light!";
}
void OnWizardOtherButton()
{
if (Selection.activeTransform != null)
{
Light lt = Selection.activeTransform.GetComponent<Light>(); if (lt != null)
{
lt.color = Color.red;
}
}
}
#endregion
}

效果图:

Unity3D编辑器扩展(二)——定义自己的窗口的更多相关文章

  1. Unity3D编辑器扩展(六)——模态窗口

    前面我们已经写了5篇关于编辑器的,这是第六篇,也是最后一篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)—— ...

  2. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  3. Unity3D编辑器扩展(四)——扩展自己的组件

    前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...

  4. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  5. unity3D编辑器扩展

    编辑器扩展只是在编辑项目中运行,发布出来是不会运行的. 固定创建一个文件夹Editor:所有的资源或者代码都不会被打包进去. 01.使用MenuItem添加菜单栏按钮 脚本不需要作为组件存在,可以不用 ...

  6. Unity3D编辑器扩展(一)——定义自己的菜单按钮

    Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情.在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境. 本篇主要讲解在 Unity3D 引擎的各个窗口 ...

  7. Unity3D编辑器扩展(三)——使用GUI绘制窗口

    前两篇分别讲解了创建菜单https://www.cnblogs.com/xiaoyulong/p/10115053.html和创建窗口https://www.cnblogs.com/xiaoyulon ...

  8. [Unity3D]编辑器扩展之数组或List显示

    效果如下: 源码如下: using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XM.Edi ...

  9. unity编辑器扩展_08(创建自定义窗口)

    代码: using UnityEngine;using UnityEditor; public class MyWidow : EditorWindow{    [MenuItem("Win ...

随机推荐

  1. JS的基本(原始)数据类型

    1.boolean  true & false 2.null   空值类型 3.undefined  未定义类型 4.number    数值类型 5.string    字符串类型 6.sy ...

  2. spark内存分配

    问题描述 在测试spark on yarn时,发现一些内存分配上的问题,具体如下. 在$SPARK_HOME/conf/spark-env.sh中配置如下参数: SPARK_EXECUTOR_INST ...

  3. [Java]刷题中的Java基础

    数组 取数组长度是属性length ArrayList ArrayList<Integer> maxRootHeap = new ArrayList<Integer>(); m ...

  4. 记一次git翻车事件

    昨天dmp上线了 本来整个流程是 1.在本地1.4分支开发,开发完成push到origin/1.4,在远程仓库把1.4 merge到master分支 2.本地online分支先pull一下远程onli ...

  5. Flask使用记录

    关于FLASK框架的使用 使用pycharm创建工程 在默认的templates中新增模板页面 在默认的app.py中定义路由并引用模板 @app.route("/add", me ...

  6. 制作docker基础镜像

    docker build -t tomcat:jre8-alpine . sudo docker tag 5a3 registry.cn-shenzhen.aliyuncs.com/ibase/tom ...

  7. 安装使用aria2下载百度网盘内容(转)

    原文地址:https://blog.csdn.net/wudi1107/article/details/80728891 安装使用aria2下载百度网盘内容 目前在Linux中没有好用的百度网盘客户端 ...

  8. redis常用服务安装部署

    常用服务安装部署   学了前面的Linux基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环境: centos7 + vmware + xshell 即将登场的是: mysql(m ...

  9. mysql查询时间段内的数据

    https://blog.csdn.net/ls1645/article/details/79118464

  10. leetcode26: 删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...