SLua UE中LUA方法传递给C++的几种方式和使用说明
-
我们在写代码的时候,大多数游戏逻辑都是用的LUA,这都是为了方便热更新修复BUG,在UE4中,LUA传递到C++,然后C++再执行,这有两种方式,一个是直接传递函数的方法,另外一个是声明委托,委托用于实现事件和回调机制的执行,像这样的需要再Lua中创建代理函数执行,如下所示。
-
LUA中直接传递方法的使用,例如在C++中的代码:
-
class Foo { LuaClassBody() public: void setCallback(const TFunction<void(int)>& func) { callback = func; } void docall() { if(callback) { callback(1024); callback = nullptr; } } TFunction<void(int)> callback = nullptr; } //导出类和函数 DefLuaClass(Foo) DefLuaMethod(virtualFunc,&Foo::virtualFunc) DefLuaMethod(setCallback,&Foo::setCallback) DefLuaMethod(docall,&Foo::docall) EndDef(Foo,nullptr)
在Lua中执行,代码如下:
-- test cpp binding
local f1=Foo(1024)
-- test tfunction
f1:setCallback(function(i) print("callback from cppbinding",i) end)
f1:docall()
-
另外一种事件委托的方式,代码如下:
-
在SLuaTestCase.h中 //初始化定义 typedef TFunction<void(bool)> FInitCallback; //声明委托,委托用于实现事件和回调机制,有的可以有参数 DECLARE_DELEGATE(FStartDelegate); DECLARE_DELEGATE_OneParam(FFinishedDelegate, bool); //函数的生命 void TestTypeDefineFunc( const FString& Params, const FInitCallback& OnInitComplete = FInitCallback(nullptr), const FFinishedDelegate& OnFinished = FFinishedDelegate()); 在SLuaTestCase.cpp中实现 void SLuaTestCase::TestTypeDefineFunc(const FString& Params, const FInitCallback& OnInitComplete, const FFinishedDelegate& OnFinished) { if(OnInitComplete) { OnInitComplete(true); } if(OnFinished.ExecuteIfBound()) { OnFinished.Execute(); } UE_LOG(LogTemp,Log,TEXT("FHappyLoader::TestTypeDefineFunc Params:%s"),*Params) }
-
以上测试都写好了以后,怎么导出呢?这里一定要namespace NS_SLUA这个命名空间,代码如下:
-
注:导出的代码最好写在CPP中,如果在.h中,会有各种引用链接的问题 重点:一定要在前面引入slua.h 实现: #include "slua.h" //这里一定要namespace NS_SLUA这个命名空间 namespace NS_SLUA { //导出代码 DefLuaClass(SLuaTestCase) // DefLuaMethod(GetInstance,&SLuaTestCase::GetInstance) //DefLuaMethod_With_Lambda(GetInstance, true, []()->SLuaTestCase* { //return SLuaTestCase::GetInstance(); //}) DefTypeName(FInitCallback)//测试了一下,用DefLuaClass导出也可以 DefTypeName(FStartDelegate) DefTypeName(FFinishedDelegate) //导出方法 DefLuaMethod(TestTypeDefineFunc,&SLuaTestCase::TestTypeDefineFunc) EndDef(SLuaTestCase,nullptr) }
-
在LUA中的调用,如下:
-
--方法的回调 local func = function(bool) print("TestTypeDefineFunc func params bool:",bool) end --委托类型的声明注册回调 local delegate = slua.createDelegate( function() print("TestTypeDefineFunc cpp call lua delegate function") end ) //这里自己去声明单例模式来调用 SLuaTestCase.GetInstance():TestTypeDefineFunc("Lua call cpp test params",func,delegate)
-
结论:
-
cpp中声明的TFunction,在LUA中可以直接传递方法即可
-
cpp中声明的委托,在LUA中必须用slua.createDelegate创建的委托来执行
-
技术交流群:769397359 ,谢绝HR,非技术人员加,谢谢