关于LUA+Unity开发_XLua篇

XLUA的上手比toLua要快,并且使用也比较简单直接,最大的亮点在于热补丁技术。git

1.关于热补丁技术github

思路相似JAVA的AOP思想,在不破坏影响原结构的同时,进行选择性热更新。目前腾讯已经将XLUA开源出来。 数组

官方此句:函数

“xLua热补丁技术支持在运行时把一个C#实现(函数,操做符,属性,事件,或者整个类)替换成Lua实现”oop

XLUA的热补丁为已经上线或者主体为C#代码的项目带来福音,能够事先在类前添加[HotFix],但注意此段官方给的:性能

  • 引擎API、系统API可能被代码剪裁调(C#无引用的地方都会被剪裁),若是以为可能会新增C#代码以外的API调用,这些API所在的类型要么加LuaCallCSharp,要么加ReflectionUse;

这样的变动极有可能致使苹果审核不经过,其实一切热更都须要绕过苹果才能经过,但这样明显API变更会很易被苹果检查出来的。学习

热补丁官方文档以下:测试

https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.mdui

 

2.项目中的实践方案编码

任何阶段的项目均可以随时导入XLUA方案,只须要将xlua库中的Assets目录中的Plugins和XLua整合到项目就能够了。此时的咱们在这里只须要好好学习Doc文件夹下的文档就能够熟练使用了,这比toLua上手快多了。使用以前须要先创建一个本身的LuaGenConfig文件,能够直接将ExampleGenConfig复制出来,再本身添加编辑。好比添加一个DOTween组件:

/// <summary>
    /// dotween的扩展方法在lua中调用
    /// </summary>

    [LuaCallCSharp]
    [ReflectionUse]
    public static List<Type> dotween_lua_call_cs_list = new List<Type>()
    {
        typeof(DG.Tweening.AutoPlay),
        typeof(DG.Tweening.AxisConstraint),
        typeof(DG.Tweening.Ease),
        typeof(DG.Tweening.LogBehaviour),
        typeof(DG.Tweening.LoopType),
        typeof(DG.Tweening.PathMode),
        typeof(DG.Tweening.PathType),
        typeof(DG.Tweening.RotateMode),
        typeof(DG.Tweening.ScrambleMode),
        typeof(DG.Tweening.TweenType),
        typeof(DG.Tweening.UpdateType),

        typeof(DG.Tweening.DOTween),
        typeof(DG.Tweening.DOVirtual),
        typeof(DG.Tweening.EaseFactory),
        typeof(DG.Tweening.Tweener),
        typeof(DG.Tweening.Tween),
        typeof(DG.Tweening.Sequence),
        typeof(DG.Tweening.TweenParams),
        typeof(DG.Tweening.Core.ABSSequentiable),

        typeof(DG.Tweening.Core.TweenerCore<Vector3, Vector3, DG.Tweening.Plugins.Options.VectorOptions>),

        typeof(DG.Tweening.TweenCallback),
        typeof(DG.Tweening.TweenExtensions),
        typeof(DG.Tweening.TweenSettingsExtensions),
        typeof(DG.Tweening.ShortcutExtensions),
        typeof(DG.Tweening.ShortcutExtensions43),
        typeof(DG.Tweening.ShortcutExtensions46),
        typeof(DG.Tweening.ShortcutExtensions50),

        //dotween pro 的功能
        //typeof(DG.Tweening.DOTweenPath),
        //typeof(DG.Tweening.DOTweenVisualManager),
    };

 

Examples中的实例与toLua的例子基本操做方面相似,区别在于二者封装的类名,如虚拟机类LuaState与LuaEnv。

这里说说教程里的三种经常使用的XLUA使用方式。

 

1.CSharpCallLua。在LuaEnv对象执行完LUA代码后,对LUA中的:

Table类型

  • 使用LuaTable.cs接收,使用luaenv.Global.Get<LuaTable>,这样的处理可针对全部的Lua中的table类型。
  • 使用C#类接收,使用luaenv.Global.Get<?> 写入类名。这样在LuaTable.cs中将遍历LUA栈取出相应的字段转成C#类对象成员中。
  • 使用字典接收,使用luaenv.Global.Get<?> 写入字典,以key,value形式将LUA栈信息遍历到字典对象。
  • 使用interface接收,这种方式须要在添加[CSharpCallLua]以自动生成一个列表,将遍历出来的lua数据映射到interface中。

Function类型

  • Action形式接收,使用luaenv.Global.Get<Action> ,这样的作法能够将一个C#的处理结果直接用回调传给LUA中进行处理!
  • 带参的Delegate回调,自定义的一个Delegate类型,匹配相应的传参。

2.LoadLuaScript

  • 实际上XLUA的虚拟机类只有一种DoString(),LoadString()可供用于加载执行和加载一个LUA,require ‘’模块时,须要将文件后缀添加.txt或其余文本形式后缀。所以实际使用中须要将lua以文本资源打入bundle中。
  • 自定义的LUA加载器,这里作了编码的处理,按须要的编码来读取一个LUA文本。

3.LuaCallSharp

  • 为须要映射到LUA的类/枚举添加[LuaCallCSharp]标签。这样使用CS.xxx(命名空间直接写在后面便可)就能够在LUA中调用了。
  • 参数,如Cs中的结构体,可选用table传值,数组,则直接可意为lua中的... 传入同类型数据便可。
  • 返回值,对象类型? 那就使用xlua的cast函数将其转成相应的对象再访问。相似于tolua.cast()的用法

若是须要第三方库,如JSON ,这时可参考文档中的说明官方提供的自动化脚本可打出对应不一样平台的xlua库。主要可能遇到的问题就是在路径的配置上,尽可能跟文档中的保持一致便可。

至此,大概的项目中的XLUA使用已经足够了。整体来讲比tolua配置更快速简单好用,但根据网上诸多大佬们的测试,性能各方面表现都不如tolua,好在其很牛X的热补丁方案,不过惋惜的是,IOS开发人员可能并不会采用。 

相关文章
相关标签/搜索