7.C#调用Lua函数

7.CSharp调用Lua-函数的获取和调用


7.1 知识点

准备工作

初始化Lua管理器,创建Lua脚本并在C#脚本调用

LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson07_CSharp调用Lua_函数的获取和调用");

给Lua脚本添加不同类型的函数

print('我是Lua脚本 Lesson07_CSharp调用Lua_函数的获取和调用')

--无参无返回值
testFun1 = function()
    print("我是Lua无参无返回值函数")
end

--有参有返回值
testFun2 = function(a)
    print("我是Lua有参有返回值函数")
    return a + 1
end

--多返回值函数
testFun3 = function(a)
    print("我是Lua多返回值函数")
    return 1, 2, false, "123", a
end

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

无参无返回值函数的获取和调用

//通过LuaState的GetFunction方法获取函数
LuaFunction testFun11 = LuaManager.Instance.LuaState.GetFunction("testFun1");
//调用
testFun11.Call();//我是Lua无参无返回值函数
//销毁
testFun11.Dispose();


//通过LuaState的中括号获取函数
LuaFunction testFun12 = LuaManager.Instance.LuaState["testFun1"] as LuaFunction;
//调用
testFun12.Call();//我是Lua无参无返回值函数
//销毁
testFun12.Dispose();


//通过LuaState的GetFunction方法获取函数 转成委托 再调用委托
//注意要去LuaManager的构造函数中初始化委托工厂,才能转换成委托
LuaFunction testFun13 = LuaManager.Instance.LuaState.GetFunction("testFun1");
UnityAction testFun13UnityAction = testFun13.ToDelegate<UnityAction>();
//调用
testFun13UnityAction();//我是Lua无参无返回值函数
//销毁
testFun13.Dispose();
  • 函数转成委托要去LuaManager的构造函数或者Init方法中初始化委托工厂
// 初始化委托工厂,用于处理 Lua 和 C# 之间的相互访问
DelegateFactory.Init();

有参有返回值函数的获取和调用

//通过LuaState的GetFunction方法获取函数 Call调用
LuaFunction testFun21 = LuaManager.Instance.LuaState.GetFunction("testFun2");
//开始使用
testFun21.BeginPCall();
//传参
testFun21.Push(10);
//传参结束
testFun21.PCall();
//执行得到返回值
int testFun21Result = (int)testFun21.CheckNumber();
//执行结束
testFun21.EndPCall();
Debug.Log("有参有返回值 Call:" + testFun21Result);//11
//销毁
testFun21.Dispose();


//通过LuaState的GetFunction方法获取函数 Invoke调用
LuaFunction testFun22 = LuaManager.Instance.LuaState.GetFunction("testFun2");
//执行得到返回值 最后一个泛型参数是返回值类型 前面的参数是获取的函数的参数类型 依次往后排
int testFun22Result = testFun22.Invoke<int, int>(20);
Debug.Log("有参有返回值 Invoke:" + testFun22Result);//21
//销毁
testFun22.Dispose();


//通过LuaState的GetFunction方法获取函数 转成委托 再调用委托
LuaFunction testFun23 = LuaManager.Instance.LuaState.GetFunction("testFun2");
//最后一个泛型参数是返回值类型 前面的参数是获取的函数的参数类型 依次往后排
Func<int, int> testFun23Func = testFun23.ToDelegate<Func<int, int>>();
//执行得到返回值
int testFun23Result = testFun23Func(30);
Debug.Log("有参有返回值 委托:" + testFun23Result);//31
//销毁
testFun23.Dispose();


//通过LuaState直接Invoke调用函数
//最后一个泛型参数是返回值类型 前面的参数是获取的函数的参数类型 依次往后排
//依次传入函数名 参数 是否记录函数调用的日志(默认传true就行)
int testFun24Result = LuaManager.Instance.LuaState.Invoke<int, int>("testFun2", 40, true);
Debug.Log("有参有返回值 通过解析器直接执行:" + testFun24Result);//41

多返回值函数的获取和调用

  • 自定义多返回值的委托
//自定义多返回值的委托 第一个a代表Lua函数的参数 第一个返回值通过调用委托获得 其他返回值通过传入out参数获得 
public delegate int TestFun32(int a, out int b, out bool c, out string d, out int e);
//通过LuaState的GetFunction方法获取函数 Call调用依次Check得到多返回值
LuaFunction testFun31 = LuaManager.Instance.LuaState.GetFunction("testFun3");
//开始使用
testFun31.BeginPCall();
//传参
testFun31.Push(100);
//传参结束
testFun31.PCall();
//执行得到返回值
int a1 = (int)testFun31.CheckNumber();
int b1 = (int)testFun31.CheckNumber();
bool c1 = (bool)testFun31.CheckBoolean();
string d1 = (string)testFun31.CheckString();
int e1 = (int)testFun31.CheckNumber();
//执行结束
testFun31.EndPCall();
Debug.Log("Call调用依次Check得到返回值:" + a1 + "_" + b1 + "_" + c1 + "_" + d1 + "_" + e1);//1_2_False_123_100
//销毁
testFun31.Dispose();

//通过LuaState的GetFunction方法获取函数 转成委托 调用委托 使用out来接收多返回值
//toLua使用自定义委托 要在自定义设置脚本CustomSetting中 加入自定义委托 格式参考其他格式即可 添加过后要去菜单栏点击生成所有或者生成委托
LuaFunction testFun32 = LuaManager.Instance.LuaState.GetFunction("testFun3");
TestFun32 testFun32Delegate = testFun32.ToDelegate<TestFun32>();
int b2;
bool c2;
string d2;
int e2;
int testFun32DelegateResult = testFun32Delegate(200, out b2, out c2, out d2, out e2);
Debug.Log("使用out来接收多返回值:" + testFun32DelegateResult + "_" + b1 + "_" + c1 + "_" + d1 + "_" + e1);//1_2_False_123_100
//销毁
testFun32.Dispose();

变长参数函数的获取和调用

  • 变长参数的委托
//变长参数的委托
//变长参数的类型 是根据实际情况来定的
//比如 如果知道Lua的函数只会传int的话也可以使用int的类型的边长参数数组
public delegate void TestFun41(string a, params object[] args);
//通过LuaState的GetFunction方法获取函数 转成委托 调用委托
LuaFunction testFun41 = LuaManager.Instance.LuaState.GetFunction("testFun4");
TestFun41 testFun41Delegate = testFun41.ToDelegate<TestFun41>();
//调用
testFun41Delegate("123", 1, 2, 3, 4, 5, 566, 7, 7, 8, 9, 99);
//销毁
testFun41.Dispose();


//通过LuaState的GetFunction方法获取函数 泛型Call调用
LuaFunction testFun42 = LuaManager.Instance.LuaState.GetFunction("testFun4");
//注意:Call方法没有返回值 没有返回值的函数再用Call
testFun42.Call<string, int, bool, string>("456", 100, true, "6.6");
//销毁
testFun42.Dispose();

7.2 知识点代码

Lesson07_CSharp调用Lua_函数的获取和调用.lua

print('我是Lua脚本 Lesson07_CSharp调用Lua_函数的获取和调用')

--无参无返回值
testFun1 = function()
    print("我是Lua无参无返回值函数")
end

--有参有返回值
testFun2 = function(a)
    print("我是Lua有参有返回值函数")
    return a + 1
end

--多返回值函数
testFun3 = function(a)
    print("我是Lua多返回值函数")
    return 1, 2, false, "123", a
end

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

Lesson07_CSharp调用Lua_函数的获取和调用

using LuaInterface;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;


//自定义多返回值的委托 第一个a代表Lua函数的参数 第一个返回值通过调用委托获得 其他返回值通过传入out参数获得 
public delegate int TestFun32(int a, out int b, out bool c, out string d, out int e);

//变长参数的委托
//变长参数的类型 是根据实际情况来定的
//比如 如果知道Lua的函数只会传int的话也可以使用int的类型的边长参数数组
public delegate void TestFun41(string a, params object[] args);

public class Lesson07_CSharp调用Lua_函数的获取和调用 : MonoBehaviour
{
    void Start()
    {
        LuaManager.Instance.Init();
        LuaManager.Instance.Require("Lesson07_CSharp调用Lua_函数的获取和调用");

        #region 知识点一 无参无返回值函数的获取和调用

        //通过LuaState的GetFunction方法获取函数
        LuaFunction testFun11 = LuaManager.Instance.LuaState.GetFunction("testFun1");
        //调用
        testFun11.Call();//我是Lua无参无返回值函数
        //销毁
        testFun11.Dispose();


        //通过LuaState的中括号获取函数
        LuaFunction testFun12 = LuaManager.Instance.LuaState["testFun1"] as LuaFunction;
        //调用
        testFun12.Call();//我是Lua无参无返回值函数
        //销毁
        testFun12.Dispose();


        //通过LuaState的GetFunction方法获取函数 转成委托 再调用委托
        //注意要去LuaManager的构造函数中初始化委托工厂,才能转换成委托
        LuaFunction testFun13 = LuaManager.Instance.LuaState.GetFunction("testFun1");
        UnityAction testFun13UnityAction = testFun13.ToDelegate<UnityAction>();
        //调用
        testFun13UnityAction();//我是Lua无参无返回值函数
        //销毁
        testFun13.Dispose();

        #endregion

        #region 知识点二 有参有返回值函数的获取和调用

        //通过LuaState的GetFunction方法获取函数 Call调用
        LuaFunction testFun21 = LuaManager.Instance.LuaState.GetFunction("testFun2");
        //开始使用
        testFun21.BeginPCall();
        //传参
        testFun21.Push(10);
        //传参结束
        testFun21.PCall();
        //执行得到返回值
        int testFun21Result = (int)testFun21.CheckNumber();
        //执行结束
        testFun21.EndPCall();
        Debug.Log("有参有返回值 Call:" + testFun21Result);//11
        //销毁
        testFun21.Dispose();


        //通过LuaState的GetFunction方法获取函数 Invoke调用
        LuaFunction testFun22 = LuaManager.Instance.LuaState.GetFunction("testFun2");
        //执行得到返回值 最后一个泛型参数是返回值类型 前面的参数是获取的函数的参数类型 依次往后排
        int testFun22Result = testFun22.Invoke<int, int>(20);
        Debug.Log("有参有返回值 Invoke:" + testFun22Result);//21
        //销毁
        testFun22.Dispose();


        //通过LuaState的GetFunction方法获取函数 转成委托 再调用委托
        LuaFunction testFun23 = LuaManager.Instance.LuaState.GetFunction("testFun2");
        //最后一个泛型参数是返回值类型 前面的参数是获取的函数的参数类型 依次往后排
        Func<int, int> testFun23Func = testFun23.ToDelegate<Func<int, int>>();
        //执行得到返回值
        int testFun23Result = testFun23Func(30);
        Debug.Log("有参有返回值 委托:" + testFun23Result);//31
        //销毁
        testFun23.Dispose();


        //通过LuaState直接Invoke调用函数
        //最后一个泛型参数是返回值类型 前面的参数是获取的函数的参数类型 依次往后排
        //依次传入函数名 参数 是否记录函数调用的日志(默认传true就行)
        int testFun24Result = LuaManager.Instance.LuaState.Invoke<int, int>("testFun2", 40, true);
        Debug.Log("有参有返回值 通过解析器直接执行:" + testFun24Result);//41

        #endregion

        #region 知识点三 多返回值函数的获取和调用

        //通过LuaState的GetFunction方法获取函数 Call调用依次Check得到多返回值
        LuaFunction testFun31 = LuaManager.Instance.LuaState.GetFunction("testFun3");
        //开始使用
        testFun31.BeginPCall();
        //传参
        testFun31.Push(100);
        //传参结束
        testFun31.PCall();
        //执行得到返回值
        int a1 = (int)testFun31.CheckNumber();
        int b1 = (int)testFun31.CheckNumber();
        bool c1 = (bool)testFun31.CheckBoolean();
        string d1 = (string)testFun31.CheckString();
        int e1 = (int)testFun31.CheckNumber();
        //执行结束
        testFun31.EndPCall();
        Debug.Log("Call调用依次Check得到返回值:" + a1 + "_" + b1 + "_" + c1 + "_" + d1 + "_" + e1);//1_2_False_123_100
        //销毁
        testFun31.Dispose();

        //通过LuaState的GetFunction方法获取函数 转成委托 调用委托 使用out来接收多返回值
        //toLua使用自定义委托 要在自定义设置脚本CustomSetting中 加入自定义委托 格式参考其他格式即可 添加过后要去菜单栏点击生成所有或者生成委托
        LuaFunction testFun32 = LuaManager.Instance.LuaState.GetFunction("testFun3");
        TestFun32 testFun32Delegate = testFun32.ToDelegate<TestFun32>();
        int b2;
        bool c2;
        string d2;
        int e2;
        int testFun32DelegateResult = testFun32Delegate(200, out b2, out c2, out d2, out e2);
        Debug.Log("使用out来接收多返回值:" + testFun32DelegateResult + "_" + b1 + "_" + c1 + "_" + d1 + "_" + e1);//1_2_False_123_100
        //销毁
        testFun32.Dispose();

        #endregion

        #region 知识点四 变长参数函数的获取和调用

        //通过LuaState的GetFunction方法获取函数 转成委托 调用委托
        LuaFunction testFun41 = LuaManager.Instance.LuaState.GetFunction("testFun4");
        TestFun41 testFun41Delegate = testFun41.ToDelegate<TestFun41>();
        //调用
        testFun41Delegate("123", 1, 2, 3, 4, 5, 566, 7, 7, 8, 9, 99);
        //销毁
        testFun41.Dispose();


        //通过LuaState的GetFunction方法获取函数 泛型Call调用
        LuaFunction testFun42 = LuaManager.Instance.LuaState.GetFunction("testFun4");
        //注意:Call方法没有返回值 没有返回值的函数再用Call
        testFun42.Call<string, int, bool, string>("456", 100, true, "6.6");
        //销毁
        testFun42.Dispose();

        #endregion
    }

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏