SLua UE中LUA方法传递给C++的几种方式和使用说明

SLua UE中LUA方法传递给C++的几种方式和使用说明

  1. 我们在写代码的时候,大多数游戏逻辑都是用的LUA,这都是为了方便热更新修复BUG,在UE4中,LUA传递到C++,然后C++再执行,这有两种方式,一个是直接传递函数的方法,另外一个是声明委托,委托用于实现事件和回调机制的执行,像这样的需要再Lua中创建代理函数执行,如下所示。

  2. LUA中直接传递方法的使用,例如在C++中的代码:

  3. 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()
  1. 另外一种事件委托的方式,代码如下:

  2. 在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)
    }

  3. 以上测试都写好了以后,怎么导出呢?这里一定要namespace NS_SLUA这个命名空间,代码如下:

  4. 注:导出的代码最好写在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)
    }
  5. 在LUA中的调用,如下:

  6.  --方法的回调
        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)

  7. 结论:

    1. cpp中声明的TFunction,在LUA中可以直接传递方法即可

    2. cpp中声明的委托,在LUA中必须用slua.createDelegate创建的委托来执行

技术交流群:769397359 ,谢绝HR,非技术人员加,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值