初学者学习 - Unity中的热更新 - Lua和C#通信

http://www.myexception.cn/c-sharp/1881698.html

热更新的时候不需要关闭服务器,直接重新部署项目就行。冷的自然就是关闭服务器后再操作

就是说
你的卡车开到了150KM/H
然后,有个轮胎,爆了
然后,司机说,你就直接换吧,我不停车。你小心点换

热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工。

准备:

1、了解Lua的语法

         推荐书籍《Lua程序设计 第二版》

2、使用ULua插件进行通信

 

尽量早上真机。因为Bug问题特别多。

 

大杂烩:

更新LUa其实也是更新资源。 Lua被看作一个资源么。Lua代码都是运行时才编译的,不运行的时候就如同一张图片、一段音频一样,都是文件资源;所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现“热更新”。运行效率由于使用反射,所以成为它与生俱来的诟病。目前有对他的改进,像C#ToLuaSlua。但是Ulua是很成熟的,这个对于项目开发我认为暂时比性能重要!很多人在用,很多坑都已经被人采完。个人比较看好Slua的发展。当然了还有李总的L#走的就不是Lua的路。

网上还有说nLua的,我是新手不了解。 看看权威的解释:

ulua包含两种c模式(luajit+原生luavm版),加之tolua c#提供了直接访问渠道。所以追求效率的,请选用ulua。但是ulua因为底层使用luajit,而luajit目前不能在WP平台使用,所以如果ulua支持WP平台需要第二种原生luavm的底层库。

nlua包含2种模式(KeraLua c版本)(KopiLuac#版本),它支持全平台,因为c版本底层用的原始的luavm(非luajit)。但是缺少tolua c#的支持,因此效率略低于ulua,但是支持WP平台(其他平台也支持)。

 

插件:

下载地址

链接:http://pan.baidu.com/s/1dDjINLn

密码: f29h

ULua = Lua + LuaJit(解析器、解释器) +LuaInterface(与C#通信用这个);

 

DLL放在 Plugins文件夹下,如果导入后报错,就重启Unity

 

主要内容:

先感谢这篇博文的分享者:

http://www.unitymanual.com/blog-27966-2568.html

Ulua的使用流程一般为:

实例化LuaState对象(newLuaState())  à  加载Lua代码(LuaState.DoString(string)à调用Lua代码中的方法(GetFunction(string),LuaFunction.callFunction(string))。其中加载Lua代码这一块,可以直接赋一段Lua代码字符串,也可以指定一个Lua脚本文件。为了热更新,应当采用第二种加载方法,即创建一个Lua脚本文件。由于Unity不支持扩展名为lua的文件,所以可将Lua脚本扩展名定为txt(纯文本文件),并用unityTextAsset列表负责记录所有脚本文件。建议列表中给每个脚本搭配一个string类型的ID,这样凭此ID即可加载正确的lua脚本;另外在LuaState类中新增一个String类型的public成员,赋值为该ID。这样一旦某个Lua脚本在运行时报错,可根据输出的ID值判断是哪个Lua脚本有错误。

关于Lua里的预处理:

<span style="margin: 0px; padding: 0px;">luanet.load_assembly("Assembly-CSharp") 
luanet.load_assembly('UnityEngine')
Vector2 = luanet.import_type('UnityEngine.Vector2')
Vector3 = luanet.import_type('UnityEngine.Vector3')
GameObject = luanet.import_type('UnityEngine.GameObject')
luanet.import_type('System.Collections.Generic.List')
Debug = luanet.import_type('UnityEngine.Debug')
</span>
      这些都是常用的 Lua 预处理,建议单独写个 Lua 脚本记录这些,以后加载其他 Lua 脚本前都先加载一下这个脚本。自定义 C# 类也是可以 import 的, import 操作是 Lua 调用 C# 的前提。当然在 C# 中实例化的 LuaState 也可以预定义一些 Lua 全局变量,这都是在 C# 里完成的,比如:



<span style="margin: 0px; padding: 0px;">void SetLuaData(LuaState lua)
{
       lua["transform"] = transform;
       lua["gameObject"] = gameObject;
}
</span>

预定义了两个变量,一个是transform,一个是gameObject


关于Lua里的全局变量:


Lua里所有的字符串,如果不是关键字或者运算符,就都是变量;这些变量中,凡是没用local关键字修饰的,就是全局变量,反之,则是局部变量。每个LuaState对象,当它加载过Lua代码以后,它里面定义的全局变量,在这个对象生命期内是一直存在的。如果两次调用这个LuaState的某方法,第一次将某全局变量进行了修改,那么第二次,这个全局变量会在第一次修改的基础上继续修改。


关于LuaUnity的适用范围:


虽然Lua可以负责Unity工程的任何模块,但是出于对游戏性能的考虑,尽量少的低频率的调用Lua,比如尽量少在Update函数中调用Lua、循环利用已经实例化过的LuaState避免浪费资源。对于那些不需要高效运算的模块,比如UI部分,就可以放心大胆的使用Lua


关于LuaNGUI的适配:


调用Lua的主要方式就是callFunction,而对于NGUI来说,一般都是按钮触发某C#脚本的函数,那么如何用按钮触发Lua的函数呢?这就需要有个C#脚本作为“中介”,这个“中介”需要有自己的LuaState实例,当执行“中介”的某个方法时,由该方法调用callFunction。至于具体调用Lua脚本的哪个方法,可以通过传参的方式告诉这个“中介”——修改NGUIButtonMessage类,加入新的public string LuaFunctionName成员,以后由它来制定要调用的Lua方法名就好了。而通过NGUIUIButton等调用C#的方法,也是同理的(NGUI3.5.6版以后,可以给UIButton等等组件的触发方法添加参数了)。


关于LuaSimpleJSON的适配:


SimpleJSON是一个开源的JSON库,这个详见之前的博客。由于Lua语言无法理解C#里面的属性,所以凡是SimpleJSON里的public A{getset}这种,要新写一些接口函数返回它们的取值,以供Lua调用。而且Lua调用C#里经过很多重载的函数,也经常判断错误(这是个bug?),所以干脆多弄一些函数名,避免调用错误。


关于LuaLua之间的调用:


Unity中使用Ulua,想要让两个Lua脚本彼此调用是很难的,需要通过C#作为“中介”,而且Lua不支持C#的泛型,所以不能用GetComponnet<类名>()的形式,只能用GetComponnet (“类名”)的形式去获取组件。两个Lua脚本相互传参也很麻烦,因为有了C#脚本作为“中介”,所以不能传tabel类型的参数,我的做法是将若干参数拼成一个json字符串传递过去,另一方再解json包。感觉有点蛋疼。不过这种情况并不多见,都是可以避免的(比如一个模块只用一个大Lua脚本,各自独立减少沟通)。


关于Lua编辑器:


个人使用的是notepad++,也有很多人用sublime,代码折叠这块notepad++更好一些,而sublime在功能上貌似更强大一些。   unity项目开发基本使用VS系列。所以


BabeLua是一款基于VS2012/2013(简称VS)的免费开源的Lua集成开发环境,在Lua编辑和调试方面,具有如下功能和特性:

Lua语法高亮

●语法检查

●自动补全

●一键注释

●格式化代码

●自定义代码折叠

●工程管理

●快速搜索和跳转

●文件大纲

●注入宿主程序内对Lua脚本进行调试

●设置断点观察变量值

●查看堆栈信息

版本更新日志

https://babelua.codeplex.com/


         或者 开源的Lua轻量级编辑器:ZeroBraneStudio


Unity编程的亲们,有没有在Unity运行状态下修改并保存了脚本,然后切回来Unity直接卡死的惨痛经历?使用Lua,你将告别这一现象,有木有心动呢?


接下来感谢“小阿哥”的视频分享,虽然内容讲的支离破碎。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值