UE4 Unlua源码解析11 - 非UE4反射支持的静态类导出给Lua使用原理

Posted 珞珈大胖强TURBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 Unlua源码解析11 - 非UE4反射支持的静态类导出给Lua使用原理相关的知识,希望对你有一定的参考价值。

非UE4反射支持的静态类导出给Lua使用


前面的交互类都是UE4中支持反射的类,那么如果是不支持反射的类,怎么导出给Lua使用呢?答案就是C++静态注册

C++静态注册到Lua是一个强大的功能,UnLua使用类模板,抽象出了一套通用的C++静态注册的宏定义。这里只用一个简单的例子来讲述,其中的原理大同小异。

看看Unlua的例子

struct FTutorialObject

protected:
   FString Name;

public:
   FTutorialObject();

   explicit FTutorialObject(const FString& Name)
      :Name(Name)
   
   

   FString GetTitle() const
   
      return FString::Printf(TEXT("《%s》"), *Name);
   

   FString ToString() const
   
      return GetTitle();
   
;
FTutorialObject::FTutorialObject()



static int32 FTutorialObject_New(lua_State* L)

	const auto NumParams = lua_gettop(L);
    if (NumParams != 2)
    
        UNLUA_LOGERROR(L, LogUnLua, Log, TEXT("%s: Invalid parameters!"), ANSI_TO_TCHAR(__FUNCTION__));
        return 0;
    

    const char* NameChars = lua_tostring(L, 2);
    if (!NameChars)
    
        UE_LOG(LogUnLua, Log, TEXT("%s: Invalid tutorial name!"), ANSI_TO_TCHAR(__FUNCTION__));
        return 0;
    

    const auto UserData = NewUserdataWithPadding(L, sizeof(FTutorialObject), "FTutorialObject");
    const auto Name = UTF8_TO_TCHAR(NameChars);
	new(UserData) FTutorialObject(Name);
    return 1;


###1
static const luaL_Reg FTutorialObjectLib[] =

     "__call", FTutorialObject_New ,
     nullptr, nullptr 
;
###1
###2
BEGIN_EXPORT_CLASS(FTutorialObject)
###2
###3
ADD_FUNCTION(GetTitle)
ADD_LIB(FTutorialObjectLib)
###3
END_EXPORT_CLASS()
IMPLEMENT_EXPORTED_CLASS(FTutorialObject)

这是导出给Lua使用的原生类

###1自定义了一系列lua_CFunction用来作FTutorialObject的元方法,方便Lua端的操作

###2 通过BEGIN_EXPORT_CLASS宏,展开后发现是根据类名创建一个FExported+类名+Helper的类,此类创建的时候会创建TExportedClass<true, FColor>对象,TExportedClass会被加入LuaContext的ExportedReflectedClasses中。

###3通过ADD_FUNCTION宏,把函数导出

在前面讲过的RegisterClass的时候,会拿到然后传递给RegisterClassCore中注册

遍历所有静态导出类,调用Register方法

真正的注册实现代码

以上是关于UE4 Unlua源码解析11 - 非UE4反射支持的静态类导出给Lua使用原理的主要内容,如果未能解决你的问题,请参考以下文章

UE4 Unlua源码解析11 - 非UE4反射支持的静态类导出给Lua使用原理

UE4 Unlua源码解析5 - FLuaContext内重要方法逐行解释

UE4 Unlua源码解析5 - FLuaContext内重要方法逐行解释

UE4 Unlua源码解析1 - 读源码的前置知识

UE4 Unlua源码解析1 - 读源码的前置知识

UE4 Unlua源码解析12 - Lua与UE4的混合GC