要使用xlua引用命名空间
Using XLua;
LuaEnv : 可以理解为lua的虚拟机
LuaEnv的创建:
LuaEnv luaenv = new LuaEnv();
LuaEnv的销毁
luaenv.Dispose();
执行lua文件
1.执行lua的语句
luaenv.DoString (“print(‘hello world’)”);
注意字符串必须符合lua的语法
2.执行lua的文件
luaenv.DoString ("require 'HelloWorld'");
注意:使用默认加载器去加载lua文件需要把lua文件放在Resources文件夹下,并且命名有固定的规范,首先你的文件后缀.txt,其次文件名的后面必须含有.lua,最终的文件名字file.lua.txt的格式
注意:使用require这种方式加载文件,如果出现错误
1).检查文件的命名后缀是否符合要求
2).检查文件是否在Resources下
3).检查DoString()执行的字符串的语法有没有问题
4).检查文件里的lua语法有没有问题
3.自定义的loader(加载器)
luaenv.AddLoader (MyCustomLoader);
byte[] MyCustomLoader(ref string filepath)
filepath是require的名字,不包括后缀
byte[] 是lua的语句转换成的byte数组
每一个loader都是为require服务的,所有添加加载器需要在require执行之前
加载机制:执行require时,判断如有有自定义的加载器,那么就去回调自定义的记载器,如果第一个自定义加载器没找到(return null),再去第二个自定义的加载器找,。。。直到所有的自定义加载器都没找到,那执行默认的加载器,如果默认的加载器也没找到,报错了
C#调用lua
1.获取一个全局的基本数据类型
Luaenv.Global:是一个table,执行lua文件之后,所有的全局的变量方法全都存储在Global中,可以通过Get去获取相应的全局变量和方法
T luaenv.Global.Get<T>(“”)
T是你要访问的lua的变量的类型,参数是你要访问的变量的名,在lua里的名字
2.table映射到struct或class
Xlua实例一个类的对象,把对应的键的值赋值给了类的字段
只会把table的键映射到class的public变量名与键名一致的变量里,table的字段的多少与类的字段的多少不需要保持一致
3.table映射到interface
IXiaoMing ixm = luaenv.Global.Get<IXiaoMing> ("tab");
注意:所有的table中的字段都映射到interface的属性里,方法映射到interface的方法,注意如果要使用这种方式,interface需使用[CSharpCallLua]这个特性,希望把一个table适配到interface
4.映射到Dictionary和List
Dictionary:只能映射table的键和值与dic的键的类型和值类型对应上的
List:只能映射table里没有键的,值与list对应的值
5.映射function到delegate
[CSharpCallLua]
public delegate void NotParamNotReturn();
NotParamNotReturn func = luaenv.Global.Get<NotParamNotReturn>("get");
委托的定义是根据function的返回值和参数去决定的
如果function是多返回值的:返回值从左到右输出参数对应委托的返回值,后面一次对应委托的ref或out参数,如果委托没有返回值,function返回值从左到右依次对应out或ref参数,lua的返回值可以多于c#的out或ref,也可以少于c#的ref或out
ref修饰的参数可以作为参数传递到lua的function中,out修饰的参数不可以作为参数传递到lua的function中