【专栏精选】热更新之xLua_xlua_general-程序员宅基地

技术标签: unity  大话Unity  

本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。

洪流学堂公众号回复专栏,查看更多专栏文章。


洪流学堂,让你快人几步。你好,我是郑洪智。

xLua

小新:“之前你提到过,Unity热更新有两大流派,C#派和lua派,那lua派是啥样的呢?”
大智:“lua是一门历史悠久的脚本语言,从端游那个年代就被广泛应用在游戏开发中,所以到了现在的手游时代,有很多团队也让lua技术再次发展了起来。”

Lua语言

Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。

Lua设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译运行。Lua并没有提供强大的库,因为它的定位就是作为嵌入的脚本语言,所以Lua不适合开发独立应用程序。Lua有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用,特别是在端游阶段,游戏几乎都是使用C/C++开发的,lua给游戏开发带来了极大的便利性。

不仅仅作为扩展脚本,lua也可以作为普通的配置文件,代替XML、JSON、ini等文件格式,并且很容易理解和维护。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

很多我们熟悉的游戏中都使用了Lua脚本,比如魔兽世界、大话西游2、仙剑奇侠传、古剑奇谭等。

Lua之所以在游戏开发中这么受欢迎,也是因为它的优点:(1)语言优美、轻巧 (2)性能优良、速度快 (3)可扩展性强。

Unity与Lua

Unity中的Lua也一直在发展,目前Unity中比较流行的几个Lua框架有:

其中xLua是腾讯团队开发维护的一个框架,广泛应用在腾迅系的手游中,也是目前最受认可以及使用比较多的一个框架。

相对于我们之前学过的ILRuntime呢,lua也有一些优势和弱势。
Lua的优势:

  • 技术更为成熟
  • 成功的商业案例更多

Lua的劣势:

  • 需要开发团队掌握Lua
  • 可能需要维护C#和lua两套代码

后面我们会以目前最为主流的xLua来进行学习。

xLua

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

xLua的突破
xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:

  • 可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现,也就是热补丁功能;
  • 出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;
  • 编辑器下无需生成代码,开发更轻量;

下载

下载地址为:https://github.com/Tencent/xLua/releases

可以选择最新的zip下载:

上面图中可以看到xLua有几个不同的版本,有什么区别呢?

xLua有两个版本,分别集成了lua5.3和luajit,一个项目只能选择其一。这两个版本C#代码是一样的,不同的是Plugins部分。

  • xlua:此版本集成的是lua5.3,lua5.3的特性更丰富些,比如支持原生64位整数,支持苹果bitcode,支持utf8等。出现问题因为是纯c代码,也好定位。比起luajit,lua对安装包的影响也更小。
  • xlua_luajit:此版本集成的是luajit,luajit胜在性能,如果其jit不出问题的话,可以比lua高一个数量级。目前luajit作者不打算维护luajit,在找人接替其维护,后续发展不太明朗。
  • xlua_general:用于通用的.Net或Mono环境,可以在非Unity环境中使用。

目前lua53版本使用较多,所以xLua工程Plugins目录下默认配套是lua53版本,我们后面学习中也会使用这个版本。

安装

安装非常简单,新建一个Unity工程。

打开zip包,你会看到一个Assets目录,这目录就对应Unity工程的Assets目录,保持这目录结构放到你的Unity工程。

拖到空白处覆盖现在的Assets目录

如果你遇到了报错:
error CS0246: The type or namespace name 'ILGenerator' could not be found (are you missing a using directive or an assembly reference?)

可以查阅xLua的FAQ文档https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md

在这我也把这个问题的解决方法贴过来:

ILGenerator报错
这是因为Api Compatibility Level设置为.net standard 2.0,而.net standard 2.0不支持emit导致的。

解决办法(三选一):

  • 把“Scripting Backend”设置为3.5
  • 把Api Compatibility Level设置为.Net 4.x
  • 更新xLua到2019年1月8号后面的版本,可以解决编译问题,但由于没有emit的支持,编辑器下要生成代码才能跑了,建议执行“XLua/Generate Minimize Code”,这个少生成些代码。

在这我选择了第二种把Api Compatibility Level设置为.Net 4.x,来暂时解决这个问题。

把Api Compatibility Level设置为.Net 4.x

改成这个造成的可能的影响是:影响程序最终打包的体积,因为这个选项会包含所有的.Net 4兼容的API。

修改后我们的工程里就不报错了。

总结

大智:“今天我们了解了Lua以及xLua的使用前的准备。”

今日思考题

大智:“在你的电脑上建立一个xLua的工程,为我们明天做准备哦”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”


洪流学堂公众号回复专栏,查看更多专栏文章。

《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhenghongzhi6/article/details/89680827

智能推荐

计算跑OTB数据集的内存开销_[userview,systemview] = memory;-程序员宅基地

文章浏览阅读244次。[userview,systemview] = memory;disp(userview.MemUsedMATLAB);_[userview,systemview] = memory;

SpringBoot——静态资源访问的四种方式_springboot访问静态资源-程序员宅基地

文章浏览阅读9.1k次,点赞8次,收藏24次。1.默认的静态资源目录 /static /public /resources /META-INF/resources动态资源目录:/templates2.resources静态资源目录图片存放3. 静态资源目录访问3.1.通过路径访问静态资源 http://localhost:8080/a.jpg http://localhost:8080/b.jpg http://localhost:8080/c.png htt..._springboot访问静态资源

java输出0-100之间的偶数、奇数_1、用java 实现从键盘输入一个整数,如果输入的是0-100之间的数的奇偶数-程序员宅基地

文章浏览阅读7.9k次,点赞3次,收藏18次。偶数:package com.oracle.core;public class Wn { public static void main(String[] args) { int i; for(i=0;i<=100;i++) { System.out.println(i++); } }}奇数:package com.oracle.core;pub..._1、用java 实现从键盘输入一个整数,如果输入的是0-100之间的数的奇偶数

SSH远程连接MacOS catalina并进行终端颜色配置_ssh终端颜色取决于-程序员宅基地

文章浏览阅读986次。MacOS catalina远程SSH连接,并进行终端颜色配置_ssh终端颜色取决于

城市智慧排水监测系统,实时守护城市水脉-程序员宅基地

文章浏览阅读50次。城市智慧排水监测系统,通过新一代信息技术与排水技术的完美融合,让数据价值得以充分发掘,实现智慧排水监测系统的控制智能化、数据资源化、管理精确化、决策智慧化。通过数据采集和传输,系统能够及时掌握排水系统的运行状态,包括管网、泵站、调蓄池等关键节点的运行情况,以及排水户、内涝点等的数据变化。福建厦门WITBEE万宾,作为城市智慧排水监测系统的领先者,始终致力于为建设更加安全、智能、宜居的城市贡献力量,在智能排水监测系统领域上面提供了一个新的闭环。▲城市智慧排水监测系统核心产品。▲城市智慧排水监测系统架构。

Android手机获取外网ip(by 星空武哥)_android获取进口ip-程序员宅基地

文章浏览阅读2w次,点赞4次,收藏18次。目录(?)[-]声明渠道方式一友盟的打包工具蓝贝壳儿Eclipse插件打包Gradle 多渠道打包 比较新使用比较简单声明渠道方式二Android批量打包提速 - 1分钟900个市场不是梦Android批量打包提速 - 1分钟900个市场不是梦下面是具体步骤总结多渠道打包,主要是为了统计不同的渠道上包的下载数量,渠道越多,我们需要打的_android获取进口ip

随便推点

python人像精细分割_python 使用OpenCV进行简单的人像分割与合成-程序员宅基地

文章浏览阅读535次。实现思路通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像。实现步骤如下。使用BackgroundSubtractorMOG2进行背景分割BackgroundSubtractorMOG2是一个以高斯混合模型为基础的背景前景分割算法,混合高斯模型分布概率是K个高斯分布的和,每个高斯分布有属于自己的 μμ 和 σσ 参数,以及对应的权重参数..._将课堂上每个学生的人像提取出来 python

Ajax简介_ajax 命名空间-程序员宅基地

文章浏览阅读196次。我们似乎经常关注“后端机制(backend mechanics)”。我们通常会忘记,J2EE的主要成功之处在Web应用程序方面;许多原因使得人们喜欢利用Web开发应用程序,但主要还是因为其易于部署的特点允许站点以尽可能低的成本拥有上百万的用户。遗憾的是,在过去几年中,我们在后端投入了太多的时间,而在使我们的Web用户界面对用户自然和响应灵敏方面却投入不足。  本文介绍一种方法,Ajax,使用它可以构建更为动态和响应更灵敏的Web应用程序。该方法的关键在于对浏览器端的JavaScrip_ajax 命名空间

UE4-构建更好的静态网格体_ue5静态网格体无法选中模型-程序员宅基地

文章浏览阅读5.9k次,点赞3次,收藏16次。在“构件更好的三维网格体这部分”,我们会讨论包括系统单位、三角面数量、材质ID、枢轴点,我们会学习什么是光照贴图,然后介绍如何创建光照贴图。我们将学习碰撞网格体的创建和使用,细节层级或 LOD,最后介绍如何限制过度绘制。1.系统单位无论你使用哪种数字内容创建软件(DCC),创建对象前你需要先确定系统单位。本文中,我将使用 3d Studio Max,不过我涉及到的原理适用于所有数字内容创建软件。首先,我们需要确保将系统单位设为厘米,因为厘米是虚幻引擎4默认的测量单位。在虚幻引擎4中,一虚幻单位等于一厘米_ue5静态网格体无法选中模型

在centos6.8系统中静默安装oracle数据库_chown -r oracle:oinstall/home/oracle/east5.0/-程序员宅基地

文章浏览阅读485次。在centos6.8系统中静默安装oracle数据库本次安装oracle11g,所以事先需要在网络上下载好oracle11g##1. 增加虚拟内存dd if=/dev/zero of=/swapadd bs=1024 count=2006424mkswap /swapaddswapon /swapadd##2. 创建用户和组groupadd oinstallgroupadd dba..._chown -r oracle:oinstall/home/oracle/east5.0/

操作系统-内存管理-内存与外存的对换(swapping)_进程对换功能主要基于-程序员宅基地

文章浏览阅读1w次,点赞7次,收藏37次。操作系统-内存管理-内存与外存的对换(swapping)1.对换的引入在多道程序环境下,可能会有如下两个问题:内存中的某些进程可能被阻塞(由于等待I/O或其他原因),但是该进程占用了大量的内存空间,甚至会发生内存中所有的进程都被阻塞的情况。在上述情况下,还有些作业在外存上等待调入内存,但因内存空间已被那些阻塞的进程占用所以这些在外存上等待的作业无法被调入内存执行。上诉两个问题会导致系统资源被严_进程对换功能主要基于

结构化、半结构化、非结构化数据_半结构化数据有哪些-程序员宅基地

文章浏览阅读9k次。1.结构化数据定义:业界指关系模型数据,即以关系数据库表形式管理的数据简析:虽然专业角度上看,结构化就是关系模型的说法并不准确,但针对目前业内现状,还是定义为关系模型最为妥善,因为它准确的代表了我们传统上最熟悉的企业业务数据。2.半结构化数据定义:非关系模型的、有基本固定结构模式的数据,例如日志文件、XML文档、JSON文档、Email等。3.非结构化数据定义:没有固定模式..._半结构化数据有哪些