C#调用Lua 5、从lua中获取全局函数

首先老样子:

创建Lua解析器,执行Dotring("require('lua脚本')")

之前获取全局变量使,我们都创建了相应变量的对象去存储。 那么lua中相应函数类型的变量我们怎么存储呢?

C#的委托!刚好满足了需求。

lua中的函数

C#调用Lua 5、从lua中获取全局函数_第1张图片

//无参无返回的获取

 我们首先先定义一个无参无返回的委托:

public delegate void CustomCall();

然后和引用Lua全局变量一样,使用函数就是调用创建的委托对象。

        //无参无返回的获取
        //委托
        CustomCall call = LuaManager.GetInstance().Global.Get("testFun");
        call();

以上是我们自己创建的无参无返回委托。还有三种:

        //unity自带委托
        UnityAction ua = LuaManager.GetInstance().Global.Get("testFun");
        ua();

        //c#自带委托
        Action ac = LuaManager.GetInstance().Global.Get("testFun");
        ac();

        //xlua提供的一种获取函数的方式 少用
        LuaFunction lf = LuaManager.GetInstance().Global.Get("testFun");
        lf.Call();

注意:Xlua提供了一种无参无返回的方法。这个知识点很重要,将会对下面进行一些解释。

//有参有返回的获取

首先我们和无参无返回一样创建委托:

public delegate int CustomCall2(int a);
        //********************************************************************************
        //有参有返回的获取(需要加特效)
        CustomCall2 call2 = LuaManager.GetInstance().Global.Get("testFun2");
        int q =call2(1);

        //C#自带
       Func sFun = LuaManager.GetInstance().Global.Get("testFun2");
        Debug.Log("有参有返回:" + sFun(10));

        //xlua提供的一种获取函数的方式
        LuaFunction lf2 = LuaManager.GetInstance().Global.Get("testFun2");
        Debug.Log("有参有返回:" + lf2.Call(30)[0]);

然后就报错了

 它说,这个类型必须添加CSharpCallLua。

为什么无参无返回没有这个报错,有参有返回报错了呢?因为无参无返回xlua以及提供了对应语法。

想要获取有参有返回的lua函数需要在C#的委托上加上[CSharpCallLua]特性

[CSharpCallLua]
public delegate int CustomCall2(int a);

C#调用Lua 5、从lua中获取全局函数_第2张图片

//lua中多返回值的函数

C#中不存在多返回值函数,因此我们需要另辟蹊径。使用out 和 ref来完成lua多返回值

定义委托:

[CSharpCallLua]//多返回值
public delegate int  CustomCall3(int a,out int b,out bool c,out string d,out int e);

 out值 不需要初始化

//********************************************************************************
        //多返回值
        //使用out 和 ref来使用
        CustomCall3 call3 = LuaManager.GetInstance().Global.Get("testFun3");
        int b;
        bool c;
        string d;
        int e;
        Debug.Log("第一个返回值:" + call3(100, out b, out c, out d, out e));
        Debug.Log(b+"-"+c+"_"+d+"_"+e);

此委托的返回值 为第一个值int类型 1,之后的返回值都存储在out对象中。

 ref值需要初始化:

        [CSharpCallLua]
        public delegate int CustomCall4(int a, ref int b, ref bool c, ref string d, ref int e);

        CustomCall4 call4 = LuaManager.GetInstance().Global.Get("testFun3");
        int b1= 0;
        bool c1 = true;
        string d1 = "";
        int e1 = 0;
        Debug.Log("第一个返回值:" + call4(200,ref b1,ref c1,ref d1,ref e1));
        Debug.Log(b + "-" + c + "_" + d + "_" + e);

xlua

        //Xlua
        LuaFunction lf3 = LuaManager.GetInstance().Global.Get("testFun3");
        //Debug.Log("有参有返回:" + lf3.Call(30)[0]);
        object[] obj =  lf3.Call(1000);//相当于执行lua中的testFun3(1000)返回的是一个数组
        for (int i = 0; i < obj.Length; i++)
        {
            Debug.Log("第" + i + "个输出为" + obj[i]);
        }

 C#调用Lua 5、从lua中获取全局函数_第3张图片

 C#调用lua变长参数

[CSharpCallLua]
//如果有多个类型的参数,则params修饰的参数数组要放到最后,并且只使用一次
public delegate int CustomCall5(string a,params object[] args );

//如果不知道定义函数内部的类型那就用Object,如果知道函数的多返回值类型,例如都为int的话定义为int[ ] i

//变长参数
CustomCall5 call5 = LuaManager.GetInstance().Global.Get("testFun4");
call5("123", 1, 2, 3, 4, 5, "string");

LuaFunction lf4 = LuaManager.GetInstance().Global.Get("testFun4");
lf4.Call("456", 4, 5, 6, 4, 96);

C#调用Lua 5、从lua中获取全局函数_第4张图片

 

你可能感兴趣的:(热更新,xlua,lua,c#,开发语言)