[UE4] C++實現Delegate Event執行個體(例子、example、sample)

來源:互聯網
上載者:User

標籤:turn   log   ue4   path   字串   包括   col   declare   ref   

轉自:http://aigo.iteye.com/blog/2301010

雖然官方doc上說Event的Binding方式跟Multi-Cast用法完全一樣,Multi-Cast論壇上也有很多例子,但是實際是不一樣。。而且論壇上找不到相關例子。後來看了下runtime/core的源碼,Event的binging方式如下(附上完整步驟):

 

1,先定義自訂Event,此例中我們定義在GameMode中,名字叫 MyInitEvent。例子中定義的是無參函數,如果需要帶參數,官方doc講的有

UCLASS()  class MYPROJ_API AMyGameMode : public AGameMode  {      GENERATED_BODY()        public:        AHGameMode();        //定義Event      DECLARE_EVENT(MyUObject, MyInitEvent)            //用於擷取Event引用的函數,方便在GameMode之外執行binding      MyInitEvent& OnInitialize() { return InitEvent; }        private:      //Event執行個體化      MyInitEvent InitEvent;            //Event的binding指標      FDelegateHandle DHandle;  }  

 

2,執行Binding。MyUObject::TestFun是需要被觸發的函數,這裡假設是一個普通的無參成員函數:

MyUObject* MyObj = NULL;    //這裡假設建立MyUObject  if (MyObj)  {      DHandle = MyGameMode->OnInitialize().AddUObject(MyObj, &MyUObject::TestFun);  }  

註:任何UObject的普通函數都可以被設定為Event的回呼函數,但如果函數是UFUNCTION,那麼需要將AddUObject替換為AddUFunction

3,觸發Event,這裡假設在BeginPlay中觸發:

void AMyGameMode::BeginPlay()  {      InitEvent.Broadcast();  }  

4,移除Event,比如之前bingding的event不想再觸發了:

MyGameMode->OnInitialize().Remove(DHandle);  

 

如何用藍圖實現Delegate Event:

當前例子使用的版本是v4.10,示範的內容包括:

按下字母鍵時,去調用事先綁定好的Event Dispatcher,在這個Event Dispatcher中,來實現修改一個widget藍圖中一個button組件的文本。

 

1,先在Project Settings中添加一個輸入動作,名字為TestOutStr,按下V鍵時觸發。

2,在藍圖指令碼中實現調用Event Dispatcher的操作。

這裡已經建好了一個PlayerController的藍圖,名字叫:MyPlayerController_BP。開啟這個藍圖後,建立一個變數:NewVar_0,string類型,預設值為“BBBB”,我們將會把這個“BBBB”字串傳遞到後面定義的Custom Event中,讓button的文本顯示為“BBBB”;

再建立一個Event Dispatcher,名字叫:UpdateBtnTxt,我們需要傳遞參數,所以為這個Event Dispatcher建立一個String參數,參數名為NewString。

3,這個MyPlayerController_BP藍圖的邏輯具體如下:

當按下V鍵時,會觸發UpdateBtnTxt這個事件,同時在螢幕中列印一句“Press V++++”來測試調用Dispatch Event是否執行過。

4,在事先建好的Widget藍圖中添加一個button和一個Text組件,這個button的ID為Button_Txt,後續藍圖中會用到這個ID,Text組件的預設值為AAAA,結構如所示:

5,開啟Widget藍圖的Graph面板,右鍵建立一個Custom Event

6,這個Custom Event名字起為ChangeTxtEvent,由於要接受MyPlayerController_BP藍圖中傳遞過來的string型別參數,所以這裡也建立一個string型別參數,名字為NewParam。

7,最後用藍圖node來連線實現邏輯,我們在Event Construct事件中綁定了事先定義好的Event Dispathcer:UpdateBtnTxt。

MyPlayerController_BP藍圖中調用UpdateBtnTxt時,則會觸發Widget藍圖的Custom Event:ChangeTxtEvent,從而來修改button的文本。

參考資料:

UE4 Event Dispatchers

https://www.youtube.com/watch?v=k-MAALv3P-Y

 

Event Dispatchers

https://docs-origin.unrealengine.com/latest/INT/Engine/Blueprints/UserGuide/EventDispatcher/index.html

 

[UE4] C++實現Delegate Event執行個體(例子、example、sample)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.