源地址:http://gad.qq.com/article/detail/32207
终极目标

利用学到的东西制作自己的工具(自定义的窗口、Inspector、菜单、插件等等)。

准备工作

在之前的项目中,找到 Editor 文件夹,然后创建一个新的 C# 脚本,命名为“MyFirstWindow”,然后双击打开脚本,添加如下代码:

  1. using System.Collections;
  2. using System.IO;
  3. using UnityEditor;
  4. using UnityEditor.SceneManagement;
  5. using UnityEngine;
  6. ///
  7. ///
  8. ///
  9. public class MyFirstWindow : EditorWindow {
  10. string bugReporterName = "";
  11. string description = "";
  12. GameObject buggyGameobject;
  13. MyFirstWindow()
  14. {
  15. this.titleContent = new GUIContent("Bug Reporter");
  16. }
  17. [MenuItem("Tool/Bug Reporter")]
  18. static void ShowWindow()
  19. {
  20. EditorWindow.GetWindow(typeof(MyFirstWindow));
  21. }
  22. void OnGUI()
  23. {
  24. EditorGUILayout.BeginVertical();
  25. GUILayout.Space(10);
  26. GUI.skin.label.fontSize = 24;
  27. GUI.skin.label.alignment = TextAnchor.MiddleCenter;
  28. GUILayout.Label("Bug Reporter");
  29. GUILayout.Space(10);
  30. bugReporterName = EditorGUILayout.TextField("Bug Name", bugReporterName);
  31. GUILayout.Space(10);
  32. GUI.skin.label.fontSize = 12;
  33. GUI.skin.label.alignment = TextAnchor.UpperLeft;
  34. GUILayout.Label("Currently Scene:" EditorSceneManager.GetActiveScene().name);
  35. GUILayout.Space(10);
  36. GUILayout.Label("Time:" System.DateTime.Now);
  37. GUILayout.Space(10);
  38. buggyGameobject = (GameObject)EditorGUILayout.ObjectField("Buggy Gameobject", buggyGameobject,typeof(GameObject),true);
  39. GUILayout.Space(10);
  40. GUILayout.BeginHorizontal();
  41. GUILayout.Label("Description",GUILayout.MaxWidth(80));
  42. description = EditorGUILayout.TextArea(description,GUILayout.MaxHeight(50));
  43. GUILayout.EndHorizontal();
  44. EditorGUILayout.Space();
  45. if(GUILayout.Button("Save Bug"))
  46. {
  47. SaveBug();
  48. }
  49. if(GUILayout.Button("Save Bug With Screenshot"))
  50. {
  51. SaveBugWithScreenshot();
  52. }
  53. GUILayout.EndVertical();
  54. }
  55. void SaveBug()
  56. {
  57. Directory.CreateDirectory("Assets/BugRepots/" bugReporterName);
  58. StreamWriter sw = new StreamWriter("Assets/BugRepots/" bugReporterName "/"  bugReporterName ".txt");
  59. sw.WriteLine(bugReporterName);
  60. sw.WriteLine(System.DateTime.Now.ToString());
  61. sw.WriteLine(EditorSceneManager.GetActiveScene().name);
  62. sw.WriteLine(description);
  63. sw.Close();
  64. }
  65. void SaveBugWithScreenshot()
  66. {
  67. Directory.CreateDirectory("Assets/BugRepots/" bugReporterName);
  68. StreamWriter sw = new StreamWriter("Assets/BugRepots/" bugReporterName "/"  bugReporterName ".txt");
  69. sw.WriteLine(bugReporterName);
  70. sw.WriteLine(System.DateTime.Now.ToString());
  71. sw.WriteLine(EditorSceneManager.GetActiveScene().name);
  72. sw.WriteLine(description);
  73. sw.Close();
  74. Application.CaptureScreenshot("Assets / BugRepots / " bugReporterName " / "  bugReporterName "ScreenShot" ".png");
  75. }
  76. }

代码分析

属性

首先声明了三个变量:

1.bugReporterName 用于储存记录Bug人的名字

2.description 用于描述Bug信息

3.buggyGameObject 用于储存 Bug 对象

设置窗口的名字

添加菜单栏选项 - 打开窗口({MenuItem()]下的方法必須為靜太)

绘制窗口

绘制窗口元素需要在 OnGUI() 函数里面设计,接下来我们一一分解。

步骤:

1.GUILayout.Space(10),这个有说过,让两个元素之间空十个像素之间的距离

2.GUI.skin.label.fontSize 、GUI.skin.label.alignment 用于设置标题的字体大小和对齐格式;

显示当前正在编辑的场景

EditorSceneManager.GetActiveScen().name,其实就是返回当前编辑的场景信息(也就是返回 Scene 类型参数),然后利用 name 属性获取场景的名字,命名空間:using UnityEditor.SceneManagement;
绘制对象槽

1.第一个参数用于设置卡槽的标题名字

2.第二个参数用于设置字段显示的物体

3.第三个参数用于设置显示的类型

4.第四个参数用于设置是否允许指定场景中的物件

绘制描述文本区域

最终效果

最终效果

Unity Editor 基础篇(三):自定义窗口相关推荐

  1. Unity Editor 基础篇(四):Handles

    本文参自: 克森http://mp.weixin.qq.com/s/qxsKDPjJS30S9OXeQ8WKTw 本文为本人学习上链接的笔记微有改动,请点击以上链接查看原文,尊重楼主知识产权. Uni ...

  2. Unity编辑器Unity Editor基础(一)

    Unity编辑器Unity Editor基础(一)               关于 Unity 内置属性可以从到官方文档中查询,本篇文章只介绍一些常用的内置属性,如下图所示: 接下来进行项目设置,创 ...

  3. 圆形界面 开启相机_「基础篇三」手机摄影拍照界面详解

    ​[基础篇三]手机摄影拍照界面详解 手机拍照对我们来说已习以为常,每天我们都会用手机相机功能或多或少的拍出几张照片.故手机拍照界面对我们来说也不陌生,但手机拍照界面上的那些按钮,那些功能你都用过吗?你 ...

  4. WF4.0 基础篇 (三十 完) 对学习WF的一点建议

    从09年10月份 NET4.0 Bata 2发布后,我就开始写[WF4.0 基础篇]这个系列,经历了5个多月终于在NET4.0正式发布前将这个系列完成了 这段时间与一些对WF4.0感兴趣的公司与开发人 ...

  5. python 01列表异或_python基础篇三

    python基础篇二所介绍的列表是基本的数据类型之一,元组.集合.字典也是基本的数据类型之一.熟练运用这些基本的数据类型很重要,就像是一座高楼大厦,把地基打扎实了,这栋高楼大厦才能在狂风暴雨中岿然不动 ...

  6. Python机器学习基础篇三《无监督学习与预处理》

    前言 前期回顾: Python机器学习基础篇二<为什么用Python进行机器学习> 上面这篇里面写了文本和序列相关. 我们要讨论的第二种机器学习算法是无监督学习算法.无监督学习包括没有已知 ...

  7. JAVA学习之路--基础篇三

    目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...

  8. 自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)

    转载请注明出处王亟亟的大牛之路 上礼拜上了一篇关于动画的自定义View的文章,然后里面的实现是PathMeasure,然后这一部分貌似以前没有讲过,那么就再补一篇来介绍下这部分的知识(之前一篇的传送门 ...

  9. 【Spring 基础篇三】属性注入与属性编辑器

         上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作.      在敲代码的过程中,我们很容易遇到这样的问题,比如一个Lis ...

  10. 自动化测试基础篇--Selenium多窗口、句柄问题

    有时我们在打开浏览器浏览网页时,当点击网页上某些链接时,它不是直接在当前页面上跳转,而是重新打开一个新标签页面,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需 ...

最新文章

  1. Python之初识函数(Day11)
  2. Java UDP协议传输
  3. linux tcp项目,Linux上TCP重传的应用控制
  4. Redis主从复制、哨兵模式和分布式集群
  5. sf | 读取和保存空间矢量数据
  6. 电商网站主动取消客户已支付成功订单感想
  7. Eclipse版本控制插件Subclipse与Subversive的区别与选择
  8. 如何用Java的Robot完成模拟鼠标移动和键盘输入(可应用刷网课)
  9. 安卓手机实现wifi中继、WiFi信号增强
  10. 十大热门编程语言:不死 Java、不朽 C/C ++、新贵 Python
  11. Xpath根据text内容快速定位
  12. MapReduce名词解释
  13. 0021:孩子也是要将心比心的
  14. CIE 国际照明委员会
  15. Windows找回磁盘被病毒感染后隐藏的文件
  16. TiDB在摩拜单车在线数据业务的应用和实践
  17. 点线面的意义_点线面在绘画中的意义
  18. 50本关于软件测试的书籍
  19. IP地址的划分-------IP地址的借位情况
  20. 协同过滤算法(基于用户)

热门文章

  1. python打砖块游戏算法设计分析_基于pygame的打砖块游戏,做到一半,不带做了
  2. c语言转义字符o用法,gogo体育下载官网-gogo体育下载官网
  3. 用python做了个桌球瞄准器
  4. 全球及中国飞行时间传感器芯片行业研究及十四五规划分析报告
  5. 【IE知识】最系统、完整的标准工时学习资料;标准作业(SOP)详解;生产线布局规划
  6. gis与一般计算机应用系统有哪些异同,gis概论各章练习题..doc
  7. 聊聊故事点背后的故事
  8. Flickr网站架构分析
  9. linux c 获取usb vid,Linux如何使用libudev获取USB设备VID及PID
  10. 电脑怎样重装系统win7旗舰版