前摇 :认识编辑器扩展的必要性
由于各种各样的原因,无论是移动端亦或是主机/PC端,进几年的发行的游戏体量是越来越大。通常来说大体量的游戏开发需要一套很成熟完善的工作流,亦或说有很强的工业化的能力,像R星育碧这样的游戏厂商一定会有非常强大的工业化能力,才能有大表哥这样充斥大量细节或刺客信条这样充斥BUG,口误,是持续迭代的游戏作品
所谓工欲善其事必先利其器,要想提升游戏开发效率,就要有好用的游戏开发工具,说到最后就绕不开游戏开发引擎
游戏业界常说,自研的引擎不一定是最好的,但是最好的引擎一定是自研的,一定程度上说明了定制化引擎存在优势。 虽然像Unity与虚幻这样的商业引擎已经非常成熟好用,但其本身还是通用性的商品,很难在每一个方面都做到很好的适配性
而就Unity引擎,又相比于虚幻来说在整个工作流上表现还不够成熟。操作方式使用习惯上还是存在非常多的程序员思想,很多开发工具可视化程度还不够完善,对于程序员来说也许问题不大,但是对策划与美术来说就非常不友好
各种层面上来说,为提升编辑器的易操作性与保障项目开发独特性,而对编辑器进行扩展魔改,已经变成了游戏开发者所必须的技能之一
发生:Unity编辑器扩展之UI控件
乱七八糟的话说完后,回归正题。根据Unity文档的解释与案例,了解编辑器界面创建过程所需的结构与方法
与做游戏UI界面不同,引擎编辑器界面的搭建完全没有现成控件做可视化搭建,而只能依靠较底层的代码命令手撸完成。不过好在Unity
提供了一套完整的纯代码界面编辑模式,并称其为“即时模式”GUI 系统。关于该系统的具体解释这里直接搬运官方文档的说明:
- “即时模式”
GUI
系统(也称为IMGUI
)是一个完全独立的功能系统,不同于Unity
基于游戏对象的主 UI 系统。IMGUI
是一个代码驱动的GUI
系统,主要用作程序员的工具
虽然该系统与主UI
系统不太相同,但是也同根同源,学习起来难度并不大。通过下面的一个小Demo
来演示IMGUI
的具体使用方法与应该注意的一些点
继承EditorWindow创建编辑器窗口:
编辑器UI
界面展示与逻辑刷新一般都是继承于EditorWindow
这个类来实现的,对其生命周期结构的使用类似于通过编辑继承MonoBehavior
的脚本代码完成游戏生命周期逻辑的实现。两者有着相似的监听事件,一样的周期性刷新方法,所以可以无学习的成功的上手使用
在Unity
中创建并继承于EditorWindow
类编辑器脚本并命名为EditorDemo
,然后使用类中的GetWindow
方法创建CreateWindow
静态方法(注意一定要是静态),通过该静态方法实现编辑器窗口界面的初始化,具体的代码细节如下:
public class EditorDemo : EditorWindow
{
[MenuItem("EditorDemo/Test &1")]
public static EditorDemo CreateWindow()
{
EditorDemo window = GetWindow<EditorDemo>("测试编辑器");
window.autoRepaintOnSceneChange = true;
window.Show();
return window;
}
}
在上面的代码中,会在初始化静态方法上添加MenuItem
命令用以实现在引擎内的上部导航栏中增加一个自定义编辑器的开启页签
- 关于MenuItem:
MenuItem
属性用于向主菜单和检视面板上下文菜单添加菜单项,使用特定格式可以实现一些额外效果,如上面案例中使用反斜杠符号可以创建多个层级的菜单,而“&”符号则可以为该编辑器界面添加开启快捷键(通常与Alt
形成组合键),如图所示:
在对编辑器界面完成初始化的工作后,后面的界面细节需要对EditorWindow
类做一些了解。查阅文档来熟悉以下该类提供的一些消息函数。了解他们分别用来实现不同状态下的哪些编辑器功能:
在上面的消息,对编辑器扩展UI
方面最需要关注的OnGUI
函数,通常来说,界面元素的创建通常都需要写入到改方法内。前面有说到即时模式G