手游热更新方案xLua开源:Unity3D下Lua编程解决方案

简介:

C#下Lua编程支持

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

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

可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现;
出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;
编辑器下无需生成代码,开发更轻量;
更详细的特性、平台支持介绍请看这里。

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

如果希望安装到其它目录,请看FAQ相关介绍。

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

lua5.3的特性更丰富些,比如支持原生64位整数,支持苹果bitcode,支持utf8等。出现问题因为是纯c代码,也好定位。比起luajit,lua对安装包的影响也更小。

而luajit胜在性能,如果其jit不出问题的话,可以比lua高一个数量级。目前luajit作者不打算维护luajit,在找人接替其维护,后续发展不太明朗。

项目可以根据自己情况判断哪个更适合。因为目前lua53版本使用较多,所以xLua工程Plugins目录下默认配套是lua53版本。

快速入门
一个完整的例子仅需3行代码:

安装好xLua,建一个MonoBehaviour拖到场景,在Start加入如下代码:

XLua.LuaEnv luaenv = new XLua.LuaEnv();
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
luaenv.Dispose();
1、DoString参数为string,可输入任意合法的Lua代码,本示例在lua里调用C#的UnityEngine.Debug.Log打印了个日志。

2、一个LuaEnv实例对应Lua虚拟机,出于开销的考虑,建议全局唯一。

C#主动调用lua也很简单,比如要调用lua的系统函数,推荐方式是:

声明
[XLua.CSharpCallLua]
public delegate double LuaMax(double a, double b);
绑定
var max = luaenv.Global.GetInPath("math.max");
调用
Debug.Log("max:" + max(32, 12));
建议绑定一次,重复使用。生成了代码的话,调用max是不产生gc alloc的。

热补丁
侵入性小,老项目原有代码不做任何调整就可使用。
运行时影响小,不打补丁基本和原有程序一样。
出问题了可以用Lua来打补丁,这时才会走到lua代码逻辑;
这里是使用指南。

更多示例
01_Helloworld: 快速入门的例子。
02_U3DScripting: 展示怎么用lua来写MonoBehaviour。
03_UIEvent: 展示怎么用lua来写UI逻辑。
04_LuaObjectOrented: 展示lua面向对象和C#的配合。
05_NoGc: 展示怎么去避免值类型的GC。
06_Coroutine: 展示lua协程怎么和Unity协程相配合。
07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。
08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。
09_GenericMethod: 泛化函数支持的演示。
10_SignatureLoader: 展示如何读取经数字签名的lua脚本,参见数字签名的文档介绍。
文档
XLua教程.doc:教程,其配套代码这里。
XLua的配置.doc:介绍如何配置xLua。
XLua增加删除第三方lua库.doc:如何增删第三方lua扩展库。
XLua API.doc:API文档。
生成引擎二次开发指南:介绍如何做生成引擎的二次开发。
热补丁操作指南:介绍如何使用热补丁特性。
技术支持
QQ群:612705778 验证答案:有问题先找FAQ

https://github.com/Tencent/xlua
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/p/6782141.html如需转载请自行联系原作者

jiahuafu

相关文章
|
3月前
|
消息中间件 Kubernetes NoSQL
Lua C接口编程(二)
Lua C接口编程(二)
|
3月前
|
存储 API C语言
Lua C接口编程(一)
Lua C接口编程(一)
|
6月前
|
编译器 Linux C语言
lua编程基础
lua编程基础
51 0
|
JSON NoSQL Redis
redisTemplate redis lua,attempt to compare two nil values, java.lang.IllegalStateException 解决方案,亲测可用
redisTemplate redis lua,attempt to compare two nil values, java.lang.IllegalStateException 解决方案,亲测可用
redisTemplate redis lua,attempt to compare two nil values, java.lang.IllegalStateException 解决方案,亲测可用
|
C# 图形学 C++
原生实现C#和Lua相互调用-Unity3D可用【下】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
321 0
|
C# 图形学 Windows
原生实现C#和Lua相互调用-Unity3D可用【中】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
164 0
|
API C# Android开发
原生实现C#和Lua相互调用-Unity3D可用【上】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
276 0
|
测试技术 Android开发 图形学
|
C# 图形学
Unity3D 预备知识:C#与Lua相互调用
  在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案。那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了? 一.基本原理   简单地说,c#调用lua, 是c# 通过Pinvoke方式调用了lua的dll(一个C库),然后这个dll执行了lua脚本。
2935 1