unity 编辑器扩展简单入门

  1. 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体;并且,编辑器扩展也提供GUI库,来实现可视化操作;编辑器扩展甚至也可以“补充”IDE缺失的一些内容,让IDE更加人性化。

主要内容

  • MenuItem无界面操作
  • 窗口
  • 优化内置操作
  • 简单工具窗口
  • Gizmos改造场景显示

一、MenuItem无界面操作


assets文件夹下创建Editor文件夹,创建一个新的c#脚本;

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. public class BaseTest : MonoBehaviour
  6. {
  7. [MenuItem("德玛/第一个扩展")]
  8. static void debugLog()
  9. {
  10. Debug.Log("我是一个menuItem");
  11. }
  12. }

如图,这是我们第一个创建的扩展。

此时,如果我们需要获得一个当前场景选中的物品,则

需要通过Selection。将代码拷贝到当前创建的类里面:

  1. // 设置第二个参数
  2. [MenuItem("德玛/two", false)]
  3. static void testSecondParam()
  4. {
  5. Vector3 p = Selection.activeTransform.position;
  6. Vector3 v3 = new Vector3(p.x+1, p.y, p.z);
  7. Instantiate(Selection.activeTransform, v3, Quaternion.identity);
  8. }
  9. [MenuItem("德玛/two", true)]
  10. static bool testSecondParam2()
  11. {
  12. return Selection.activeGameObject != null;
  13. }

通过这段代码,我们可以创建一个只有选择了一个场景物体,才会激活的按钮。

二、窗口


创建窗口需要通过EditorWindow作为基类,还是MenuItem为入口创建;

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor; //注意要引用
  4. public class MyWindow : EditorWindow
  5. {
  6. [MenuItem("德玛/Window/NormalWindow")]//在unity菜单Window下有MyWindow选项
  7. static void NormalWindow()
  8. {
  9. windowType = 1;
  10. MyWindow myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), true, "德玛标题", true);//创建窗口
  11. myWindow.Show();//展示
  12. }
  13. public void Awake()
  14. {
  15. //在资源中读取一张贴图
  16. texture = Resources.Load("1") as Texture;
  17. }
  18. //绘制窗口时调用
  19. void OnGUI()
  20. {
  21. EditorGUILayout.LabelField("选中");
  22. EditorGUILayout.LabelField(EditorWindow.focusedWindow.ToString());
  23. EditorGUILayout.LabelField("划入");
  24. EditorGUILayout.LabelField(EditorWindow.mouseOverWindow.ToString());
  25. }
  26. //更新
  27. void Update()
  28. {
  29. }
  30. void OnFocus()
  31. {
  32. Debug.Log("当窗口获得焦点时调用一次");
  33. }
  34. void OnLostFocus()
  35. {
  36. Debug.Log("当窗口丢失焦点时调用一次");
  37. }
  38. void OnHierarchyChange()
  39. {
  40. Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次");
  41. }
  42. void OnProjectChange()
  43. {
  44. Debug.Log("当Project视图中的资源发生改变时调用一次");
  45. }
  46. void OnInspectorUpdate()
  47. {
  48. //Debug.Log("窗口面板的更新");
  49. //这里开启窗口的重绘,不然窗口信息不会刷新
  50. this.Repaint();
  51. }
  52. void OnSelectionChange()
  53. {
  54. //当窗口出去开启状态,并且在Hierarchy视图中选择某游戏对象时调用
  55. foreach (Transform t in Selection.transforms)
  56. {
  57. //有可能是多选,这里开启一个循环打印选中游戏对象的名称
  58. Debug.Log("OnSelectionChange" + t.name);
  59. }
  60. }
  61. void OnDestroy()
  62. {
  63. Debug.Log("当窗口关闭时调用");
  64. }
  65. }

将上面的代码放入Editor目录下,通过德玛/Window/NormalWindow可以打开窗口。

EditorWindow.focusedWindow获取当前焦点窗口;

EditorWindow.mouseOverWindow获取当前鼠标划入的窗口;

各种生命周期函数均有打印,自行理会。

  1. void OnInspectorUpdate()
  2. {
  3. //Debug.Log("窗口面板的更新");
  4. //这里开启窗口的重绘,不然窗口信息不会刷新
  5. this.Repaint();
  6. }

这段代码可以保证实时刷新显示。

三、优化内置操作


当路径放入GameObject的时候,会出现在右键菜单里面;

  1. [MenuItem("GameObject/德玛/德玛Custom Game Object", false, 10]

注解

当然,除了在Editor目录下添加各种扩展以外,我们可以通过给项目脚本添加注解的方式,来优化编辑器显示;

比如通过添加类似于Component的方式,来优化脚本的添加方式,点击后会直接将脚本添加到场景物体上。

[RequireComponent(typeof(Rigidbody))]放入类头。我们将下面脚本放入到Assets/Scripts目录下面。

  1. using UnityEngine;
  2. // 通过编辑器的Component菜单添加脚本
  3. [RequireComponent(typeof(Rigidbody))]
  4. [HelpURL("https://docs.unity3d.com/ScriptReference/HelpURLAttribute.html")]
  5. [AddComponentMenu("德玛/添加德玛脚本")]
  6. public class ContextTesting : MonoBehaviour
  7. {
  8. [Header("属性标题")]
  9. [Multiline(3)]
  10. public string name2;
  11. [Space(100)]
  12. [Tooltip("用于设置性别")]
  13. public string sex;
  14. [HideInInspector]
  15. public int p = 5;
  16. [Range(1, 100)]
  17. [Tooltip("Health value between 0 and 100.")]
  18. public int health = 0;
  19. /// Add a context menu named "Do Something" in the inspector
  20. /// of the attached script.
  21. /// 给当前脚本添加右键内容
  22. [ContextMenu("德玛西亚")]
  23. void DoSomething()
  24. {
  25. Debug.Log("德玛西亚打印");
  26. }
  27. // 给属性添加右键
  28. [ContextMenuItem("重置属性为空", "ResetBiography")]
  29. public string playerBiography = "";
  30. void ResetBiography()
  31. {
  32. playerBiography = "";
  33. }
  34. }

我们发现,我们可以想组件一样的添加脚本了!



Inspector目录我们也注意到当前脚本属性的显示也发生了变化;

Inspector上,我们也多出来一个Rigidbody组件。

美化项目脚本的属性显示

Assets/Scripts下面创建MyPlayer

  1. using UnityEngine;
  2. using System.Collections;
  3. public class MyPlayer : MonoBehaviour
  4. {
  5. public int armor = 100;
  6. public int attack = 100;
  7. public GameObject equipment;
  8. }

Editor下面创建MyPlayerEditor:

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections;
  4. [CustomEditor(typeof(MyPlayer))]
  5. public class MyPlayerEditor : Editor
  6. {
  7. SerializedProperty attack;
  8. void OnEnable()
  9. {
  10. attack = serializedObject.FindProperty("attack");
  11. }
  12. public override void OnInspectorGUI()
  13. {
  14. serializedObject.Update();
  15. EditorGUILayout.IntSlider(attack, 0, 100, new GUIContent("攻击力"));
  16. ProgressBar(attack.intValue / 100, "攻击力");
  17. serializedObject.ApplyModifiedProperties();
  18. }
  19. private void ProgressBar(float value, string label)
  20. {
  21. Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField");
  22. EditorGUI.ProgressBar(rect, value, label);
  23. EditorGUILayout.Space();
  24. }
  25. }

观察Inspector

简单工具窗口


一个简单的确认窗口

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class MyEditorUtilityTest : ScriptableObject
  4. {
  5. [MenuItem("德玛/自定义对话框")]
  6. static void CreateWizard()
  7. {
  8. if (EditorUtility.DisplayDialog("对话框标题", "对话框的消息", "OK", "取消"))
  9. {
  10. Debug.Log("OK被点击");
  11. }
  12. else
  13. {
  14. Debug.Log("您没有点击OK");
  15. }
  16. }
  17. }

显示如下

Gizmos改造场景显示


我们可以改造物体在场景中的显示;

如下代码

其他


通过上面的案例,我们大致了解了Unity编辑器扩展的基本内容,通过这些已经可以实现很多功能了!

仓库地址:

https://github.com/wyy5552/unityEditor

unity 编辑器扩展简单入门的更多相关文章

  1. Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

    Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject  Unity编辑器扩展 Chapt ...

  2. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  3. PHP中的IMAP扩展简单入门

    对于邮件处理来说,大家比较熟悉的应该是 POP3 . SMTP 这类的协议,而今天我们介绍的 IMAP 其实也是非常常用的一种邮件处理协议.它和 POP3 比较类似,都是以接收处理邮件为主.不过相对于 ...

  4. Unity编辑器扩展Texture显示选择框

    学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...

  5. Unity 编辑器扩展

    自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...

  6. Unity 编辑器扩展 场景视图内控制对象

    http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...

  7. Unity编辑器扩展

    在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...

  8. unity编辑器扩展学习

    扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...

  9. Unity 编辑器扩展 Chapter2—Gizmos

    二. 使用Gizoms绘制网格及矩阵转换使用 1. 创建Leve类,作为场景控制类: using UnityEngine; //使用namespace方便脚本管理 namespace RunAndJu ...

随机推荐

  1. java-Dos

    打开CMD的方式 1.菜单打开 2.Windows+R 输入cmd 3.shift+鼠标右键 选择在此处打开命令行窗口 4.资源管理器地址栏前+cmd 空格 管理员身份运行 常用的Dos命令 #盘符切 ...

  2. PMP之挣值管理(PV、EV、AC、SV、CV、SPI、CPI)的记忆方法

    挣值管理法中的PV.EV.AC.SV.CV.SPI.CPI这些英文简写相信把大家都搞得晕头转向的.在挣值管理法中,需要记忆理解的有三个参数:PV.AC.EV. PV:计划值,在即定时间点前计划完成活动 ...

  3. 给windows右键添加快捷启动程序

    给windows右键添加快捷启动程序 修改点击空白处的右键 运行--redegit 打开注册表 展开第一个H..C..R 找到 Direcory,展开 找到Background 展开 右键shell, ...

  4. swap分区扩展的三种方法

    redhat linux swap分区扩展的三种方法 2016-12-26 11:41:08 分类: LINUX 原文地址:redhat linux swap分区扩展的三种方法 作者:quanshen ...

  5. 什么是CLI?

    命令行界面(英语**:command-line interface**,缩写]:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后, ...

  6. Flask-Script使用教程

    Flask使用第三方脚本 一个干净的项目准备: 一个干净的Flask项目连接地址: https://pan.baidu.com/s/123TyVXOFvh5P7V8MbyMfDg 话不多说,上菜: 1 ...

  7. Arthas之实例操作

    Arthas之实例操作 1. 静态类属性操作 获取public静态属性 ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@pu ...

  8. Windows常用快捷操作

    Windows操作系统作为目前最广泛使用的PC端OS,掌握一些快捷键,方便快速在Windows系统下进行操作. 下面收集整理了一些常用的快捷操作: Ctrl + A   全选 Ctrl + C   复 ...

  9. 面试BAT,你凭什么说你掌握了CSS

    介绍 项目已经开源:https://github.com/nanhupatar... 欢迎PR 推荐 关注我们的公众号 display: none; 与 visibility: hidden; 的区别 ...

  10. js如何获取iframe页面内的对象

    简单介绍iframe标签,所有的浏览器都支持<iframe>标签,iframe 元素会创建包含另外一个文档的内联框架(即行内框架).通常我们常用的iframe标签的属性有:width(if ...