XLua系列讲解_C#访问Lua中的function类型
方式1:映射到delegate[*推荐使用]优点:性能好,类型安全
缺点:要生成代码(如果没有生成代码会抛InvalidCastException异常)
多返回值要怎么处理?
从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。
---[下面通过一个案例了解具体如何使用]---
1.新建一个 CSharpCallLua.lua.txt 脚本(代码如下)
--[[测试C#访问lua脚本中的 function 类型]]
--测试调用无参数且无返回值函数
function PrecMyFunc1()
print("PrecMyFunc1 调用无参数且无返回值函数")
end
--测试调用有2个参数,无返回值函数
function PrecMyFunc2(num1,num2)
print("PrecMyFunc2 调用有参数,无返回值函数 num1+num2:"..num1+num2)
end
--测试调用有3个参数,无返回值函数
function PrecMyFunc3(num1,num2,num3)
print("PrecMyFunc3 调用有参数,无返回值函数 num1+num2+num3:"..num1+num2+num3)
end
--测试调用有参数,单个返回值函数
function PrecMyFunc4(num1,num2)
print("PrecMyFunc4 调用有参数,单个返回值函数 num1+num2:"..num1+num2)
return num1+num2
end
--测试调用有参数,多返回值函数
function PrecMyFunc5(num1,num2)
local res = num1+num2
print("PrecMyFunc5 调用有参数,多返回值函数 num1+num2:"..num1+num2)
return num1,num2,res
end2.新建一个c#脚本,命名为“CSharpCallFunctionByDele”(代码如下)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;
/// <summary>测试C#调用lua Function类型,方式一:映射到delegate</summary>
public class CSharpCallFunctionByDele : MonoBehaviour
{
private LuaEnv m_LuaEnv;
private delegate void DelAdding(int num1, int num2);
private Action act = null;
private DelAdding act2 = null;
//注意:2个参数以上的委托定义,需要Lua配置文件支持
private Action<int, int, int> act3 = null;
//注意:这个类型委托定义,需要Lua配置文件支持
private Func<int, int, int> act4 = null;
public delegate void DelAddingMutilReturn(int num1, int num2, out int res1, out int res2, out int res3);
private DelAddingMutilReturn act5 = null;
private void Start()
{
m_LuaEnv = new LuaEnv();
m_LuaEnv.DoString("require 'CSharpCallLua'");
act = m_LuaEnv.Global.Get<Action>("PrecMyFunc1");
act2 = m_LuaEnv.Global.Get<DelAdding>("PrecMyFunc2");
act3 = m_LuaEnv.Global.Get<Action<int, int, int>>("PrecMyFunc3");
act4 = m_LuaEnv.Global.Get<Func<int, int, int>>("PrecMyFunc4");
act5 = m_LuaEnv.Global.Get<DelAddingMutilReturn>("PrecMyFunc5");
//测试代码调用
act();
act2(10, 20);
act3(10, 20, 30);
int func4Res = act4(10, 20);
Debug.Log("PrecMyFunc4 的返回结果:" + func4Res);
//测试具有多返回值函数调用
int func5Res1 = 0;
int func5Res2 = 0;
int func5Res3 = 0;
act5(10, 20, out func5Res1, out func5Res2, out func5Res3);
print(string.Format("PrecMyFunc5函数调用返回结果:res1:{0},res2:{1},res3:{2}", func5Res1, func5Res2, func5Res3));
}
private void OnDestroy()
{
//释放Lua环境之前,需要先将委托释放
act = null;
act2 = null;
act3 = null;
act4 = null;
act5 = null;
m_LuaEnv.Dispose();
}
}3. 在 ExampleGenConfig 脚本中,添加如下配置
4.要重新生成一下Xlua脚本
5.运行结果如下
方式2:映射到LuaFunction[*不推荐使用]
优点:使用简单、无需生成代码
缺点:性能不高,不推荐使用
---[下面通过一个案例了解具体如何使用]---
1.新建一个c#脚本,命名为“CSharpCallFunctionByLuaFun”(代码如下)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
/// <summary>测试C#调用lua Function类型,方式二:映射到LuaFunction</summary>
public class CSharpCallFunctionByLuaFun : MonoBehaviour
{
private LuaEnv m_LuaEnv;
private void Start()
{
m_LuaEnv = new LuaEnv();
m_LuaEnv.DoString("require 'CSharpCallLua'");
LuaFunction luaFun1 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc1");
LuaFunction luaFun2 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc2");
LuaFunction luaFun3 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc3");
LuaFunction luaFun4 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc4");
LuaFunction luaFun5 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc5");
//测试代码调用
luaFun1.Call();
luaFun2.Call(10, 20);
luaFun3.Call(10, 20, 30);
object[] luaFun4Res = luaFun4.Call(10, 20);
print("PrecMyFunc4 函数调用返回值:" + luaFun4Res);
object[] luaFun5Res = luaFun5.Call(10, 20);
print(string.Format("PrecMyFunc4 函数调用返回值:res1:{0},res2:{1},res3:{2}", luaFun5Res, luaFun5Res, luaFun5Res));
}
private void OnDestroy()
{
m_LuaEnv.Dispose();
}
}2.运行结果如下
推荐学习资料
XLua入门到精通系列讲解教程目录
Xlua官方插件下载:里面有很多示例工程
lua基础教程:菜鸟教程网
欢迎对Unity技术感兴趣的朋友,加入QQ群:299412191 讨论
页:
[1]