参考:https://blog.csdn.net/qq_35361471/article/details/84713382
****
一、编辑器开发入门
****
编辑器扩展概念
Unity编辑器扩展是对现有的Unity进行自定义功能扩展的一种方法,可以简化一些重复的开发动作,也可以用于制作插件。
Unity的编辑器扩展绝大部分是用于unity的编辑器模式下,我们扩展的方法是为了提高开发效率。
但这些方法在游戏运行时并没有作用,不需要将他们打包进工程,所以我们需要把这些不需要打包的资源和脚本放在名字是Editor的文件下,这个文件可以是根目录也可以是子目录。
编辑器扩展包含:插件拓展、组件拓展
1、Editor文件夹
01、 Editor文件夹名字是固定的,大小写固定。
02、 Editor文件夹下放的是与编辑器相关的文件。
03、 Editor文件夹下所有资源是不会被打包的。
2、添加菜单栏“自定义按钮”——MenuItem
1 | namespace Editor |
1 | //第一个参数为菜单的路径; |
第二个参数,用来判断是否是有效函数,是否需要显示;用Validate方法启动为ture来验证是否需要显示!
1 | [ ] |
3、给某个组件添加右键的菜单选项——MenuItem(“CONTEXT/…”)
** 方法一:**给系统内置组件添加右键菜单选项
1 | namespace Editor |
方法二:普通脚本的方法添加到右键菜单选项。
01、[ContextMenu(“”) 给方法添加
1 | [ ] |
02、[ContextMenuItem(“”)] 给字段添加
1 | [ ] |
1 | void AddHp() |
4、Selection类的使用
1 | [ ] |
1 | [ ] |
5、添加快捷键
1 | //可以指定快捷键%_t(cmd_t) |
符号字符%Ctr/Command#Shift&AltLEFT/Right/UP/DOWN方向键F1-F2F功能键_g字母g
二、创建编辑器窗体
创建编辑器窗体01——ScriptabeWizard.DisplayWizard
创建窗体的第一种方式:
1 | namespace Editor |
1 | [ ] |
01、规范写法:
1 | namespace Editor |
02、窗体的创建,ScriptableWizard.DisplayWizard的使用!**OnWizardCreate()**的Creat按钮点击的使用!
1 | namespace Editor |
** OnWizardUpdate() **的使用!
1 | //当前字段修改的时候被调用,显示提示框helpString/errorString的使用。 |
1 | private void OnSelectionChange()//Editor自带的方法 |
**03、显示提示信息 **ShowNotification(new GUIContent(“”)的使用
1 | private void OnWizardOtherButton() |
04、数据保存的方法 (与P****layerPrefs对应的EditorPrefs)
本质是key、value的形式保存。P****layerPrefs需要拓展!,另外Redis的拓展!
数据的持久化保存(数据的初始化保存下)
1 | private const string ChangeStartHealthKey = "初始化开始血量"; |
1 | private void OnEnable() |
1 | EditorPrefs.SetInt(ChangeStartHealthKey,changeStartHealthValue);//编辑模式下的数据初始化 |
05、****EditorUtillity编辑器实用(工具)类
一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。
“模态”:模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,****必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。
第一种:EditorUtility.DisplayDialog****
1 | using UnityEngine; |
第二种:EditorUtility.DisplayDialogComplex
1 | using UnityEngine; |
第三种:EditorUtility.DisplayProgressBar进度条的使用
1 | private void OnWizardCreate()//监听"LJK创建"按钮的点击 |
创建编辑器窗体02—EditorWindow
创建窗体的第二种方式:EditorWindow.GetWindow();
1 | namespace Editor |
-
三、Unity编辑器的相关特性
01、System命名空间下
特性描述代码样例图示Serializable序列化一个类,作为一个子属性显示在监视面板。NonSerialized反序列化一个变量,并且在监视版上隐藏。
02、UnityEngine命名空间下
特性描述代码样例图示AddComponentMenu可以添加一个组件菜单项到编辑器里。AssemblyIsEditorAssembly汇编级别的属性。带了这个属性的类就被认为是编辑器类。只能对于程序集有效,具体怎么用不知道呢,网上也没找到用法。略。ColorUsage可以修改Color的配置,是否显示Alpha通道,或者使用HDR模式。ContextMenu给脚本右键菜单添加一个自定义方法,不能是静态的。ContextMenuItem给字段右键菜单添加一个自定义方法,不能是静态的。CreateAssetMenu用于ScriptableObject的子类,将这个类(相当于资源文件添加到Asset菜单项中),关于ScriptableObject具体可以看这位大神的Blog。Delayed用于float、int、或string变量,只有按了回车或焦点离开字段才会返回新值。DisallowMultipleComponent用于MonoBehaviour或其子类,不能重复添加这个类的组件,重复添加会弹出对话框。ExecuteInEditMode带了这个特性的实例会直接在编辑模式下就执行,但不是像进入游戏模式那样时刻执行:1、Update在这个场景中任意物体变化了执行;2、OnGUI在Game View接收到一个Event时执行;3、OnRenderObject和其他渲染回调函数在Scene View 或 Game View重新渲染时执行。略。GUITarget选择哪些显示器调用OnGUI函数。= =没这能力展现这效果。Header标题特性,给监视版加一个小标题。HelpURL给类提供一个自定义文档URL。如图可以按Ctrl+鼠标左键跳转到目标。同左边。HideInInspector只是隐藏变量在监视板里,不改变序列化属性。ImageEffectAllowedInSceneView使用了这个特性的图像特效可以渲染在 SceneView的摄像机上。ImageEffect这东西在Unity Pro上才有,GG了。ImageEffectOpaque可以在不透明通道直接执行图像特效。详见Unity圣典: 图像特效脚本。ImageEffectTransformsToLDR在HDR渲染模式下,使用图像特效用LDR渲染模式。Multiline可以让string变量在监视板上多加几行。PreferBinarySerialization只能用于ScriptableObject 子类,用二进制序列化,有利于处理大量数据的资源文件,提升读写性能。主要缺点是二进制的文件我们看不懂,还有不能用版本控制软件合并它。不知道怎么举例呢(:з」∠),自己看官网吧。Property这个是监视板里面修改样式的抽象基类,例如显示小标题、显示多行编辑文本等等都是以它为基类。抽象类,没例子,略。Range在监视面板限制int或float类型变量值。但有个BUG,看右边代码,所以个人建议还是用属性(Property)配合Mathf.Clamp使用来限制数值大小。RequireComponent自动添加需要的组件。若已存在则不额外添加。这样脚本就可以安全的使用该组件。RPC用于Networking,但废弃了。略。RuntimeInitializeOnLoadMethod不用作为组件添加到对象也可以直接自动调用初始化方法。要求方法为静态,类、方法可以为私有。当开始游戏就会调用,但有多个这种特性的方法调用顺序是不能确定的。SelectionBase带这个特性的GameObject,如果点击本身就一定选中本身,即便父对象也有这特性;如果子对象没有带这个特性,则当在场景点击子对象时,选中的是带特性的父对象;如果父对象和父父对象都有这特性,选父对象。SerializeField序列化字段,主要用于序列化私有字段。SharedBetweenAnimators用于StateMachineBehaviour,类似prefab,Animator之间公用这个实例,减少内存消耗。暂时略。Space用于在监视板上加空行。TextArea让string在监视板上显示成带滚动条的文本域。Tooltip给监视板的字段添加小贴士。及鼠标指向字段显示的提示。UnityAPICompatibilityVersion用来声明程序集的API版本,避免处理时是否可以用旧版本的Unity API。略。
03、UnityEditor命名空间下
特性描述代码样例图示CallbackOrder所有带order(顺序)回调属性的特性基类。略。CanEditMultipleObjects使自定义编辑器支持同编辑多个对象,一般配合CustomEditor使用类。CustomEditor要自定义编辑器就要加这个特性。CustomPreview添加自定义类型的preview在监视板。暂时略。CustomPropertyDrawer自定义属性渲染,如果要自定义PropertyDrawer或 DecoratorDrawer,要加上这个特性。暂时略。DrawGizmo自定义Gizmo渲染方法任何组件,方法可以定义在任意类而且不用添加到组件,但必须为静态。方法调用了,但不知道为什么没有渲染,暂略。InitializeOnLoad当Unity工程装载时,会自动调用一个类来初始化,这个类必须有静态构造函数。看官网教程。InitializeOnLoadMethod同上,只不过这个是调用静方法。略。MenuItem添加菜单项,必须是静态方法。第二个参数若为true,则会先判断改方法是否返回true,若是,则可以使用,若为false,这按钮是不可用的(灰色的)。更多用法看官网教程这里。PreferenceItem给Preference窗口添加菜单项,调用的也是静态方法。例子是官方的。
Unity编辑器提供了大量的特性,帮助开发者更加便利地开发项目,这里主要介绍三种类别常用的特性,需要注意一些特性属于System、UnityEngine空间,一些又属于UnityEditor空间,并提供一个自定义属性绘制器的案例。
01、常用的属性特性
- [Range(0,100)] //限制数值范围
- [Multiline(3)] //字符串多行显示
- [TextArea(2,4)] //文本输入框
- [SerializeField] //序列化字段,主要用于序列化私有字段
- [NonSerialized] //反序列化一个变量,并且在Inspector上隐藏
- [HideInInspector] //public变量在Inspector面板隐藏
- [FormerlySerializedAs(“Value1”)] //当变量名发生改变时,可以保存原来Value1的值
- [ContextMenu(“TestBtn”)] //组件右键菜单按钮
- [ContextMenuItem(“Reset Value”,“Reset”)] //定义属性的右键菜单
- [Header(“Header Name”)] //加粗效果的标题
- [Space(10)] //表示间隔空间,数字越大,间隔越大
- [Tooltip(“Tips”)] //显示字段的提示信息
- [ColorUsage(true)] //显示颜色面板
1 | [ ] |
02、常用的方法特性
- [DrawGizmo] //用于Gizmos渲染,将逻辑与调试代码分离
- [MenuItem] //添加菜单项
03、常用的类的特性
- [Serializable] //序列化一个类,作为一个子属性显示在监视面板
- [RequireComponent(typeof(Animator))] //挂载该类的对象,必须要有Animator组件
- [DisallowMultipleComponent] //不允许挂载多个该类或其子类
- [ExecuteInEditMode] //允许脚本在编辑器未运行的情况下运行
- [CanEditMultipleObjects] //允许当选择多个挂有该脚本的对象时,统一修改值
- [AddComponentMenu] //可以在菜单栏Component内添加组件按钮
- [CustomEditor] //要自定义编辑器就要加这个特性
- [CustomPropertyDrawer] //用于绘制自定义PropertyDrawer的特性
- [SelectionBase] //选择在场景视图中使用此属性的组件对象,即不会误选中子物体
04、自定义属性特性
1 | using UnityEngine; |
1 | using UnityEngine; |
1 | //测试 |
四、Unity编辑器在Inspector面板上的拓展(EditorGUI(EditorGUILayout)、OnGUI)
1、定义Inspector面板的组件
1 | using UnityEngine; |
![IMAGE](resources/EEB65FE94A64C06ECFDF95D893798C74.jpg =964x324)
![IMAGE](resources/FAA3D8055326AB5EBEC6CBB150DDA37A.jpg =476x947)
1 | using System.Collections; |
![IMAGE](resources/2E9C308DBA7508510926E6A0A78281CD.jpg =473x266)
1 | using System.Collections; |
1 | namespace Editor |
GUIStyle、GUISkin
五、Gizmos辅助调试工具
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/unityNote/UnityBasic/编辑器扩展/
- 版权声明: 梁俊可工作室