2019独角兽企业重金招聘Python工程师标准>>>

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

1.关于热补丁技术

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

官方此句:

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

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

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

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

热补丁官方文档如下:

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

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开发人员可能并不会采用。

转载于:https://my.oschina.net/u/138823/blog/1612843

关于LUA+Unity开发_XLua篇相关推荐

  1. 关于LUA+Unity开发_toLua篇【二】

    2019独角兽企业重金招聘Python工程师标准>>> 这篇来说说github上的的toLua框架 LuaFramework.两个版本分别对应UGUI和NGUI.这个框架是基于新一代 ...

  2. Unity手游开发札记——我们是如何使用Lua来开发大型游戏的?(上)

    0. 照旧的碎碎念 转眼间已经三月了,2月份的博客因为过年的懒惰和开年之后的忙碌而没有写--第二个月就打破了去年总结时对于2018年的愿望,真是羞耻呢-- 年后在准备新的测试版本,断断续续做了一些优化 ...

  3. 【转】【Unity+Lua】实测如何性能优化(Lua和C#交互篇)

    [转][Unity+Lua]实测如何性能优化(Lua和C#交互篇) https://blog.csdn.net/swj524152416/article/details/71125478 posted ...

  4. lua与c#交互篇 | 合理用好lua+unity,更省性能的方案整理

    前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一 ...

  5. unity怪物攻击玩家减血_像素地牢开发(unity) 第一篇(并不是第一天)

    像素地牢开发(unity) 第一篇(并不是第一天) 大二的时候就特别想制作独立游戏,每次逛b站刷到独立游戏制作的视频就十分羡慕,然鹅我却一直鸽着(别问,问就是刷视频,打王者),但我还是利用了一些空闲时 ...

  6. bat命令清理Window应用注册表(Unity开发Window应用)

    一.介绍 前段时间我们公司发布的Window应用出现了个Bug,这让用户无法正常登录应用. 出现的问题: 当用户登录时记住登录的账号密码,方便下一次快捷登录进来,这里前期的测试都是OK的在Window ...

  7. Nginx 模块开发高级篇

    Nginx 模块开发高级篇 变量 综述 在Nginx中同一个请求需要在模块之间数据的传递或者说在配置文件里面使用模块动态的数据一般来说都是使用变量,比如在HTTP模块中导出了host/remote_a ...

  8. lua 给userdata设置元表_提高Lua语言开发效率的简单方法

    概述 首先,lua是一门高效的(efficient).轻量级(lightweight)的嵌入式脚本语言(embeddable scripting language),这是它的官方网站的标语. 其次,l ...

  9. arcore之路-unity开发从入门到实践_AR开发之路——准备工作

    由于现在支持AR功能的手机没有普及,讲AR开发的教程也少,所以要学习AR开发还是要花点成本的,当然也有好处,花了学费,才会逼着自己坚持学下去. 为了学习AR,Relax今天入手了一部华为Nova 3i ...

最新文章

  1. oracle批输入命令流,ORACLE对表批处理操作
  2. linux文件目录类命令|--rmdir指令
  3. 201521123070 《JAVA程序设计》第2周学习总结
  4. matlab 散点图 线性回归图_线性回归思路梳理
  5. 获知哪个函数调用了本函数及它的类名
  6. Kafka万亿级消息实战解决方案干货
  7. Rust的所有权(Ownership)
  8. 【easy】349. Intersection of Two Arrays
  9. 那智机器人带CClink模块和三菱Q系列PLC通信
  10. tensorflow获取中间变量参数值
  11. “最强大脑”蒋昌建站台,原来是为这群白帽黑客和少年极客
  12. 开发分布式WebIm--1(设想)
  13. Win10与苹果AirDrop(隔空投送)
  14. Mac升级自带PHP版本(非Homebrew方式)
  15. 公交车司机与售票员进程协同活动问题 PV操作
  16. 图像格式转换:jpg批量转png
  17. PSIM仿真简单例程(频率响应)
  18. 跟我学XML (02)全网最简洁XML教程
  19. hx711基准电压_2块钱的24位AD-HX711做电压表的初步研究
  20. Battery Charging Specification 1.2 中文详解

热门文章

  1. rsa前后端加密流程_不懂前后端分离?这篇就够了
  2. python温度转换代码_用python编写一个名为“convert_temp”的温度转换函数
  3. sqlserver有外键无法创建触发器_数据库不使用外键的 9 个理由
  4. 红黑树在java中的作用_带你真正理解Java数据结构中的红黑树
  5. esp8266连接不上服务器不稳定,esp8266 联网问题+链接服务器问题
  6. 4s测试电池的软件,只需4步,不去4S店不要专业设备,你也能测出动力电池的容量...
  7. 小学计算机教师交流计划,2023年小学计算机教师工作计划
  8. zc706开发板的linux移植,Zynq—Linux移植学习笔记(十)
  9. Spark基础学习笔记01:初步了解Spark
  10. Python练习:目录与文件操作