找回密码
 立即注册
查看: 386|回复: 0

ToLua LuaFramework 使用实战[1]-代码热更新

[复制链接]
发表于 2021-9-30 07:53 | 显示全部楼层 |阅读模式
ToLua LuaFramework 使用实战[1]-代码热更新


感谢原文作者@罗培羽,本文会根据最新框架版本做一些修改。

一、代码热更新

1.1、安装框架

只要在http://www.ulua.org/index.html下载LuaFramework,然后用Unity3D打开,这里用的是LuaFramework_UGUI-1.0.4.109版本以及Unity3D 5.2,其他版本理应相似。打开之后需要点击lua菜单里面的Generate AllLuaFramework菜单里Build XXX Resources,以生成一些必要的文件。
  安装过程可以参见http://pan.baidu.com/s/1gd8fG4N里面的01_uLua_Windows.avi02_SimpleFramework_UGUI_Windows.avi两个视频(如果在windows系统下)。框架结构请参见http://doc.ulua.org/article/ngui/simpleframework_base1.html,这里不再复述。

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


成功运行示范界面(可要客户端能够运行起来就行)
1.2、运行lua代码

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

1)新建场景,并添加一个对象,命名为GameManager,并添加Main组件。其实Main组件里面只是调用了AppFacade.Instance.StartUp(),这是框架的起点。框架将会自动完成资源加载、热更新等等事项。


添加Main组件


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


lua入口


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



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


CustomSettings.cs的部分语句


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


Util类(Assets\LuaFramework\Scripts\Utility\Util.cs)的部分语句


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


生成资源文件



运行结果


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


设置LuaBundleMode

1.3、代码热更新

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


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

Mac OS WindowsApplication.dataPath + "/StreamingAssets";

iOSApplication.dataPath + "/Raw";

Android: jar:file://" + Application.dataPath + "!/assets/";

  数据目录:由于“游戏资源目录”在 AndroidIOS上是只读的,不能把网上的下载的资源放到里面,所以需要建立一个“数据目录”,该目录 可读可写。第一次开启游戏后,程序将“游戏资源目录”的内容复制到“数据目录中”(步骤 1,这个步骤只会执行一次,下次再打开游戏就不复制了)。游戏过程中的资源加载,都是从“数据目录”中获取、解包(步骤3)。不同平台下,“数据目录”的地址也不同, LuaFramework的定义如下:Android 或 iOS: Application.persistentDataPath + "/LuaFramework"
Mac OS 或 Windows:c:/LuaFramework/
调试模式下:Application.dataPath + "/StreamingAssets"
注: "luaFramework" 和 "StreamingAssets"由配置决定,这里取默认值

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

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


files.txt

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

  开始热更新代码吧!

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

1)修改配置。框架的默认配置是从本地加载文件,需要打开AppConst.csUpdateMode设置为true(才会执行步骤2),将LuaBundleMode设置为true,将WebUrl设置成服务器地址。如下图所示。


AppConst的配置

2)配置“网络资源”。
方式1:适用于window系统本地操作,可以使用iis开启本地服务器,然后将StreamingAssets里面的所有内容复制到服务器上面。必要时要配置一些权限,让所有文件都都可以下载。
方式2:使用云服务器,使用第三方工具建立http服务,例如nginx,简单搭建一个静态资源服务。




目录名比较随意,能懂就可以



通过网络访问文件
3)测试热更。改一下Lua脚本(如将HelloWorld改为Hello world~~server),点击Build Windows Resource,将“工程目录/StreamingAssets”里面的文件复制到服务器上。再将脚本改成其他内容(本地变了),然后Build Windows Resource,覆盖掉本地资源。运行游戏,如果程序显示“Hello world~~server”(网上的)的代码,证明成功从网上拉取了文件。



代码热更新

好啦,代码热更新搞定,下一节我们来实践资源热更新。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 18:28 , Processed in 0.090014 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表