【Unity】使用XLua实现C#访问Lua文件
XLua_github链接
建立Lua虚拟机:LuaEnv luaEnv = new LuaEnv();
关闭虚拟机,及时释放资源:luaEnv.Dispose();
Resources文件夹下加载lua文件(假设文件路径为Resources/Lua/test.lua.text):
luaEnv.DoString("require 'lua/test'");
加载自定义文件夹下的lua文件(假设文件路径为Asset/Lua/test.lua):
(a)编写加载Lua文件的加载器:
private byte[] LoadLua(ref string file)
{
string luaStr = File.ReadAllText(Application.dataPath + "/Lua/" + file + ".lua");
byte[] luaByte = new UTF8Encoding().GetBytes(luaStr);
return luaByte;
}
(b)为虚拟机添加Lua加载器:
luaEnv.AddLoader(LoadLua);
(c)运行lua文件:
luaEnv.DoString("require 'test'");
假设有test.lua:
a = 1
b = true
c = "你好嘛"
table1 = {"aa", "bb", "cc", "12", "23', true, false}
person =
{
name = "zhaoxi",
age = 18
}
function Add(a, b)
return a + b
end
function Get(a, b)
return a,b
end
获取lua文件的全局变量:
int:int a = luaEnv.Global.Get<int>("a");
bool:bool b = luaEnv.Global.Get<bool>("b");
string:string c = luaEnv.Global.Get<string>("c");
访问table的四种方式:
(1)值类型方式:
(1-1)类的形式访问:
(a)定义一个类Person:
public class Person
{
public string name;
public int age;
}
(b)获取lua数据:
Person person = luaEnv.Global.Get<Person>("person");
Debug.Log(person.name + person.age);
(1-2)Dictionary List的方式访问:
Dictionary<string, object> tableDic = luaEnv.Global.Get<Dictionary<string, object>>("person");
Debug.Log(tableDic["name"] + " " + tableDic["age"]);
List<Object> tableList = lua.Global.Get<List<object>>("table1");
Debug.Log(tableList[0].ToString());
(2)引用类型访问:
(2-1)接口访问:
(a)定义接口IPerson(需挂载[CSharpCallLua]):
[CSharpCallLua]
public interface IPerson
{
public string name{get; set;}
public int age{get; set;}
}
(b)接收来自Lua的数据:
IPerson iperson = luaEnv.Global.Get<IPerson>("person");
Debug.Log(iperson.name);
iperson.name = ''yeye'';//修改lua数据,但不会对原lua文件造成影响
luaEnv.DoString("print(person.name)");//打印为yeye
(2-2)LuaTable的方式访问(能够实现动态行为,减少编译时间,但是性能开销较大,且难以追踪问题还会报类型安全的错误等等):
LuaTable luaTable = luaEnv.Global.Get<LuaTable>("person");
Debug.Log(luaTable.Get<string>("name"));//打印"zhaoxi"
访问全局函数:
(1)使用委托访问(需在委托前挂载[CSharpCallLua])优点:调用直接、性能快但是灵活性差
(a)定义委托
[CSharpCallLua] public delegate int Add(int a, int b);
[CSharpCallLua] public delegate int Get(int a, int b, out int c);
(b)获取函数
Add addFunc = luaEnv.Global.Get<Add>("add");
addFunc(1, 2);
Get get = luaEnv.Global.Get<Get>("get");
int num1, num2;
num1 = get(1, 2, out num2);
Debug.Log(num1 + " " + num2);//num1 = 1, num2 = 2
(2)使用LuaFunction优点:灵活性高,减少C#与Lua的桥接代码
LuaFunction luaFunction = luaEnv.Global.Get<LuaFunction>("add");
LuaFunction luaFunction1 = luaEnv.Global.Get<LuaFunction>("get");
object[] obs = luaFuction.Call(1, 2);
object[] obs1 = luaFunction.Call(1, 2);
Debug.Log(obs[0]);//3
Debug.Log(obs[0] + " " + obs[1]);//1, 2