ue4 classuobject没有成员beginplay_UE4中蓝图函数的泛型
在UE4中,用UFUNCTION(BlueprintCallable) 可以將函數導出給藍圖使用
例如這兩個函數
對應的藍圖調用節點
常規的藍圖函數調用過程
默認的就是由UHT來生成Thunk調用。
在 .generated.h文件中我們可以看到
諸如 DECLARE_FUNCTION(execFUNCTION) 這樣的代碼。
展開 DELCARE_FUNCTION
我們看到一個最終的函數簽名,
void(*)(UObject*Context, FFrame& Stack,void*const Z_Param__Result)
在調用過程中,排除字節碼部分,C++最開始得到的上下文就是如上參數:Object,Stack,和Z_Param__Result
然后通過P_GET_XXX宏從Stack中提取C++類型對象,最終再調用C++函數本身的實現。
由于本文主要用來說明藍圖的泛型,這里略過藍圖虛擬機交互的部分(P_GET_XXX具體可以當做獲得Property和Address然后進行類型轉化或者拷貝賦值的過程封裝。
CustomThunk 調用
UHT允許我們自定義這個上述過程,通過在UFUNCTION標記CustomThunk來實現。
此時,UHT就不再為我們生成包裝調用的代碼,而是需要我們自己來實現了。
CustomThunk只能對static函數使用,需要用到宏:DELCARE_FUNCTION 或 DEFINE_FUNCTION。
并且Thunk函數名需要添加exec前綴:
單純的CustomThunk本身沒有太多用途,上圖是從StackFrame打印堆棧信息,因而只需要FFrame參數。
要發揮威力,還需要配合CustomStructureParam來使用。
藍圖參數泛型:Wildcard
為了讓藍圖傳遞能傳遞泛型參數,通過meta(CustomStructureParam="Param1,Param2") 標記來讓藍圖識別為Wildcard的泛型類型。此時藍圖節點上表現是一個灰色的引腳,一個可以連接任意類型的引腳。
至此,我們可以在C++的CustomThunk函數中動態獲取參數類型,并進行下一步處理。
例如為Struct成員賦值 SetStructurePropertyByName:
如上圖中,通用的給Object的名為PropertyName的FStruct成員賦值,支持任何FSTRUCT類型。
通過StepCompiledIn獲得Property和Address,然后直接對Address進行進一步的操作。
注意這里使用了BlueprintInteralUseOnly標記,表明這個泛型功能是在內部使用的,類型匹配的功能證由上層的節點來靜態保證,所以此處并未利用Property進行類型匹配的判斷。
但是,CustomStructureParam使用還是存在一些不夠靈活的地方,那就是參數名字和個數這個是在UFUNCTION里面寫死的,不支持動態個數。并且在4.25之前,Wildcard支持容器類型也有bug。
藍圖節點泛型:Variadic
到了4.25中
epic修復了Wildcard支持容器類型的bug:Skip type validation of wildcard function arguments in BPs
并且引入了"Variadic"的meta標記來支持動態個數參數:Implemented variadic function support for Blueprints
目前,想使用Variadic功能,需要自定義藍圖節點用C++來為K2Node_CallFunction添加引腳。
想必是想要開發來同時實現K2Node以及對應的CustomThunk+Variadic方法,來保證使用上的安全性。
官方添加的和Python交互的功能 Added a Blueprint node for calling Python with args
應用
針對4.25之前版本,都是沒有Variadic的,藍圖參數是通過若干次的字節碼函數調用塞給C++的。
而有了Variadic,這部分操作就被合并到函數本身的字節碼調用了。
GMP的具體功能請參閱 GenericMessagePlugin(GMP) - 虛幻引擎4商城
總結
以上是生活随笔為你收集整理的ue4 classuobject没有成员beginplay_UE4中蓝图函数的泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: altium 去掉部分铺铜_干货|HFS
- 下一篇: python sql解析引擎_pytho