Unity3d游戏热更新专题

2016年07月25日 18:21 0 点赞 0 评论 更新于 2025-11-21 13:35

一、Unity3D热更新概述

在Unity3D开发中,热更新是一个无法回避的重要话题。热更新的主要目的是让用户能够及时获得游戏资源和代码的变更。例如,当游戏推出新版本时,可能会涉及内容资源的增加以及游戏逻辑的变更。

在热更新中,脚本热更新尤为关键。目前,有两种常见的脚本选择:

  1. Lua脚本:Lua由魔兽世界采用作为界面脚本,在游戏行业中广受欢迎,历经十年依然保持热度。Unity有许多Lua的绑定库,还有像UniLua这样的纯C#移植实现。
  2. C#Light/Evil:这是一门新生的脚本语言,采用C#语法,以纯C#实现,专为Unity3D的逻辑热更新而设计。

为了方便后续项目开发,下面将分享一个Unity3D的现成框架及其使用方法。

二、框架安装教程

安装框架后,若运行时能够弹出示范界面,则证明安装成功,可以进入下一步。这里需要注意的是,只要客户端能够运行起来即可。

三、运行Lua代码

此步骤的目标是让框架运行我们自己编写的Lua代码,显示一句“HelloWorld”,后续再考虑代码的热更新问题。具体步骤如下:

1. 新建场景并添加Main组件

在任意物体中添加Main组件。实际上,Main组件仅调用了AppFacade.Instance.StartUp(),这是框架的起点,框架将自动完成资源加载、热更新等操作。

2. 删掉示例的调用

目前不需要框架自带的示例,需要删除一些代码,使框架仅运行我们编写的Lua文件。打开Assets\LuaFramework\Scripts\Manager\LuaManager.cs,将StartMain修改为指定样式,这是Lua的入口,框架会调用Main.luaMain方法。

3. 编写Lua代码

打开Assets\LuaFramework\Lua\main.lua编写Lua代码,仅添加一句LuaFramework.Util.Log("HelloWorld");,其功能相当于Debug.Log("HelloWorld")。示例代码如下:

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

其中,Util是C#里定义的类,供Lua中调用。可以打开Assets\LuaFramework\Editor\CustomSettings.cs查看所有可供Lua调用的类。通过具体的类可以查找所有的API,例如Util类的部分语句可在Assets\LuaFramework\Scripts\Utility\Util.cs中查看。

4. 运行游戏

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

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

四、热更新的原理

接下来尝试进行代码热更新,让程序下载服务器上的Lua文件并运行。在说明热更新之前,先了解一下Unity3D热更新的一般方法。Unity3D的热更新涉及3个重要目录:

1. 游戏资源目录

该目录包含Unity3D工程中StreamingAssets文件夹下的文件。安装游戏后,这些文件将被完整复制到目标机器上的特定文件夹中,不同平台的文件夹路径不同:

  • Mac OS或Windows:Application.dataPath + "/StreamingAssets"
  • IOS:Application.dataPath + "/Raw"
  • Android:jar:file://" + Application.dataPath + "!/assets/"

2. 数据目录

由于“游戏资源目录”在Android和IOS上是只读的,无法将从网上下载的资源放入其中,因此需要建立一个可读可写的“数据目录”。第一次开启游戏后,程序会将“游戏资源目录”的内容复制到“数据目录”中(此步骤仅执行一次,下次打开游戏时不再复制)。游戏过程中的资源加载,均从“数据目录”中获取并解包。不同平台下,“数据目录”的地址如下:

  • Android或IOS:Application.persistentDataPath + "/LuaFramework"
  • Mac OS或Windows:c:/LuaFramework/
  • 调试模式下:Application.dataPath + "/StreamingAssets/"

需要注意的是,LuaFrameworkStreamingAssets可通过配置进行修改,这里取默认值。

3. 网络资源地址

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

这些目录包含不同版本的资源文件,以及用于版本控制的files.txtfiles.txt中存放着资源文件的名称和MD5码。程序会先下载“网络资源地址”上的files.txt,然后与“数据目录”中文件的MD5码进行比较,更新有变化的文件。

LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs,在实际项目中可能需要进行少许改动。

五、开始热更新代码

下面开始测试热更新代码的功能,以之前实现的“HelloWorld”为例进行热更新。

1. 修改配置

框架的默认配置是从本地加载文件,需要打开AppConst.cs进行如下设置:

  • UpdateMode设置为true,以便执行后续的更新步骤。
  • LuaBundleMode设置为false
  • WebUrl设置成服务器地址。

2. 配置“网络资源”

使用IIS开启本地服务器,然后将StreamingAssets里面的所有内容复制到服务器上。必要时,需要配置一些权限,确保所有文件都可以被下载。

3. 测试热更新

修改Lua脚本内容(例如将“HelloWorld”改为“Hello Lpy2”),点击Build Windows Resource,将“工程目录/StreamingAssets”里面的文件复制到服务器上。再次将脚本修改为其他内容,然后执行Build Windows Resource,覆盖本地资源。运行游戏,如果程序显示“Hello Lpy2”,则证明成功从网上拉取了文件。

了解更多LuaFramework资源热更新的内容,可点击:泰课在线