版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/mobilebbki399/article/details/78359903
unity项目开发过程中会需要使用到unityeditor的相关api来扩展编辑器,其中EditorWindow可以方便的开发编辑器窗口,可以用来开发打包工具等。但当遇到复杂编辑器需求时,往往会纠结于编辑器的布局而花掉一些时间。
最近尝试写了一套用于实现EditorWindow内部的子窗体的功能,尝试通过可活动的子窗体的方式来加快布局,效果如下:
主要实现了一个子窗体树结构,通过反射的方式来获取标有EWSubWindowAttribute的子窗体绘制函数(或EWSubWindowHandlerAttribute的子窗体绘制对象类)来作为一个窗体叶子节点进行绘制,一个SubWindow树有一个根节点,根节点下包含各个层级的子节点,其中每个节点的子节点权重和为1,权重以子窗口的绘制区域的形式来表现,通过调整每个子窗口大小即修改了节点的权重。
因此在实现EditorWindow时可以不考虑布局,直接编写子窗体绘制函数,通过运行时灵活调整各子窗体的布局:
[EWSubWindow("SunWinA", EWSubWindowIcon.Game)]
private void SubWinA(Rect main)
{
GUI.Label(new Rect(main.x, main.y, main.width, 20), "SubWinA");
}
[EWSubWindow("Grid", EWSubWindowIcon.Game, true, SubWindowStyle.Grid)]
private void SubWinA(Rect main)
{
if (GUI.Button(new Rect(main.x, main.y, 100, 20), "Btn"))
{
}
}
并且支持保存布局:
支持自定义子窗体的样式:
支持子窗体添加帮助栏和工具栏:
[EWSubWindow("SunWinB", EWSubWindowIcon.None, true, SubWindowStyle.Default, EWSubWindowToolbarType.Normal)]
private void SubWinB(Rect main, Rect toolbar)
{
GUI.Label(new Rect(main.x, main.y, main.width, 20), "这是一个有Toolbar的SubWindow");
if(GUIEx.ToolbarButton(new Rect(toolbar.x,toolbar.y, 100, toolbar.height), "btn")) { }
}
支持子窗体扩展右上角按钮功能:
[EWSubWindowHandle(typeof(TestWinE))]
[System.Serializable]
class TestDrawerForTestWinE2 : SubWindowCustomDrawer, ISubWinCustomMenu, ISubWinLock
通过实现ISubWinCustomMenu和ISubWinLock可以实现窗口自定义右上角按钮功能:
窗口开启和关闭: