问题列表:
- Slate是什么
- 整个编辑器都是用Slate做得吗
- 场景的绘制工作是如何与Slate结合的?
Slate是一套跨平台的UI框架,既可以用来做应用程序的UI(如UE4 Editor)、工具的UI,也可以做游戏中的UI。
经过初略地阅读Slate源码,得出如下一个关系图:

解释:
1. Slate Application表示一个应用程序对象
2. 应用程序对象 可以有多个Slate-Window, 每个Slate-Window对应一个Native-Window(操作系统提供的窗口);
3. Slate-Window里面有很多Slate Widget对象,组成了它自己的窗口系统。 这一套的独立的UI系统类似于MyGUI,CEGUI,Windows的视窗系统。
UE4-Editor就是由多个Window和每个Window下的各种Widget组成的,渲染3D场景的那块也是个Widget。
下面是一个简单的布局图:

以前UE3 Editor是用XWidgets那套跨平台UI库做的,每个控件都是原生窗口。经过Slate这一套后,可以发现:窗口系统这个行为是一致的(如 鼠标,键盘消息,窗口层次),以前UE3上的Viewport, ViewportClient, GameViewportClient, LevelEditorClient这一套都是适用的。
现在用了Slate这一套针对这个Native-Window上的绘制流程就如下了:
- 先绘制3D场景Widget (NOTE: 这个用于绘制3D场景Widget的下面是不会有其它Widget的 :-) )
- 再绘制其它Slate-Widgets
下面看一下Intel GPA的分析截图
Editor模式:

PIE模式:

可以看出PIE中的游戏UI是 Slate Widget实现(UMG包装了Slate Widget,使之融合到对象系统),这些UI Widget是GameViewport Pannel的子控件。
*关于C++中创建Slate界面
Slate通过宏和重载C++运算符实现声明式语法, 在C++源码中就可以体现出窗口的层次布局:
// Add a new section for static meshes
ContextualEditingWidget->AddSlot()
.Padding( 2.0f )
[
SNew( SDetailSection )
.SectionName("StaticMeshSection")
.SectionTitle( LOCTEXT("StaticMeshSection", "Static Mesh").ToString() )
.Content()
[
SNew( SVerticalBox )
+ SVerticalBox::Slot()
.Padding( 3.0f, 1.0f )
[
SNew( SHorizontalBox )
+ SHorizontalBox::Slot()
.Padding( 2.0f )
[
SNew( SComboButton )
.ButtonContent()
[
SNew( STextBlock )
.Text( LOCTEXT("BlockingVolumeMenu", "Create Blocking Volume") )
.Font( FontInfo )
]
.MenuContent()
[
BlockingVolumeBuilder.MakeWidget()
]
]
]
]
];
网友评论