UE4 SlateUI系统初探

问题列表:

  1. Slate是什么
  2. 整个编辑器都是用Slate做得吗
  3. 场景的绘制工作是如何与Slate结合的?

Slate是一套跨平台的UI框架,既可以用来做应用程序的UI(如UE4 Editor)、工具的UI,也可以做游戏中的UI。
经过初略地阅读Slate源码,得出如下一个关系图:

UE4_Slate_Windows.jpg

解释:
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。
下面是一个简单的布局图:

UE4_Editor_Slate_Layout.jpeg

以前UE3 Editor是用XWidgets那套跨平台UI库做的,每个控件都是原生窗口。经过Slate这一套后,可以发现:窗口系统这个行为是一致的(如 鼠标,键盘消息,窗口层次),以前UE3上的Viewport, ViewportClient, GameViewportClient, LevelEditorClient这一套都是适用的。
现在用了Slate这一套针对这个Native-Window上的绘制流程就如下了:

  1. 先绘制3D场景Widget (NOTE: 这个用于绘制3D场景Widget的下面是不会有其它Widget的 :-) )
  2. 再绘制其它Slate-Widgets

下面看一下Intel GPA的分析截图
Editor模式:

UE4_Editor_Slate_GPA.jpeg

PIE模式:

UE4_Editor_PIE_Slate_GPA.jpeg

可以看出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()
                ]
            ]
        ]

    ]
];

你可能感兴趣的:(UE4 SlateUI系统初探)