UE4遊戲中的界面一般用UMG來編輯,邏輯使用藍圖代碼,但如果邏輯複雜,使用藍圖實現就會比較亂,也不好維護,所以在C++工程中我們通常可以將大部分代碼在C++中實現,只留出幾個供藍圖調用的接口。如果不想寫藍圖代碼,而是完全在C++中實現,這樣就能將界面與邏輯就分離開,便於後期維護和修改,通過下面的方法可以實現。
1、首先創建一個繼承自UUserWidget的C++類
UCLASS()
class UMainWidget : public UUserWidget
{
GENERATED_BODY()
public:
bool Initialize() override;
virtual void NativeConstruct();
};
2、在UE4編輯器中創建一個Widget Blueprint資源(UMG),命名爲UMG_MainWidget,雙擊打開,切換到Graph頁面,在工具欄上點擊Class Settings按鈕,激活類設置,
3、將父類選擇爲UMainWidget,如下圖所示
4、在UMG_MainWidget的Designer頁面隨便編輯界面,我在上面放置了一個文本和一個按鈕,文本顯示數字,按鈕每按下一次,數字加1。文本控件的名稱是TextBlock_Number,按鈕控件的名稱是Button_AddOne,後面會用到他們的名稱
5、在MainWidget.h文件中添加1個成員函數和3個成員變量,說明如下
UFUNCTION()
void OnAddOneClicked();//按鈕點擊事件,這裏必須加上UFUNCTION()
UButton* m_btnAddOne;//保存按鈕控件的指針
UTextBlock* m_tbNumber;//保存文本控件的指針
int32 m_number;//表示當前數字
6、在MainWidget.cpp文件中實現Initialize和NativeConstruct以及OnAddOneClicked函數
bool UMainWidget::Initialize()
{
if (!Super::Initialize())
{
return false;
}
m_btnAddOne = Cast<UButton>(GetWidgetFromName("Button_AddOne"));//通過名稱查找UMG中的控件
m_tbNumber = Cast<UTextBlock>(GetWidgetFromName("TextBlock_Number"));
return true;
}
void UMainWidget::NativeConstruct()
{
Super::NativeConstruct();
if (m_btnAddOne)
{
m_btnAddOne->OnClicked.AddDynamic(this, &UMainWidget::OnAddOneClicked);
}
m_number = 0;
}
void UMainWidget::OnAddOneClicked()
{
if (m_tbNumber)
{
m_number++;
m_tbNumber->SetText(FText::AsNumber(m_number));
}
}
7、將UMG_MainWidget在遊戲運行後添加到屏幕就可以實現以上功能了,要修改界面樣式只需要在編輯器中修改,然後在C++中獲取相應的控件,然後實現邏輯代碼。