Unity3D Editor 编辑器扩展3 Editor脚本

环境:Unity2017.2 语言:C#

总起:

在编辑Unity项目的时候,总不可能避免的接触到Unity自身自带的Inspector参数调整无法很好的完成某些特定功能的情况。

比方说想要一个按钮直接能跳到游戏的主界面进行调试,然而普通的情况下甚至连添加一个按钮都做不到。

这边推荐一下本人花了20几刀购买的插件——Odin Inspector & Serializer: http://sirenix.net/odininspector。该插件能够摒弃我今天要讲的Editor脚本,非常轻松的就能完成一些炫酷的EditorUI。

Odin,我其实研究的不是太深入,因为在实际的项目中并没有用到,所以该插件的介绍,我想过段时间深入研究后再说。

今天的主角是Editor脚本。

Editor脚本:

♦ 简单介绍

首先Editor脚本必须放在Editor文件夹或其子文件夹下,然后我们来看一个Edior脚本的例子:

//PlayerEditor.cs
[CustomEditor(typeof(Player))]
public class PlayerEditor : Editor
{private SerializedProperty hpProperty;void Awake(){Debug.Log("Awake");}void OnEnable(){Debug.Log("OnEnable");hpProperty = serializedObject.FindProperty("hp");}public override void OnInspectorGUI(){// 更新serializedObject,在OnInspectorGUI一开始就要调用该函数serializedObject.Update();// 创建一个Int的滑动条EditorGUILayout.IntSlider(hpProperty, 0, 100, new GUIContent("HP"));// 使用自定义的滑动条ProgressBar(hpProperty.intValue / 100f, "HP");// 保存所有对脚本修改的值serializedObject.ApplyModifiedProperties();}// 自定义一个滑动条void ProgressBar(float value, string label){Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField");EditorGUI.ProgressBar(rect, value, label);EditorGUILayout.Space();}void OnDisable(){Debug.Log("OnDisable");}void OnDestroy(){Debug.Log("OnDestroy");}
}// Player.cs
public class Player : MonoBehaviour
{public int hp;
}

效果如下:

可以注意到,PlayerEditor是继承于Editor的,除了Awake、OnEnable这类熟悉的生命周期方法外,脚本中很多操作使用到了UnityEditor.dll里的内容,而该dll是不会被打包的,所以非Editor文件夹底下的脚本千万不要引用到UnityEditor这个命名空间了。

Editor父类中的serializedObject代表的正是当前操作的这个脚本,使用以下操作可能更加明了:

Player player = (Player)serializedObject.targetObject;Debug.Log(player.hp);

使用其成员变量targetObject可以直接获取到对应脚本进行操作。

具体OnInspectorGUI中的内容,我不想详细介绍了,主要是使用EditorGUILayout、GUILayout、GUILayoutUtility这三个类。

说到Editor,其实第一篇文章提到的MenuItem最好就是写在这样的脚本中。

♦ Editor脚本的结构

相比于介绍Editor的使用,我更想深入了解一下Editor这个类(使用方面,还有Odin完全可以代替Editor脚本呢)。

Editor的继承结构:Editor -> ScriptableObject -> UnityEngine.Object -> object。

Editor除了继承于ScriptableObject外,还实现了IPreviewable、IToolModeOwner接口。

我们刚刚使用的serializedObject是根据我们写的Component生成的SerializedObject(注意不是Editor的父类ScriptableObject)对象。

Editor的父类ScriptableObject可能很多人都用过,他可以很方便的保存一些配置信息,Prefab、资源引用什么的。

而SerializedObject是UnityEditor命名空间的,用于以通用的方式操作对象的属性,可以自动处理撤销操作,和产生一些预制的样式UI。

看到这里,我越来越好奇Unity的对象序列化了,但是这边反编译的C#脚本引用的都是C++内容。

感觉有些遗憾,手头也没有C++代码,如果有大神指导如何获取该源码,希望能指条明路,谢谢!

个人:

看源码的时候,多数都会追到C++的代码,看得唯一感觉比较友好的就是UGUI的,因为他基本上都是基于C#来编写的,虽然内容比较繁杂,但是总也能理清思路。

我手头上有份Unity4 C++,但感觉不是很全,Transform几个类倒是有,像SerializedObject便找不到了,可能是我姿势不对。

Unity3D Editor 编辑器扩展3 Editor脚本相关推荐

  1. Unity编辑器扩展——在Editor下动态添加监听事件

    对于Unity下例如按钮这种我们可以为它的监听事件手动进行赋值 如果需要通过编辑器扩展来动态为这些监听事件赋值应该如何去实现呢? 首先需要确认的是这些监听事件必须要符合一定的规则才能添加上: 1.必须 ...

  2. Unity Editor 编辑器扩展一 编辑器特殊文件夹及内置资源读取

    目录 目录 编辑器特殊文件夹及内置资源读取 编辑器相关文件夹 读取内置资源包 代码 Test1_1cs 代码Editor1_1cs 这个要放到Editor文件夹内 编辑器特殊文件夹及内置资源读取 使用 ...

  3. Unity3D Editor 编辑器扩展2 选取物体、撤销操作和窗口小部件的显示

    环境:Unity2017.2 语言:C# 总起: 今天主要介绍以下内容: 1.通过MenuCommand.Selection获取选中对象: 2.通过Undo编写可撤销的命令: 3.窗口小部件的显示. ...

  4. Unity Editor 编辑器扩展 五 EditorGUI

    目录 创建一个窗口添加简单控件 制作一个可以渐入渐出的窗口控件 最后做一个比较炫酷的窗口 创建一个窗口,添加简单控件 在Editor创建脚本GUIWindow1如下,添加一些简单的控件,体验一下他们的 ...

  5. 【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

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

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

  7. Unity 编辑器扩展总结 一:编辑器开发入门

    编辑器扩展总结 工欲善其事必先利其器 引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目.如若博客中存在错误,还请不吝赐教.所有参考的博客或者视频 ...

  8. Unity3D使用经验总结 编辑器扩展篇【转】

    一个引擎,最重要的就是工具,工具除了提升开发速度,提供可视化操作环境以外,还带了容错功能. 它使得大家的工作局限在一定的范围内,比如一个变量的配置,或者是一些类型的选择. 使用编辑器,使得既使不太明白 ...

  9. Unity3D 编辑器扩展 跳转显示指定目录

    做编辑器扩展开发时,假如我们生成一个文件到Assets之外的目录,要查看它的时候,需要从系统路径一步步打开到那个目录. Unity给我们提供了一个API可以直接打开指定目录,类似Project窗口右键 ...

最新文章

  1. C++ break语句,continue语句,goto语句
  2. IBM服务器以及本地PC机安装suse linux,oracle测试,遇到的问题有:
  3. 什么是 SAP HCEA
  4. 抽奖 | 送树莓派PICO开发板、机械键盘、声控鼠标
  5. 两个服务之间的调用请求
  6. linux 内核配置 dns,linux bind dns简单配置
  7. struts2标签_select获取action传过来的值
  8. [链接地址] Express 4.x API 中文手册
  9. idea java opts_idea为java程序添加启动参数(program arguments,vm arguments,Environment variable),并在程序中获取使用...
  10. 线性代数知识点总结_[Github项目推荐] 机器学习amp; Python 知识点速查表
  11. java两个项目之间通过webservice调用-源码仅供参考
  12. 在ubuntu - linux系统下装TensorFlow(虚拟机)
  13. 【前端】相信你会用到的一篇笔记---CSS篇(1)
  14. dcs world f15c教学_烟台TSXP57353M【四点零自动化】DCS系统
  15. 如何搜索网易云中的评论
  16. pycharm文件名颜色含义
  17. 《Maven实战》(许晓斌)导读(读书笔记第二次读后感)
  18. linux 符号执行,[原创]符号执行Symcc与模糊测试AFL结合实践
  19. 哪个邮箱好用又安全?最安全的邮箱排名是?
  20. c语言visit函数作用,[求助]二叉树遍历的程序里面的visit函数如何实现

热门文章

  1. 预防死锁的方法以及死锁的检测与解除
  2. 汾阳哪里有计算机培训班,汾阳市2020年第六期 吕梁山护工培训班开班
  3. CAR路里大学堂-汽车测试培训(CANOE)
  4. 《Java程序设计》实验指导——项目3 类与对象
  5. el-table复选框全部勾选以及勾选回显
  6. 呼呼呼呼呼呼呼呼呼好
  7. TCP拥塞控制算法-从BIC到CUBIC
  8. h5移动端使用手机自带软键盘的“前往”、“go”键提交表单
  9. 揪出毛孔粗大4个致命原因
  10. 胆固醇PEG胆固醇,CLS-PEG-CLS