問(wèn)題列表:
- Slate是什么
- 整個(gè)編輯器都是用Slate做得嗎
- 場(chǎng)景的繪制工作是如何與Slate結(jié)合的?
Slate是一套跨平臺(tái)的UI框架,既可以用來(lái)做應(yīng)用程序的UI(如UE4 Editor)珍特、工具的UI乖菱,也可以做游戲中的UI怎披。
經(jīng)過(guò)初略地閱讀Slate源碼,得出如下一個(gè)關(guān)系圖:
解釋:
1. Slate Application表示一個(gè)應(yīng)用程序?qū)ο?br>
2. 應(yīng)用程序?qū)ο?可以有多個(gè)Slate-Window, 每個(gè)Slate-Window對(duì)應(yīng)一個(gè)Native-Window(操作系統(tǒng)提供的窗口);
3. Slate-Window里面有很多Slate Widget對(duì)象,組成了它自己的窗口系統(tǒng)疏尿。 這一套的獨(dú)立的UI系統(tǒng)類似于MyGUI,CEGUI易桃,Windows的視窗系統(tǒng)褥琐。
UE4-Editor就是由多個(gè)Window和每個(gè)Window下的各種Widget組成的,渲染3D場(chǎng)景的那塊也是個(gè)Widget晤郑。
下面是一個(gè)簡(jiǎn)單的布局圖:
以前UE3 Editor是用XWidgets那套跨平臺(tái)UI庫(kù)做的敌呈,每個(gè)控件都是原生窗口。經(jīng)過(guò)Slate這一套后造寝,可以發(fā)現(xiàn):窗口系統(tǒng)這個(gè)行為是一致的(如 鼠標(biāo)磕洪,鍵盤消息,窗口層次)匹舞,以前UE3上的Viewport, ViewportClient, GameViewportClient, LevelEditorClient這一套都是適用的褐鸥。
現(xiàn)在用了Slate這一套針對(duì)這個(gè)Native-Window上的繪制流程就如下了:
- 先繪制3D場(chǎng)景Widget (NOTE: 這個(gè)用于繪制3D場(chǎng)景Widget的下面是不會(huì)有其它Widget的 :-) )
- 再繪制其它Slate-Widgets
下面看一下Intel GPA的分析截圖
Editor模式:
PIE模式:
可以看出PIE中的游戲UI是 Slate Widget實(shí)現(xiàn)(UMG包裝了Slate Widget,使之融合到對(duì)象系統(tǒng))赐稽,這些UI Widget是GameViewport Pannel的子控件叫榕。
*關(guān)于C++中創(chuàng)建Slate界面
Slate通過(guò)宏和重載C++運(yùn)算符實(shí)現(xiàn)聲明式語(yǔ)法, 在C++源碼中就可以體現(xiàn)出窗口的層次布局:
// 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()
]
]
]
]
];