Unity3D热更新LuaFramework入门实战(1)——代码热更新

发表于2016-07-03
评论0 2.8k浏览

这些日子在找Unity3D的现成框架,希望能给后续项目开发带来便利。找着找着,便关注到了LuaFramework,这是一套基于tolua的框架,可以实现热更新。然而相关的资料太少,磕磕碰碰的尝试之后,便有写一篇入门教程的想法。这套文章应该会有4篇左右,涉及LuaFramework的安装、代码热更新、资源热更新、lua文件的编写等几项内容。

1、安装框架

只要在ulua.org/index.html下载LuaFramework,然后用Unity3D打开,这里用的是LuaFramework_UGUI-1.0.4.109版本以及Unity3D 5.2,其他版本理应相似。打开之后需要点击lua菜单里面的Generate AllLuaFramework菜单里Build XXX Resources,以生成一些必要的文件。

安装过程可以参见pan.baidu.com/s/1gd8fG4里面的01_uLua_Windows.avi02_SimpleFramework_UGUI_Windows.avi两个视频(如果在windows系统下)。框架结构请参见doc.ulua.org/article/ng,这里不再复述。

 

若运行后能够弹出示范界面,证明安装成功,可以进入下一步。

说明: https://pic1.zhimg.com/ab26fea7fbab23aa1510929a47304584_b.png成功运行示范界面(可要客户端能够运行起来就行)

 

2、运行Lua代码

这一步的目标很简单,就是让框架运行我们自己写的lua代码,显示一句“helloWorld”。下一步再考虑代码的热更新问题。

1)新建场景

在任意物体中添加Main组件。其实Main组件里面只是调用了AppFacade.Instance.StartUp(),这是框架的起点。框架将会自动完成资源加载、热更新等等事项。

说明: https://pic2.zhimg.com/fa7a550e67faecf19e694a4bc30c6ae9_b.png
添加Main组件

2)删掉示例的调用

现在不需要框架自带的示例了,需要删掉一些代码,使框架只运行我们编写的lua文件。打开AssetsLuaFrameworkScriptsManagerLuaManager.cs,将StartMain修改成下图这个样子。这是lua的入口,框架会调用Main.luaMain方法。


说明: https://pic4.zhimg.com/d948134041aa16b736a7c9a55fc2a61b_b.png
修改GameManagerlua入口

LuaManager
的实现

3)编写lua代码

打开AssetsLuaFrameworkLuamain.lua,编写lua代码。这里只添加一句“LuaFramework.Util.Log("HelloWorld");”(如下所示),它的功能相当于Debug.Log("HelloWorld")

--主入口函数。从这里开始lua逻辑function Main()    LuaFramework.Util.Log("HelloWorld");end

“LuaFramework.Util.Log("HelloWorld")”中的Utilc#里定义的类,供lua中调用。可以打开AssetsLuaFrameworkEditorCustomSettings.cs看到所有可以供lua调用的类,如下图是CustomSettings.cs的部分语句。

说明: https://pic4.zhimg.com/de62deea9359221f01a6c2a6e6770f1f_b.png

CustomSettings.cs
的部分语句

再由具体的类可以查找所有的API(参见下面两个图),如下图是Util类的部分语句。

说明: https://pic1.zhimg.com/63503b3a3ede1ea995f1e1aaa3313a04_b.png
Util类(AssetsLuaFrameworkScriptsUtilityUtil.cs)的部分语句

4)运行游戏

点击菜单栏中LuaFramework→BuildWindows Resource,生成资源文件。然后运行游戏,即可在控制台中看到打印出的HelloWorld

说明: https://pic3.zhimg.com/1e066efd986fa3a0d5c0fb49b71e6006_b.png
生成资源文件说明: https://pic2.zhimg.com/e1ab404aaaa0b060d497a2810ddab555_b.png

运行结果

按照默认的设置,每更改一次lua代码,都需要执行Build XXX Resource才能生效。读者可以将AssetsLuaFrameworkScriptsConstDefineAppConst.cs中的LuaBundleMode修改为true,这样代码文件便不会以AssetBundle模式读取,会直接生效,以方便调试。

说明: https://pic4.zhimg.com/3dc5322bcd70d42e1470f332801343b7_b.png
设置LuaBundleMode

3、热更新的原理

接下来便要尝试代码热更新,让程序下载服务器上的lua文件,然后运行它。在说明热更新之前,需要先看看Unity3D热更新的一般方法。如下图所示,Unity3D的热更新会涉及3个目录。


说明: https://pic2.zhimg.com/9da63e06e661ceb79a2c719ae8a10231_b.png
热更新的过程

游戏资源目录:里面包含Unity3D工程中StreamingAssets文件夹下的文件。安装游戏之后,这些文件将会被一字不差地复制到目标机器上的特定文件夹里,不同平台的文件夹不同,如下所示(上图以windows平台为例)

Mac OSWindowsApplication.dataPath + "/StreamingAssets";IOS Application.dataPath + "/Raw";Androidjar:file://" + Application.dataPath + "!/assets/";

数据目录:由于游戏资源目录AndroidIOS上是只读的,不能把网上的下载的资源放到里面,所以需要建立一个数据目录,该目录可读可写。第一次开启游戏后,程序将游戏资源目录的内容复制到数据目录中(步骤1,这个步骤只会执行一次,下次再打开游戏就不复制了)。游戏过程中的资源加载,都是从数据目录中获取、解包(步骤3)。不同平台下,数据目录的地址也不同,LuaFramework的定义如下:

AndroidIOSApplication.persistentDataPath + "/LuaFramework"    Mac OSWindowsc:/LuaFramework/调试模式下:Application.dataPath + "/StreamingAssets/"

注:”LuaFramework””StreamingAssets”由配置决定,这里取默认值

网络资源地址:存放游戏资源的网址,游戏开启后,程序会从网络资源地址下载一些更新的文件到数据目录。

这些目录包含着不同版本的资源文件,以及用于版本控制的files.txtFiles.txt的内容如下图所示,里面存放着资源文件的名称和md5码。程序会先下载网络资源地址上的files.txt,然后与数据目录中文件的md5码做比较,更新有变化的文件(步骤2)。说明: https://pic4.zhimg.com/9b5e5a69a05f321de928a420a309f4e7_b.png


files.txt

LuaFramework的热更新代码定义在AssetsLuaFrameworkScriptsManagerGameManager.cs,真正用到项目时可能还需少许改动。

 

4、开始热更新代码吧!

那么开始测试热更新代码的功能吧!热更上述实现的“HelloWorld”

1)修改配置

框架的默认配置是从本地加载文件,需要打开AppConst.csUpdateMode设置为true(才会执行步骤2),将LuaBundleMode设置为false,将WebUrl设置成服务器地址。如下图所示。说明: https://pic3.zhimg.com/c8182be425c8358c53ae7f0207e4aada_b.png


AppConst的配置

2)配置网络资源

笔者使用iis开启本地服务器,然后将StreamingAssets里面的所有内容复制到服务器上面。必要时要配置一些权限,让所有文件都都可以下载。说明: https://pic3.zhimg.com/8aa11c1ff53b2c9fa8a1d65c508e434e_b.png


通过网络访问文件

3)测试热更新

改一下Lua脚本(如将HelloWorld改为Hello Lpy2),点击Build Windows Resource,将工程目录/StreamingAssets”里面的文件复制到服务器上。再将脚本改成其他内容,然后BuildWindows Resource,覆盖掉本地资源。运行游戏,如果程序显示“Hello Lpy2”的代码,证明成功从网上拉取了文件。说明: https://pic2.zhimg.com/49fb6df68cf4ca6663b9ea1425553231_b.png


代码热更新

笔者也是刚刚接触LuaFramework,想看看该框架是否适用于团队接下来的项目。感谢ToLuaLuaFramework作者的无私奉献。下一节将会介绍使用LuaFramework做资源热更新的内容。谢谢支持。

最后是广告时间

笔者即将出版的一本Unity3D实战类书籍《Unity3D网络游戏实战》。该书通过一个完整的多人坦克对战实例,详细介绍网络游戏开发过程中涉及到的知识和技巧。书中还介绍了服务端框架、客户端网络模块、UI系统的架构等内容。相信透过本书,读者能够掌握Unity3D网络游戏开发的大部分知识,也能够从框架设计中了解商业游戏的设计思路,感谢大家支持。


通过《Unity3D网络游戏实战》读者便可以学会制作这样的多人对战游戏说明: https://pic2.zhimg.com/c68f71105f840551e1adc70914fa6fb5_b.jpg

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引