//test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;
using System.IO;
class TableToClass
{
public int a;
public int b;
}
[CSharpCallLua]
interface TableToInterface
{
int A { get; set; }
int B { get; set; }
int Sum(int a, int b);
}
[CSharpCallLua]
delegate int Func(int a, int b);
[CSharpCallLua]
delegate int FuncToDeleWithResult(int a, int b, out int A, out int B);
public class Test : MonoBehaviour
{
void Start()
{
//创建lua虚拟机
LuaEnv env = new LuaEnv();
//为当前虚拟机创建自定义的loader方法
env.AddLoader(LoaderBySelf);
//将lua文件转换成字符串
//通过虚拟机运行字符串
//当虚拟机执行require函数时,会调用Xlua中的loader(CustomLoader)函数,包含默认的,程序员也可以自定义
//当虚拟机执行require函数时会执行当前的所有loader,只要其中一个loader返回值不为空,其余的loader不执行
//如果所有loader都为空,报错
env.DoString("require 'XLuaReadTest.lua'");
//在C#中使用Lua虚拟机访问Lua脚本中的全局变量
//如果变量类型不匹配 赋值会失败
//lua中的字段 number(int double float) sring boolen
int a = env.Global.Get<int>("a");
print(a);
//关于lua中表的映射
//1、将table映射成类,需要访问table中的函数要使用interface来映射
TableToClass toClass = env.Global.Get<TableToClass>("TableToClass");
print("将table映射成类 ");
print(toClass.a + " " + toClass.b);
//2、将table映射成interface
TableToInterface toInterface = env.Global.Get<TableToInterface>("TableToInterface");
print(toInterface.A + " " + toInterface.B);
print("将table映射成interface " + toInterface.Sum(toInterface.A, toInterface.B));
//3、将table映射成List或Dictionary
//将table转换成list :只能够获取table中没有指定键的元素
List<int> toList = env.Global.Get<List<int>>("TableToListOrDict");
print("table映射到list");
foreach (int ele in toList)
{
print(ele);
}
//将table转换成Dictionary:只能够获取到table中具有指定键,并且值的类型一致的元素
Dictionary<string, string> toDict = env.Global.Get<Dictionary<string, string>>("TableToListOrDict");
print("table映射到dictionary");
foreach (KeyValuePair<string, string> ele in toDict)
{
print(ele);
}
//4、将lua中的table映射成委托(获取lua中全局函数)
//需要添加 CSharpCallLua特性
//当使用结束后,需要将委托对象置空,才能够正常关闭虚拟机
//当Lua中的函数包含多个返回值时,可以使用out 来接收剩下的返回值
//Lua函数中第一个返回值对应C#函数中的返回值,其他的返回值依次对应C#参数列表中的out参数
Func sum = env.Global.Get<Func>("sum");
print("调用lua全局函数 " + sum(1, 2));
sum = null;
FuncToDeleWithResult toDeleResult = env.Global.Get<FuncToDeleWithResult>("FuncToDeleWithResult");
int m, n, s;
s = toDeleResult(1, 2, out m, out n);
print("多返回值使用out参数接收 " + m + "+"+ n + "=" + s);
toDeleResult = null;
env.Dispose();
}
//自定义loader,直接加载lua文件
public byte[] LoaderBySelf(ref string filepath)
{
//创建路径
string path = Application.dataPath + "/" + filepath;
//判断文件是否存在
if (File.Exists(path))
{
//将文件按照UTF-8格式解析成byte[]
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}
else
{
//文件不存在返回null
return null;
}
}
}
--XLuaReadTest.lua
a = 1
TableToClass = {a = 1, b = 2}
TableToInterface = {A = 3, B = 4}
function TableToInterface:Sum(a, b)
return a + b
end
TableToListOrDict = {a=15,b=20,c="LKR",d=45.123 ,e=true,1,25,78,9,6,"WL"}
function sum(a,b)
return a + b
end
function FuncToDeleWithResult(a,b)
return a+b,a,b
end