UE4如何將UMG邏輯代碼在C++中實現

       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++中獲取相應的控件,然後實現邏輯代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章