最新文章
泰课在线 | 微信拼团成功后如何获取课程?
08-09 17:57
Unity教程 | 使用ARKit为iOS开发AR应用
07-31 17:23
Unity Pro专业版7折订阅四选一工具包之VR开发与艺术设计
07-28 11:47
网友使用虚幻UE4实现CAVE 多通道立体渲染的沉浸式环境
07-27 11:57
VR晕动症调查:未来5年内大部分VR晕动症将得到解决
07-27 11:26
AMD CEO:未来3-5年最重要 希望5年达1亿VR用户
07-27 10:44
Unity3d游戏热更新专题
一、Unity3D热更新概述
在Unity3D开发中,热更新是一个无法回避的重要话题。热更新的主要目的是让用户能够及时获得游戏资源和代码的变更。例如,当游戏推出新版本时,可能会涉及内容资源的增加以及游戏逻辑的变更。
在热更新中,脚本热更新尤为关键。目前,有两种常见的脚本选择:
- Lua脚本:Lua由魔兽世界采用作为界面脚本,在游戏行业中广受欢迎,历经十年依然保持热度。Unity有许多Lua的绑定库,还有像UniLua这样的纯C#移植实现。
- 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.lua的Main方法。
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/"
需要注意的是,LuaFramework和StreamingAssets可通过配置进行修改,这里取默认值。
3. 网络资源地址
该地址用于存放游戏资源的网址。游戏开启后,程序会从网络资源地址下载一些更新的文件到数据目录。
这些目录包含不同版本的资源文件,以及用于版本控制的files.txt。files.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资源热更新的内容,可点击:泰课在线。