標籤: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)