一:EditorWindow类

Editor类和EditorWindow类都继承自同一个基类:ScriptableObject,他们都可以针对某种脚本类来进行操作
EditorWindow类主要是对编辑器进行扩展,不需要指定脚本,是绘制独立的窗口

使用到的类:
——GUILayout:绘制各种2D控件,比如按钮、文本、可折叠列表,以及对它们的分组和排版
——EditorGUILayout:与GUILayout类似,但是提供更多的预定义控件
——GUIUtility:绘制自定义的2D控件,比如进度条、对话框、打开文件夹
——EditorGUIUtility:绘制自定义的2D控件,比如进度条、对话框、打开文件夹

重写OnGUI方法进行绘制


二:代码实现

——窗口Window

[MenuItem("工具栏层级")]
private static void ShowWindow()
{//第一种EditorWindow window = GetWindow(typeof(TestWindow), true, "测试窗口");//第二种EditorWindow window = CreateWindow<Cheat>("测试窗口");window.Show();window.Focus();
}

——标签Label

private void OnGUI()
{GUI.skin.label.fontSize = 20;GUI.skin.label.fontStyle = FontStyle.Bold;GUI.skin.label.alignment = TextAnchor.MiddleCenter;GUILayout.Label("测试窗口");GUILayout.Label(Resources.Load<Texture>("Resources文件夹下的图片路径"));
}

Project目录下右键—Create—GUI Skin可以看到所有可修改的属性

——文本字段TextField

string txt;private void OnGUI()
{txt = EditorGUILayout.TextField("输入文本:", txt);
}

——密码字段PasswordField

string txt;private void OnGUI()
{txt = EditorGUILayout.PasswordField("密码:", txt);}

——整数字段IntField、浮点数字段FloatField

int value_int;
float value_float;private void OnGUI()
{value_int = EditorGUILayout.IntField("输入整数:", value_int);value_float = EditorGUILayout.FloatField("输入浮点数:", value_float);
}

——二维向量字段Vector2Field、三维向量字段Vector3Field

private Vector3 v3;
private Vector3 v2;private void OnGUI()
{v3 = EditorGUILayout.Vector3Field("三维向量", v3);v2 = EditorGUILayout.Vector2Field("二维向量", v2);
}

——物体字段ObjectField

GameObject go;
Camera camera;private void OnGUI()
{go = (GameObject)EditorGUILayout.ObjectField("赋值物体", go, typeof(GameObject),     true);    camera = (Camera)EditorGUILayout.ObjectField("赋值相机", camera, typeof(Camera), true);
}

——颜色字段ColorField

private Color color;private void OnGUI()
{color = EditorGUILayout.ColorField("颜色", color);
}

——标签字段TagField

private string tag;private void OnGUI()
{tag = EditorGUILayout.TagField("tag", tag);
}

——层级字段LayerField

private int layer;private void OnGUI()
{layer = EditorGUILayout.LayerField("layer", layer);
}

——按钮Button

private void OnGUI()
{    if (GUILayout.Button("按钮")){//按下按钮后执行的方法}
}

——多行文本TextArea

string txt;private void OnGUI()
{GUILayout.BeginHorizontal();GUILayout.Label("输入文本:",GUILayout.MaxWidth(50));txt = EditorGUILayout.TextArea(txt, GUILayout.MaxHeight(50));GUILayout.EndHorizontal();
}

——单选框Toggle

bool b;private void OnGUI()
{b = EditorGUILayout.Toggle("单选框", b);
}

——折叠列表Foldout

bool foldout;private void OnGUI()
{foldout= EditorGUILayout.Foldout(foldout, "列表");if (foldout){EditorGUILayout.LabelField("姓名:XXX");EditorGUILayout.LabelField("手机号:XXXXXXXXXXX");EditorGUILayout.LabelField("微信:XXXXXXXX");}
}

——开关组BeginToggleGroup/EndToggleGroup

GameObject go;
string txt;
bool b;private void OnGUI()
{b = EditorGUILayout.BeginToggleGroup("开启区域", b);txt = EditorGUILayout.TextField("输入文本:", txt);go = (GameObject)EditorGUILayout.ObjectField("赋值物体", go, typeof(GameObject), true);EditorGUILayout.EndToggleGroup();
}

——可选择文本SelectableLabel(用于需要复制的文本)

private void OnGUI()
{EditorGUILayout.SelectableLabel("微信号:597094538");
}

——滑动条Slider、整数滑动条IntSlider

int value_int;
float value_float;private void OnGUI()
{value_float = EditorGUILayout.Slider("滑动条", value_float, 1, 10);value_int = EditorGUILayout.IntSlider("滑动条", value_int, 1, 10);
}

——字符串类型的弹出选择菜单Popup

private int index = 0;
string[] values = { "value1", "value2", "value3" };private void OnGUI()
{index = EditorGUILayout.Popup("选择", index, values);
}

——枚举类型的弹出选择菜单EnumPopup

public enum Value
{Value1,Value2,Value3,
}
private Value value;private void OnGUI()
{value = (Value)EditorGUILayout.EnumPopup("选择", value);
}

——整数类型的弹出选择菜单IntPopup

private int index = 0;
string[] values = { "value1", "value2", "value3" };
int[] value = { 1, 2, 3 };private void OnGUI()
{index = EditorGUILayout.IntPopup("选择", index, values, value);EditorGUILayout.LabelField("value是:" + index);
}

——设置绘制的方向BeginScrollView、EndHorizontal和BeginVertical、EndVertical
BeginScrollView和BeginVertical可以设置内置样式

private void OnGUI()
{EditorGUILayout.BeginHorizontal();EditorGUILayout.EndHorizontal();
}

——设置滑动区域BeginScrollView、EndScrollView

Vector2 scrollPos;private void OnGUI()
{scrollPos = EditorGUILayout.BeginScrollView(scrollPos);EditorGUILayout.EndScrollView();
}

——再次确认的对话框DisplayDialog

private void OnGUI()
{if (GUILayout.Button("按钮", GUILayout.Width(50), GUILayout.Height(50))){if (EditorUtility.DisplayDialog("再次确定", "是否确定", "确定", "取消")){Debug.Log("yes");}}
}

——进度条DisplayProgressBar

private void OnGUI()
{if (GUILayout.Button("按钮")){int totalCount = Selection.gameObjects.Length;for (int i = Selection.gameObjects.Length - 1; i >= 0; i--){DestroyImmediate(Selection.gameObjects[i]);EditorUtility.DisplayProgressBar("进度条", "当前进度", totalCount - i / totalCount);}EditorUtility.ClearProgressBar();}
}

——工具栏Toolbar

string[] values = { "Menu1", "Menu2", "Menu3" };
private int index = 0;
//string[] values = { "value1", "value2", "value3" };private void OnGUI()
{index = GUILayout.Toolbar(index, values);if (index == 0){EditorGUILayout.LabelField("this is menu1");}else if (index == 1){EditorGUILayout.LabelField("this is menu2");}
}

——显示提示信息ShowNotification

private void OnGUI()
{if (GUILayout.Button("显示提示信息")){ShowNotification(new GUIContent("this is a Notification"));}if (GUILayout.Button("关闭提示信息")){RemoveNotification();}
}

——显示帮助信息HelpBox

private void OnGUI()
{EditorGUILayout.HelpBox("帮助信息", MessageType.None);EditorGUILayout.HelpBox("警告提示", MessageType.Warning);
}

——选择文件/文件夹位置

private void OnGUI()
{if (GUILayout.Button("选择存储位置")){path = EditorUtility.OpenFilePanel("选择文件", path, ".xls");dir = EditorUtility.OpenFolderPanel("选择路径", dir, "");}
}

三:绘制一个自定义的Debug窗口

using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.IO;public class DebugWindow : EditorWindow
{[MenuItem("Tools/Show DebugWindow")]private static void ShowWindow(){GetWindow(typeof(DebugWindow), true, "Debug窗口", true);}int toolbarIndex;string[] toolbarStr = { "Error反馈窗口", "Warning反馈窗口" };bool haveError;bool haveErrorDes;string errorName;GameObject errorGo;string errorDes;string[] errorType = { "普通", "一般", "严重" };private int errorTypeIndex;string errorPath;private void OnGUI(){toolbarIndex = GUILayout.Toolbar(toolbarIndex, toolbarStr);if (toolbarIndex == 0){//标题标签GUI.skin.label.fontSize = 20;GUI.skin.label.fontStyle = FontStyle.Bold;GUI.skin.label.alignment = TextAnchor.MiddleCenter;GUILayout.Label("Error反馈窗口");haveError = EditorGUILayout.Toggle("是否有Error", haveError);if (haveError){//问题名errorName = EditorGUILayout.TextField("问题名", errorName);if (errorName != null){if (errorName.Length == 0 || errorName == ""){EditorGUILayout.HelpBox("问题名不能为空", MessageType.Error);}else if (errorName.Length >= 5){EditorGUILayout.HelpBox("问题名过长", MessageType.Warning);}else{EditorGUILayout.HelpBox("问题名合法", MessageType.Info);}}//出现问题的时间EditorGUILayout.LabelField("当前时间", System.DateTime.Now.ToString());//出现问题的场景EditorGUILayout.LabelField("当前场景", SceneManager.GetActiveScene().name);//出现问题的物体errorGo = (GameObject)EditorGUILayout.ObjectField("问题物体", errorGo, typeof(GameObject), true);//问题描述haveErrorDes = EditorGUILayout.BeginToggleGroup("是否添加问题描述", haveErrorDes);EditorGUILayout.BeginHorizontal();EditorGUILayout.LabelField("问题描述:", GUILayout.MaxWidth(50));EditorGUILayout.TextArea(errorDes, GUILayout.MaxHeight(50));EditorGUILayout.EndHorizontal();EditorGUILayout.EndToggleGroup();//问题类型errorTypeIndex = EditorGUILayout.Popup("问题类型", errorTypeIndex, errorType);//问题保存路径EditorGUILayout.BeginHorizontal();if (GUILayout.Button("选择路径")){errorPath = EditorUtility.SaveFolderPanel("Path to Save", errorPath, Application.dataPath);}EditorGUILayout.TextField(errorPath);EditorGUILayout.EndHorizontal();GUILayout.Space(50);//保存到本地if (GUILayout.Button("保存")){if (errorPath == null){ShowNotification(new GUIContent("请先选择保存路径"), 1);}else{Directory.CreateDirectory(errorPath + "/BugReports");StreamWriter sw = new StreamWriter(errorPath + "/BugReports/" + errorName + ".txt");sw.WriteLine("Error or Warning:" + toolbarStr[toolbarIndex]);sw.WriteLine("问题名:" + errorName);sw.WriteLine("出现问题的时间:" + System.DateTime.Now.ToString());sw.WriteLine("出现问题的场景:" + SceneManager.GetActiveScene().name);sw.WriteLine("问题描述:" + errorDes);sw.WriteLine("问题类型:" + errorType);sw.WriteLine("问题存储路径:" + errorPath);sw.Close();}}}}else if (toolbarIndex == 1){GUI.skin.label.fontSize = 20;GUI.skin.label.fontStyle = FontStyle.Bold;GUI.skin.label.alignment = TextAnchor.MiddleCenter;GUILayout.Label("Warning反馈窗口");//其他的与Error反馈窗口基本相同}}
}

Unity编辑器扩展——自定义窗口相关推荐

  1. Unity编辑器扩展 自定义脚本属性面板--基础篇

    开发中,如果使用插件会发现插件的组件,在属性面板上的设计非常方便,看着很高大上,他们是怎么做到的呢 基础 在Editor文件夹下,创建我们的属性面板编辑脚本 using UnityEditor的命名空 ...

  2. Unity 编辑器扩展菜单

    Unity 编辑器扩展菜单 目录 Unity 编辑器扩展菜单 一.MenuItem 特性 菜单栏扩展 1.创建多级菜单 2.创建可使用快捷键的菜单项 3.创建可被勾选的菜单项 4.检查菜单是否使用 5 ...

  3. Unity编辑器扩展 UI控件篇

    前摇 :认识编辑器扩展的必要性 由于各种各样的原因,无论是移动端亦或是主机/PC端,进几年的发行的游戏体量是越来越大.通常来说大体量的游戏开发需要一套很成熟完善的工作流,亦或说有很强的工业化的能力,像 ...

  4. Unity编辑器扩展之EditorWindow

    Unity编辑器扩展之EditorWindow 继承这个类的编辑器脚本可以用来创建一个编辑器窗口,类似Inspector窗口 若要在这个类中添加一些控件,可以使用GUI和GUILayout控件,还可以 ...

  5. 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

    书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...

  6. 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...

  7. Unity编辑器扩展: 程序化打图集工具

    开始前的声明:该案例中图集所使用图片资源均来源于网络,仅限于学习使用 一.前言 关于编辑器扩展相关的知识,在前面的两篇内容中做了详细的描述,链接地址: 第一篇 :Unity编辑器扩展 UI控件篇 第二 ...

  8. 【Unity编辑器扩展实践】、查找所有引用该图片的预制体

    上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...

  9. 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用

    [Unity编辑器扩展](二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客 [Unity编辑器扩展](三)PSD转UGUI Pref ...

  10. Unity编辑器扩展-生成prefab的预览图并保存为图片

    Project视图里的prefab文件都是一个蓝色的正方体,我想给它们加个预览图,暂时不知道怎么改Project视图的,但反正我想像NGUI那样有个专门的窗口存放一些常用的prefab,所以做成了如下 ...

最新文章

  1. 算法设计思想(4)— 分治法
  2. PWM通过RC低通滤波器模拟DAC
  3. 让数据库变快的10个建议
  4. imx6的kernel3.4.15启动流程
  5. JavaScriptWindow使用对象
  6. 【HDU - 5965】扫雷(dp)
  7. [TC SRM 685 div1 lev1] MultiplicationTable2
  8. sas 文件传输 本地 服务器,SLIM SAS SFF-8654服务器转换线让传输更容易!
  9. TensorFlow神经网络(二)反向传播
  10. 杨东援:交通管控,从智能走向智慧
  11. 记一次勒索病毒的遭遇
  12. Pipeline aborted due to error
  13. java 读取xps_java读取带格式word内容
  14. 利用动态加载实现手机淘宝的节日特效
  15. 完美显示html的版权符号
  16. 手机抓包软件:charles安装及教程
  17. Τεχνική υποστήριξη
  18. 用Python实现原生爬取某牙直播平台数据
  19. windows 组策略
  20. API 开放接口设计之 appId,appSecret,accessToken (同微信开发平台接口)

热门文章

  1. 批量pingIP脚本
  2. vs2019MSDN(离线帮助文档)的下载与使用
  3. C++ msdn 离线版下载地址
  4. Beta 冲刺(7/7)
  5. 破解“还原卡”技术方法
  6. 瑞友天翼服务器ip地址怎么修改,(瑞友天翼安装教程.doc
  7. 测试和维修电脑软件,常用的电脑维修软件有哪些?
  8. 压缩包密码字典_压缩包密码pojie!
  9. discuz 论坛DIY增加{lastposter}最后回复者以及{forumicon}版块图标调用解读
  10. hp服务器系统检测,HP服务器检测步骤.pdf