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