脚本中 引用命名空间 Using XLua;
先说一下我自己碰到需要注意的点: 1、字符串前加@ 代表着该字符串取消转义
2、在不需要的时候就释放掉(luaenv . Dispose()),但是需注意 在释放前需要将委托的 方法制空
3、在使用Globel 访问全局变量的时候,不同XLua里的相同的名字的变量名会冲突
LuaEnv : 可以理解为运行Lua语句的虚拟机,而整个工程只需要一个虚拟机就可以了
首先 注意 创建一个 .lua.txt 后缀的文档,且文档必须放在Resources文件夹下(除非自定义加载路径)。
默认加载器加载路径,只能是在Resources文件夹下的文件,子目录文件都是找不到。
步骤: 一般写成单例。
lua的文件名 private string lua = @"require( 'CustorLoader ' )" 单引号里是Lua脚本txt文档的名字
创建 LuaEnv luaenv = new LuaEnv
使用DoString的方式运行语句 luaenv . DoString( lua ) : 运行lua文件名
通脱DoString 运行Lua脚本,Lua中全部的全局变量都储存在luaenv的Globel的LuaTable中,那么要获取这些Lua的全部,通 过Global获取
(1) 将table映射到类或结构体中
table的键名必须与类的变量名保持一致,才能把table中的值映射到类中,类中如果出现变量时table中没有的,按 默认值处理,如果table中的键在类中是没有对应的变量的,那么该键所对应的值并不会映射到类中
注意: table中的方法使用变量为委托类型的方法去映射 、 映射类的过程就是在值拷贝的过程
(2)使用接口进行映射
接口 无法定义 变量, 使用属性 可以接受 普通类型
table中的基本类型的值都会映射接口中属性上,table的键名需要与接口中属性名保持一致,table中的方法,映射 到接口中的同名方法上 (不用委托)
注意: 接口如果要映射table,需要使用特性[CSharpCallLua] 修饰、 使用接口映射的过程是引用传递
(3)使用字典或List进行映射
字典:
使用字典进行映射时,需要制定字典的键的类型和值类型,只能把table中的键的类型与字典中键类型一致和table 中值类型与字典中值类型一致的映射出来
如果要使用字典去映射table中的方法,那么字典的值的类型需要时委托
List:
使用List进行映射时,只能映射table中数字索引的,且从默认索引1开始映射,如果出现空位,拿null补。只能映 射数字索引中值得类型与list指定的类型一致的值
(4)映射到LuaTable中
使用LuaTable去映射 LuaTable It = SingleLuaEnv . _Instance . Global . Get
字符串索引的数据,第一个泛型: table 中 键的类型,第二个泛型: table中值得类型
返回值: 就是table中键对应的值,参数:table中的键
例如: int a = It . Get
映射Table中的方法,映射方法时,需要指定值得类型为委托,Action是System空间下提供的委托
Action funcl = It . Get
(1). 映射到delegate中
注意: 委托要使用[XLua . CSharpCallLua]修饰
如果Lua的多返回值的方法: 使用委托映射,多返回值的处理方式是:
1.如果委托有返回值: 那么多返回值的第一个返回值就是委托的返回值,多返回值的第二个返回值通过委托 中参数列表中第一个ref或out参数传出,之后的依次与参数列表的ref或out参数对应传出。
2. 如果委托没有返回值: 那么多返回值的第一个返回值通过委托参数列表的第一个ref或out参数传出,之后的 一依次与参数列表的ref或out参数对应传出。
例如:private string lua = "require (‘Function’)"; // 关联Lua脚本
[CSharpCallLua] // 生成适配Lua的代码 特性
Public delegate void Func1() // 声明委托类型 无参数 无返回值
Void Start(){
SingleLuaEnv . _Instance . DoString(lua); // 单例,
Func1 func1 = singleLuaEnv . _Instance. Global . Get
func1();
}
(2). 映射到LuaFunction中
LuaFunction是XLua提供的映射方法的类型 LuaFunction f1 = 单例 . Global . Get
多返回值的 可以通过Call方法的返回值传递出来,返回值object数组
多返回值 object[] obj = f1 .Call(); string r = (string) obj [0];
注: 若是无法确定 类型 使用 Debug. log(obj[1]. GetType()) 来获知类型
无返回值 或 有参数 f1 . Call ("lu ", 100) ; 或者 f1 . Call ();
1、 Lua new c#的对象
a . lua定义变量时,不需要指定变量的类型、 b . lua没有new关键字
c . 调用c#的构造函数时,需要加 CS. 如果有命名空间 CS . 命名空间 . 构造函数()
没有命名空间 CS . 构造函数()
2、 Lua访问c#的静态变量,方法 以及 成员变量,方法
访问静态变量和属性:CS. 命名空间 . 类名 . 变量名或属性名 或者 CS . 类名 . 变量名或属性名
访问静态方法: CS . 命名空间 . 类名 . 方法名()或 CS . 类名 . 方法名()
访问成员变量和属性: 对象名 . 变量名或属性名
访问成员方法: 对象名: 方法名()
3、Lua调用带有Out Ref 参数的方法
Out:lua不支持out关键字,那么out传出的值是通过lua的多返回值传递出来的。
Out作为参数,lua进行调用时,是不需要传入参数的
注意: 如果你在lua脚本里给out传了参数,要小心了,带有out的参数 不需要传,该参数会给到下一个没有out的参 数上
Ref:lua不支持ref关键字,那么ref修改过后的值是通过lua的多返回值传递出来。
Ref作为参数,lua进行调用时,是需要传入参数的。
Out的例子: 例如: lua中 e = "out 第二"
f, h = CS.LessonXLua.D.Func3("第一", e, "第三")
c#中 public static string Func3(string str1, out string str2, string str3)
{
Debug.Log("第一个参数:" + str1);
Debug.Log("第三个参数:" + str3);
str2 = "Out Func3";
return "Func3";
}
str1 是 “第一” 而 str3 是 out第二“”
4、 Lua支持通过子类对象访问父类的变量和方法, 支持类重写父类方法
5、 Lua支持C#的重载,但并不完全支持,因为lua的Number类型与C#的多种类型对应。
6. Lua调用C#的枚举
CS.命名空间.枚举名.枚举值 或 CS.枚举名.枚举值
(1) Lua把数字转换成枚举:lua不支持强制转换, 但是可以通过: CS.命名空间.枚举名.__CastFrom(数字) 返回值 就是数字对应的枚举值 或 CS.枚举名.__CastFrom(数字) 即使传递的数字没有对应的枚举值,也不会报错.
(2) Lua把字符串转换成枚举:CS.命名空间.枚举名.__CastFrom(字符串) 或 CS.枚举名.__CastFrom(字符串) 如 果传 入的字符串没有对应枚举值,会报错。
7. Lua调用C#的委托
(1). Lua不支持+=运算符,其次当委托为空时,不支持 a = a + b, lua中不能使用nil与另一个方法相加,在委托为空时, 只能对齐进行赋值操作,a = b, 当为委托部位空时,支持使用a = a + b的方式把b添加到委托a中去。
(2). Lua可以把lua本身的方法添加到C#的委托中去。注意先定义lua方法,在向委托中添加lua的方法.
(3). 如果lua向C#的委托中添加了方法,那么当释放虚拟机的时候, 需要把委托清理干净.
(4). 静态 委托: CS.命名空间.类名.委托名 或 CS.类名.委托名
成员委托: 对象名.委托名
8. Lua调用C#的事件
与c#委托不一样:通过: + 表示添加事件 - 表示删除事件
静态事件: CS.命名空间.类名.事件名(‘+’或’-’, 要添加进事件的方法名) 或
CS.类名.事件名(‘+’或’-’, 要添加进事件的方法名)
成员事件: 对象名:事件名(‘+’或’-’, 要添加进事件的方法名)
9 . Lua可以使用typeof获取C#的类型。