实例甜点 Unreal Engine 4迷你教程(4)之用C++实现添加子Widget到VerticalBox中以及ClearChildren...
前置教程:
1. 實(shí)例甜點(diǎn)前面的三篇教程;
2. 最好看看筆者前面的一篇關(guān)于博文(后記:本來筆者想用C++做DragAndDrop的功能,但是失敗了,下面是藍(lán)圖實(shí)現(xiàn)的方法):
http://www.cnblogs.com/JackSamuel/p/jack975645419_0.html
?
?
重要說明:本實(shí)例是在《實(shí)例甜點(diǎn)?Unreal Engine 4迷你教程(1)》所建立的工程LearnWidget上進(jìn)行的。
第1步:我們想要創(chuàng)建兩個Widget管理者,回顧一下目前已有的WidgetMng類,它有如下成員和方法:
?
UPROPERTY()
class?UUserWidget* SlaveWidget;【我所管理的奴隸widget】
?
UFUNCTION()
void?Initialize();【我為我的slavewidget初始化】
?
為了使用它們,并且擴(kuò)展一些新功能,我們創(chuàng)建2個WidgetMng的子類:
?
?
?
(我究竟想干啥??我希望能夠?qū)崿F(xiàn)背包系統(tǒng),就是有物品從1背包到2背包,請先看這篇博文:http://www.cnblogs.com/JackSamuel/p/jack975645419_0.html
但是摸索了一段時間之后沒有找到方法,所以本文的目的就只是用C++來為VerticalBox添加子Widget)
同樣,創(chuàng)建Bag2Mng(繼承自WidgetMng)和ItemMng(繼承自WidgetMng);
?
第2步:創(chuàng)建一個widget叫做Widget_Item(它作為ItemMng的奴隸Widget);
第3步:創(chuàng)建一個Widget叫做Widget_Bag1(它做誰的奴隸呢?看名字就能知道了吧)。配置如下(如果你沒有辦法通過圖片來看出怎么拼UMG,請前往學(xué)習(xí)更為基礎(chǔ)的部分):
?
第4步:創(chuàng)建一個叫做Widget_Bag2的Widget,和上面的Widget_Bag1差不多就行。【后記:Bag2這個類可以不實(shí)現(xiàn),沒有找到通過C++實(shí)現(xiàn)DragAndDrop的方法】
?
第5步:改一下小部件的變量名:(這一步有許多小操作,注意別飯粗心了哦)
(WidgetBag1和Bag2都這樣改)
?
?
第6步:創(chuàng)建藍(lán)圖子類(這一步是非常有必要的,通常C++純類很難使用,都是用BP來包裝,暴露給Editor使用的):
用上面提到的三個類繼承三個BP如下:
第7步:記得在BPHUD中調(diào)整:
保存編譯,運(yùn)行效果:
可以看到,左邊和右邊分別是背包1,和背包2.
?
第8步:【重要的一步】
加入清空兒子的邏輯:
#include "Bag1Mng.h"#include "Runtime/UMG/Public/Components/VerticalBox.h"#include "Runtime/UMG/Public/Components/TextBlock.h"void ABag1Mng::Initialize(){Super::Initialize();VerticalBox = Cast<UVerticalBox>( SlaveWidget->GetWidgetFromName(TEXT("VB")) );if (VerticalBox){VerticalBox->ClearChildren();//【請注意這個函數(shù)】 }}?
?
效果:
左側(cè)的背包1的所有兒子都被清空了;
?
第9步:【本步驟企圖完成:初始化20個孩子對應(yīng)20個序號在背包1中】
修改代碼如下:
▼代碼開始 void ABag1Mng::Initialize() {Super::Initialize();VerticalBox = Cast<UVerticalBox>( SlaveWidget->GetWidgetFromName(TEXT("VB")) );if (VerticalBox){VerticalBox->ClearChildren();}for (auto i = 0; i < 20; i++){UUserWidget* NewKid = CreateWidget<UUserWidget>(GWorld->GetGameInstance(), ItemWidgetClass);VerticalBox->AddChildToVerticalBox(NewKid);if(UTextBlock* Text_ID = Cast<UTextBlock>(NewKid->GetWidgetFromName(TEXT("Text_ID"))))Text_ID->SetText(FText::AsNumber(i));} } ▲代碼結(jié)束效果:
(重要的提示:如果讀者已經(jīng)跟丟了步驟,某些小細(xì)節(jié)沒有完全一致,那么也沒有關(guān)系,實(shí)在沒有辦法效果一致的話就只看里頭的代碼,和我的效果圖即可,主要是在UMG的C++編程上有一個基本的掌握)
?
?
——小江村兒的文杰 zouwj5@qq.com?2017年8月4日13:57:11
?
轉(zhuǎn)載于:https://www.cnblogs.com/JackSamuel/p/7284915.html
總結(jié)
以上是生活随笔為你收集整理的实例甜点 Unreal Engine 4迷你教程(4)之用C++实现添加子Widget到VerticalBox中以及ClearChildren...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金融431可以带计算机,南京大学金融43
- 下一篇: nginx使用limit_req_zon