toLua学习笔记六——C#获取LUA全局函数

文章目录

  • 无参无返回
  • 有参又返回
  • 多返回值
  • 变长参数

无参无返回

1、在lua文件中创建一个无参无返回的函数

testFun = function()
    print("无参无返回")
end

2、第一种获取方法:通过GetFunction方法获取

		LuaFunction function = LuaMgr.GetInstance().LuaState.GetFunction("testFun");
        //调用
        function.Call();

3、第二种方法:通过[函数名]的方式获取

		function = LuaMgr.GetInstance().LuaState["testFun"] as LuaFunction;
        function.Call();

4、第三种方法:首先得到一个luafunctino,然后再转成委托的形式

		function = LuaMgr.GetInstance().LuaState.GetFunction("testFun");
        UnityAction action = function.ToDelegate<UnityAction>();
        action();

有参又返回

1、在lua脚本中创建一个有参又返回的函数

testFun2 = function(a)
    print("有参又返回")
    return a+100
end

2、第一种方法:通过luafunction的call来访问

		function = LuaMgr.GetInstance().LuaState.GetFunction("testFun2");
        //开始使用
        function.BeginPCall();
        //传参
        function.Push(99);
        //传参结束 调用
        function.PCall();
        //执行得到返回值
        int result = (int)function.CheckNumber();
        //执行结束
        function.EndPCall();

3、第二种方法:通过luaFunction的Invoke方法来调用

function = LuaMgr.GetInstance().LuaState.GetFunction("testFun2");
int result = function.Invoke<int,int>(199);

4、第三种方法:转成委托

		function = LuaMgr.GetInstance().LuaState.GetFunction("testFun2");
		Func<int,int> func = function.ToDelegate<Func<int,int>>();
        int result = func(900);

5、第四种方法:通过解析器直接调用

		int result = LuaMgr.GetInstance().LuaState.Invoke<int,int>("testFun2",800,true);

多返回值

1、在lua脚本中创建多返回值函数

testFun3 = function(a)
    print("多返回值")
    return 1,2,false,"123",a
end

2、第一种方法:通过Call的形式

		function = LuaMgr.GetInstance().LuaState.GetFunction("testFun3");
        //开始调用
        function.BeginPCall();
        //传参
        function.Push(1000);
        //传参结束,调用
        function.PCall();
        //得到返回值
        int a1 = (int)function.CheckNumber();
        int b1 = (int)function.CheckNumber();
        bool c1 = function.CheckBoolean();
        string d1 = function.CheckString();
        int e1 =(int)function.CheckNumber();
        //执行结束
        function.EndPCall();

3、第二种方法:通过Out来接
首先定义一个委托

public delegate int customCallOut(int a,out int b, out bool c,out string d,out int e);

然后通过委托中的out接收返回值

		customCallOut callOut = function.ToDelegate<customCallOut>();
        int b2;
        bool c2;
        string d2;
        int e2;
        result = callOut(999,out b2,out c2,out d2,out e2);

注意:如果是自定义委托用来装lua,必须在关键文件CustomSettings.cs中去加上自定义委托

_DT(typeof(customCallOut)),

加上之后点击lua->Generate all生成文件

4、第三种方法:通过Ref来接
首先定义一个委托

public delegate int customCallRef(int a,ref int b, ref bool c,ref string d,ref int e);

然后通过委托中的out接收返回值

		customCallRef callRef = function.ToDelegate<customCallRef>();
        int b3 = 0;
        bool c3 = true;
        string d3 = "";
        int e3 = 0;
        result = callRef(999,ref b3,ref c3,ref d3,ref e3);

注意:如果是自定义委托用来装lua,必须在关键文件CustomSettings.cs中去加上自定义委托

_DT(typeof(customCallRef)),

加上之后点击lua->Generate all生成文件

变长参数

1、首先在lua脚本中定义一个变长参数函数

testFun4 = function(a,...)
    print("变长参数")
    print(a)
    arg = {...}
    for k, v in pairs(arg) do
        print(k,v)
    end
end

2、第一种方法:通过自定义委托接收
首先定义一个委托

public delegate void CustomCallParams(int a,params object[] objs);

然后通过委托中的out接收返回值

		function = LuaMgr.GetInstance().LuaState.GetFunction("testFun4");
        //通过委托装载
        CustomCallParams call = function.ToDelegate<CustomCallParams>();
        call(100,1,true,"123",0,false);

注意:如果是自定义委托用来装lua,必须在关键文件CustomSettings.cs中去加上自定义委托

_DT(typeof(CustomCallParams)),

加上之后点击lua->Generate all生成文件

3、通过luaFunction里面直接call

function = LuaMgr.GetInstance().LuaState.GetFunction("testFun4");
function.Call<int,int,bool,string,int,bool>(100,10,true,"123",0,false);

你可能感兴趣的:(toLua,Unity,lua,unity)