看起來簡單的東西,UnLua 做的不是很完備,實際項目使用時藏了一些坑,之前沒怎么上心,斷斷續(xù)續(xù)改,總還是有問題 ,今天徹底解決這個問題
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元棲霞做網(wǎng)站,已為上家服務(wù),為棲霞各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792Module Locator 是什么Lua 接入引擎后一般需要 C++ 重寫 require
UnLua 提供了一個基類ULuaModuleLocator
,有Locate
接口返回 Lua 路徑
UCLASS()
class UNLUA_API ULuaModuleLocator : public UObject
{GENERATED_BODY()
public:
// 定位 Object 對應(yīng)的 Lua 文件路徑
virtual FString Locate(const UObject* Object);
};
默認(rèn)實現(xiàn)長這樣,返回UObject->Class->CDO->GetModuleName()
,即一個 Object 的 UClass 實現(xiàn)了 UnLuaInterface,就綁定了Lua,運(yùn)行時會去加載GetModuleName
返回的 Lua 文件路徑
FString ULuaModuleLocator::Locate(const UObject* Object)
{const UObject* CDO;
if (Object->HasAnyFlags(RF_ClassDefaultObject | RF_ArchetypeObject))
{CDO = Object;
}
else
{const auto Class = Cast(Object);
CDO = Class ? Class->GetDefaultObject() : Object->GetClass()->GetDefaultObject();
}
if (CDO->HasAnyFlags(RF_NeedInitialization))
{// CDO還沒有初始化完成
return "";
}
if (!CDO->GetClass()->ImplementsInterface(UUnLuaInterface::StaticClass()))
{return "";
}
return IUnLuaInterface::Execute_GetModuleName(CDO);
}
LyraWithUnLua Demo 里提供了一個實現(xiàn)ULyraLuaModuleLocator
,核心是藍(lán)圖類使用藍(lán)圖資源路徑,自動生成 Lua 路徑
// 2. if this is blueprint, fallback to generate name by asset path
// NOTE will try to remove prefix W_, UI_, GA_
if (ModuleName.IsEmpty() && !Class->IsNative() && !CheckSuperModuleName())
{// 藍(lán)圖類使用資源路徑
ModuleName = Class->GetPackage()->GetName();
ModuleName = ModuleName.Replace(TEXT("/"), TEXT("."));
TArrayParts;
ModuleName.ParseIntoArray(Parts, TEXT("."));
if (Parts.Num() >0)
{auto& LastPart = Parts[Parts.Num() - 1];
int32 Index = 0;
if (LastPart.FindChar('_', Index) && Index< 4)
{ LastPart.RightChopInline(Index + 1);
}
ModuleName = FString::Join(Parts, TEXT("."));
}
}
問題ULyraLuaModuleLocator
一開始很方便,但是這個接口設(shè)計犯了一個錯,就是一個接口干了兩個接口的活,導(dǎo)致用這個接口怎么也干不好,參考realloc
,同時干malloc
和free
兩件事
ULyraLuaModuleLocator
的問題在于,藍(lán)圖類構(gòu)造了繼承鏈之后
這里用 C++ 代表 藍(lán)圖代碼
在基類上綁定 Lua,預(yù)期是只有基類綁定了 Lua,但是實際是派生類 也自動綁定了 Lua,運(yùn)行時會找不到 Lua 文件,然后報錯
class BP_A : UnLuaInterface {GetModuleName =>"BP_A"; }
class BP_B : BP_A {GetModuleName =>""; } // 派生,沒綁Lua
class BP_C_DataOnly : BP_B {GetModuleName =>""; } // 派生,沒綁Lua
class BP_A : UnLuaInterface {GetModuleName =>"BP_A";
virtual
}
class BP_B : BP_A {GetModuleName =>""; } // 派生,沒綁Lua
class BP_C_DataOnly : BP_B {GetModuleName =>""; } // 派生,沒綁Lua
解決分兩個接口來做
ULyraLuaModuleLocator
,只有這個按鈕會走這里ULuaModuleLocator
,簡單,穩(wěn)定,快速【UnLua】Super 繼承和 override_zoloypzuo的博客-博客
這篇文章中,我們仔細(xì)討論了繼承的情況,建議閱讀,兩篇文章有關(guān)聯(lián)
小結(jié)主要是編程上的注意
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧