关于xLua的学习(供个人学习)

1:什么是xLua

xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。

2:为什么选择xLua进行热更新 

这是因为Lua具有轻量、灵活的特点,可以在几乎任何平台上编译、运行。Unity一般使用C#代码编写游戏逻辑。在打包时,C#会先编译成IL(中间语言),存储到dll(动态链接库)中。在游戏运行时,需要通过JIT(即时编译)将IL解释为机器码。在这期间,会开辟一块内存空间,且要求这块空间可读、可写、可执行。但IOS平台是不允许获取具有可执行权限的内存空间的。因此只能进行全量更新。但Lua是使用C写的脚本语言,在运行时读入Lua代码,在解释时直接使用C代码进行解释,不需要开辟特殊的内存空间,执行解释的是C语言编写的虚拟机。(参考自这篇文章)
原文链接:https://blog.csdn.net/LWR_Shadow/article/details/127113712

3:xLua的使用

(1)xLua管理器

        xLua管理器可以使用单例类实现,在初始化时通过new LuaEnv()新建一个LuaEnv实例化对象, 大G表通LuaEnv.Global。

        主要方法有Require执行lua脚本,Tick手动垃圾回收,以及Dispose释放和关闭LuaEnv。

(2)c#加载Lua脚本  

        重定向加载文件路径 luaEnv.AddLoader(返回值为byte[],参数为ref字符串的委托)。
        在设置重定向后,会先去重定向的路径加载lua,找不到再去Resources文件下加载lua 。

(3)c#调用Lua 

        一:c#获取xlua全局变量

                 通过 LuaEnv.Global.Get<类型>("变量名")获取。值拷贝。

        二:c#获取xlua全局方法

                 通过 LuaEnv.Global.Get<委托类型>("lua函数名")。
                 多返回值(out或者ref)LuaEnv.Global.Get<委托类型>("lua函数名",参数列表)。

        三:c#获取xLua表映射为list和dic

                 通过 LuaEnv.Global.Get<List<>/Dic<>>("表名") 获取 和toLua不同的是,属于值拷贝。

        四:c#获取xLua表映射为class

                 通过 LuaEnv.Global.Get<类名>("表名"), 值拷贝。
                 使用类中方法直接.方法名调用就好。

        五:c#获取xLua表映射为接口

                引用拷贝,需要添加CSharpCallLua特性,代码生成器会生成接口的实例;需要注意的是:接口的变量需要用公共属性且公共get和set,函数用委托装载。和反射相似,成员变量可多可少 。

(4)Lua调用c# 

        一: xLua调用c#的class

                 格式:cs.命名空间.类名。使用()模拟new实例对象。

        二: xLua调用c#的enum

                跟调用类一致,cs.命名空间.枚举.枚举值
                int转为枚举 枚举.__CastForm(数值)
                string转为枚举 枚举.__CastForm(字符串) 

        三 :xLua调用c#数组

                可以通过类来调用,访问方法一致
                xlua创建数组固定格式CS.System.Array.CreateInstance(typeof(类型),长度) 下标从0开始

        四 :xLua调用List和Dic

                可以通过类来调用
                List:下标从0开始,创建List固定格式CS.System.Collections.Generic.List(CS.命名空间.类名)。得到的返回值设result,只是声明了还没实例,需要result()实例
                Dic:创建Dic固定格式CS.System.Collections.Generic.Dictionary(CS.命名空间.类名,CS.命名空间.类名)
                字典需注意的是如果key为字符串,则需要使用get_Item("key名")和set_Item("key名")访问字典值,其他类型可以使用[key]访问。

        五: xLua调用c#函数

                1:拓展方法需要在拓展静态类加上LuaCallCSharp特性
                2:xLua支持重载,但是不支持精度重载,如果需要使用精度重载要使用反射机制,最后将methodInfo通过xlua.tofunction(methodInfo)()访问
                3:ref和out,ref参数不能省略,out参数可以省略也可以用nil占位
                4:xLua仅仅支持有参有约束泛型,如果要使用有参无约束泛型,要使用反射,通过xlua.get_generic_method(CS.命名空间.类名,"方法名")得出来的设fun,然后fun(类型)指定泛型类型,返回的设fun_r,最后通过fun_r(参数列表)使用

        六:xLua调用c#委托和事件 

                委托:可以直接使用.del()执行,在添加和删除方法时使用=+,第一次添加时要使用=。
                事件:通过 事件名("+/-",方法名)来添加和删除方法,碍于事件特性,要在c#中编写执行和清空逻辑 

        七:xLua调用c#协程 

                 xLua提供了关键字如coroutine.yield(WaitForSeconds(1))表示c#的yield return new WaitForSeconds(1)。
                在xLua中编写好协程。通过(执行xlua.util脚本获取xlua写好的工具表),使用util.cs_generator(xlua写好的协程方法)转为可以供c#使用的协程.然后通过c#的mono类的.StartCoroutine(协程名)执行和StopCoroutine(协程名)关闭

4:特别的

        1:xLua对c#的二维数组不能使用[][]访问,要通过.GetLength(0/1)获取行、列数,通过.GetValue(x,y)获取对应的值
        2:nil和null无法直接比较,要么在c#中执行比较要么在lua中执行比较
        3:可以新建静态类,在其中添加type数组逐一给系统类如UnityAction添加特性

        4:xLua调用c#是大部分基于反射机制,性能可能有额外消耗,可以在尽量涉及的类中添加属性,生成代码,可能有助于优化反射性能?

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XLua可以在Unity中实现Lua脚本的编写,同时也可以让Lua脚本与C#代码进行交互。 以下是基本的使用步骤: 1. 下载XLua插件并导入到Unity中。 2. 在Unity中创建一个新的Lua文件,编写Lua脚本代码。 3. 在C#代码中使用XLua的API来加载并运行Lua脚本,例如: ``` using XLua; public class LuaManager : MonoBehaviour { private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv(); luaEnv.DoString("require 'main'"); // 加载并执行Lua脚本 } void Update() { luaEnv.Tick(); // 更新Lua环境 } void OnDestroy() { luaEnv.Dispose(); // 释放Lua环境 } } ``` 在上面的例子中,`Awake()`方法中创建了一个Lua环境,然后通过`DoString()`方法加载并执行了Lua脚本。`Update()`方法中每帧都调用了`Tick()`方法来更新Lua环境,`OnDestroy()`方法中释放了Lua环境。需要注意的是,在实际的项目中,可能需要更加复杂的逻辑和管理方式来处理Lua脚本的加载和运行。 4. 在Lua脚本中使用XLua的API来调用C#代码或者导出Lua模块,例如: ``` -- 导出一个Lua模块 local module = {} module.foo = function() print("Hello from Lua!") end return module -- 调用C#代码 local gameObject = CS.UnityEngine.GameObject("LuaObject") local transform = gameObject.transform transform.position = CS.UnityEngine.Vector3(1, 2, 3) ``` 在上面的例子中,导出了一个名为`module`的Lua模块,并定义了其中的一个函数`foo()`。同时,也调用了C#代码的API来创建了一个新的GameObject,并修改了它的Transform组件的位置。 XLua还提了其他的功能,例如自定义导出规则、GC优化等。在使用XLua之前,建议先了解一些基本的Lua语法和C#与Lua交互的机制,以便更好地使用XLua

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值