您的位置:首页 > 移动开发 > Unity3D

【Unity编辑器】EditorWindow扩展-SubWindow

2017-10-26 23:14 981 查看
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可以实现窗口自定义右上角按钮功能:



窗口开启和关闭:



源码请到http://www.lsngo.net/2017/10/24/unityeditor_subwindow/下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: