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