UE4 _在遊戲中使用Slate

在遊戲中使用Slate

Slate用戶界面架構
概述
Slate控件可以用於在遊戲中創建平頭顯示信息(HUD)或其他用戶界面(UI)元素, 比如菜單。您一般可以創建一個或多個 容器 控件,每個容器可以包含幾個其他類型的控件, 這些控件負責用戶界面的特定方面。

比如,您可能具有一個針對遊戲HUD的總體控件,同時具有針對主菜單、 選項菜單、暫停菜單、記分板等的各種控件。每種控件又可能由其他 自定義控件、標籤、文本框、圖片及其他類型的元素構成。

然後,可以根據遊戲情境添加或刪除這些容器控件:

  • 當遊戲啓動時,將添加主菜單控件。
  • 當他們選擇菜單中的其中一個選項時 - 可能是啓動遊戲 - 那麼主菜單控件將會被刪除。
  • 如果玩家在任何時候暫停了遊戲,那麼將會添加暫停菜單控件。
  • 當遊戲繼續時,將會刪除暫停菜單控件。
  • 當爲玩家初始化了HUD時,將會添加HUD控件。

項目設置

爲了使用Slate用戶界面架構,您的項目必須進行適當的設置,以便它可以意識到該 架構。這允許您包含 Slate.h 頭文件及引用使用Slate構建用戶界面 所需的各種架構元素。

模塊依賴
Slate架構存儲在幾個模塊中。爲了使您的項目意識到這些模塊的存在, 則必須在 *.build.cs 文件中爲您的項目設置一些依賴項。

您的項目需要訪問的模塊是:

模塊 依賴類型
InputCore 公有
Slate 私有
SlateCore 私有

要想設置Slate模塊的依賴項:

  1. 打開您的項目的 [ProjectName].build.cs
    文件。它位於[ProjectDir]/[ProjectName]/Source/[ProjectName] 目錄中。
  2. 通過將 “InputCore” 添加到 PublicDependencyModuleNames 中,來添加InputCore公有依賴。
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
當創建代碼項目時,InputCore默認設置爲公有依賴。
  1. 添加Slate和SlateCore私有依賴。*.build.cs文件中有一行代碼用於添加私有依賴:
PrivateDependencyModuleNames.AddRange(new string[] {  });

您所需要做的就是將SlateCore和Slate模塊添加到那行代碼中:

PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

根據您創建項目的時機及其引擎版本的不同,它可能已經在 *.build.cs文件中設置了依賴項,但是註釋掉了。您可以簡單地取消註釋適當的代碼行來 設置依賴!
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

顯示控件
爲了在您的遊戲中顯示一個Slate控件,則必須將該控件添加到遊戲視口中。重疊的控件 按照添加它們時指定的Z-排序進行排序,且較大的Z-排序值出現在較小的Z-排序值 的上面。

訪問遊戲視口

遊戲視口是 GameViewportClient 類的一個實例。到當前遊戲視口的引用可以通過 UEngine 的 GameViewport 成員獲得,該成員可以通過使用到遊戲當前UEngine實例 的GEngine 指針訪問。

比如:

GEngine->GameViewport
因爲 GEngine 和 GameViewport 都可以爲 NULL ,所以在您嘗試訪問它們或者 其任何成員時,總是應該判斷它們的值。

向視口中添加控件
Slate控件通過向 GameViewportClient::AddViewportWidgetContent() 傳入一個到該控件的引用(確切地說是 TSharedref ) 來添加到視口中。該函數取入一個控件和Z-排序,Z-排序 向前面所提到的那樣決定了新控件的排列順序。Z-排序是可選的,但是其默認值爲 0 。

到您想添加到視口中的控件的引用可以存儲爲某個類的一個成員,比如您的HUD, 或者可以在調用該函數時創建及傳入該控件。

傳入一個存儲在成員變量中的控件引用(作爲 TSharedPtr ):

GEngine->GameViewport->AddViewportWidgetContent(
    SNew(MyWidgetPtr.ToSharedRef())
);

當將控件傳入到 GameViewportClient::AddViewportWidgetContent() 時使用 SNew() 創建該控件:

GEngine->GameViewport->AddViewportWidgetContent(
    SNew(SWeakWidget)
    .PossiblyNullContent(MyWidgetClass)
); 

或者使用 SAssignNew() 來創建控件,並將它分配給 TSharedPtr 成員,然後傳入它:

GEngine->GameViewport->AddViewportWidgetContent(
    SAssingNew(MyWidgetPtr, SWeakWidget)
    .PossiblyNullContent(MyWidgetClass)
);

從視口中刪除控件
通過向 GameViewportClient::RemoveViewportWidgetContent() 中傳入到先前添加的控件的引用, 可以從視口中單獨地刪除Slate控件。
比如:

GEngine->GameViewport->RemoveViewportWidgetContent(
    SNew(MyWidgetPtr.ToSharedRef())
);

另外,通過調用 GameViewportClient::RemoveAllViewportWidgets() 可以立即刪除所有控件。
比如:

GEngine->GameViewport->RemoveAllViewportWidgets();
因爲 GEngine 和 GameViewport 都可以爲 NULL ,所以在您嘗試訪問它們或者 其任何成員時,總是應該判斷它們的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章