您的位置:首页 > 编程语言 > Lua

XLua学习笔记

2018-08-11 16:27 113 查看

首先 : XLua 需要 先导入Xlua的资源。且不要随意拖动

            脚本中 引用命名空间  Using XLua;

           先说一下我自己碰到需要注意的点:  1、字符串前加@ 代表着该字符串取消转义      

                                                                     2、在不需要的时候就释放掉(luaenv . Dispose()),但是需注意   在释放前需要将委托的                                                                              方法制空

                                                                     3、在使用Globel 访问全局变量的时候,不同XLua里的相同的名字的变量名会冲突

C# 运行Lua

           LuaEnv  : 可以理解为运行Lua语句的虚拟机,而整个工程只需要一个虚拟机就可以了

                       首先  注意 创建一个  .lua.txt 后缀的文档,且文档必须放在Resources文件夹下(除非自定义加载路径)。

                                  默认加载器加载路径,只能是在Resources文件夹下的文件,子目录文件都是找不到。

                       步骤:  一般写成单例。

                        lua的文件名        private  string   lua =  @"require( 'CustorLoader ' )"   单引号里是Lua脚本txt文档的名字

                        创建 LuaEnv luaenv = new LuaEnv   

                        使用DoString的方式运行语句    luaenv . DoString( lua )  :     运行lua文件名

C# 访问 Lua

          通脱DoString 运行Lua脚本,Lua中全部的全局变量都储存在luaenv的Globel的LuaTable中,那么要获取这些Lua的全部,通                过Global获取

         一、访问全局的table类型

               (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<LuaTable>("t1");    // 用的单例

                              字符串索引的数据,第一个泛型: table 中 键的类型,第二个泛型: table中值得类型
                                             返回值: 就是table中键对应的值,参数:table中的键

                           例如:   int a = It  . Get<string , int >("a");

                            映射Table中的方法,映射方法时,需要指定值得类型为委托,Action是System空间下提供的委托

                                         Action funcl = It . Get<string,  Action>("Func1");

       二、访问一个全局的function类型

                    (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>("Func1");
                                                   func1();
                                           }

                     (2). 映射到LuaFunction中

                         LuaFunction是XLua提供的映射方法的类型   LuaFunction f1 = 单例 . Global . Get <LuaFunction>("方法名" )

                                多返回值的 可以通过Call方法的返回值传递出来,返回值object数组

                                      多返回值   object[] obj = f1 .Call();         string r = (string) obj [0];

                                                                 注: 若是无法确定 类型 使用 Debug. log(obj[1]. GetType()) 来获知类型

                                   无返回值 或 有参数              f1 . Call ("lu ", 100) ; 或者 f1 . Call ();

 

Lua 访问 c#

           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#的类型。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: