前言
前面铺垫了这么久,终于要开始写热更新了。
Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。
资源更新是Unity本来就支持的,在各大平台也都能用。而脚本的热更新在iOS平台则是不被允许的(除了Lua)。
为了让一套代码能在各个平台都支持热更,将游戏的业务逻辑全面Lua化,是一种解决方法。这也是ToLua在做的事。
关于Unity热更与平台的关系 可以阅读陈嘉栋大佬的文章:谁偷了我的热更新?Mono,JIT,iOS
一、热更新的原理
1、热更新的简单理解
手机App的更新方式有两种。
第一种是全量更新。每一次App更新,开发者都需要上传一个完整的软件包(apk、ipa)到分发平台,而用户也需要下载一个完整的新软件包来重新安装。这对用户来说很不友好,对开发者更不友好。
因为开发者上传到平台后,还需要等待平台的漫长审核,特别是iOS平台(短则两天,长则十天半月),很是影响游戏的版本计划。
因此第二种更新方式就出来了。
第二种是增量更新,每次更新,开发者上传本次更新的内容到资源服务器上,用户的App客户端也只用更新本次新增内容就行,无需重新下载App。
看似很完美的方式,并且在端游上也是成熟的操作,但是这样的方式因为更新内容不可控,被苹果给禁止了(Lua是苹果留的一个口子)。
2、热更新原理详解
(因为我个人对此框架的理解还仅限于使用阶段,并不能很好的阐述其原理。为避免误导,现直接将我学习此框架时所看的文章对于此原理的解释直接引用过来。)
原文链接:https://zhuanlan.zhihu.com/p/21386682
以下两条分隔线之间的内容都是引用:
如下图所示,Unity3D的热更新会涉及3个目录。
热更新的过程图
游戏资源目录:里面包含Unity3D工程中StreamingAssets文件夹下的文件。安装游戏之后,这些文件将会被一字不差地复制到目标机器上的特定文件夹里,不同平台的文件夹不同,如下所示(上图以windows平台为例)
Mac OS或Windows:Application.dataPath + "/StreamingAssets"; IOS: Application.dataPath + "/Raw"; Android:jar:file://" + Application.dataPath + "!/assets/";数据目录:由于“游戏资源目录”在Android和IOS上是只读的,不能把网上的下载的资源放到里面,所以需要建立一个“数据目录”,该目录可读可写。第一次开启游戏后,程序将“游戏资源目录”的内容复制到“数据目录中”(步骤1,这个步骤只会执行一次,下次再打开游戏就不复制了)。游戏过程中的资源加载,都是从“数据目录”中获取、解包(步骤3)。不同平台下,“数据目录”的地址也不同,LuaFramework的定义如下:
Android或IOS:Application.persistentDataPath + "/LuaFramework" Mac OS或Windows:c:/LuaFramework/ 调试模式下:Application.dataPath + "/StreamingAssets/"注:”LuaFramework”和”StreamingAssets”由配置决定,这里取默认值网络资源地址:存放游戏资源的网址,游戏开启后,程序会从网络资源地址下载一些更新的文件到数据目录。
这些目录包含着不同版本的资源文件,以及用于版本控制的files.txt。Files.txt的内容如下图所示,里面存放着资源文件的名称和md5码。程序会先下载“网络资源地址”上的files.txt,然后与“数据目录”中文件的md5码做比较,更新有变化的文件(步骤2)。
files.txt
LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs,真正用到项目时可能还需少许改动。
个人理解:
游戏资源目录: 是游戏的安装目录。如果在是Unity里直接运行,应该指的就是Assset/StreamingAssets目录;
如果是打包成exe程序,应该是exe程序里的某个目录(猜的,没验证)
数据目录:因为游戏资源目录不可写,因此程序又额外开辟的一个能读写的目录,就是数据目录。
网络资源地址:这个说的就是服务器资源目录了。
二、热更服务器搭建
从上文了解下,要实现热更新功能,一个用于存放网络资源的服务器是必须的。我这里选用Tomcat来做服务器(任何其它能提供网络访问服务的服务器都可以)。
下载并安装Tomcat
1)下载Tomcat
版本:Tomcat9.0 windows平台64位版,下载地址:https://tomcat.apache.org/download-90.cgi
2)下载JDK
jdk版本1.8或以上(这个版本根据Tomcat的需求来,如果使用其它版本Tomcat,则可能需要其它版本的jdk)
下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
3)环境变量配置
Tomcat下载之后,无需安装,解压到指定目录即可。
JDK下载之后,执行安装程序,直到结束。
为了让Tomcat能正常运行,需要配置环境变量,我配置了如下四项。
用户变量里加这两个:
JAVA_HOME:F:\ProgramsDirectory\Java\jdk1.8
CATALINA_HOME: I:\apache-tomcat-9.0.22
系统变量Path里添加这两个目录:
F:\ProgramsDirectory\Java\jdk1.8\bin
I:\apache-tomcat-9.0.22\bin
请参照自己的实际目录进行调整,这里不提供详细的配置方法,我这个也不是标准配法。有问题请善用搜索。
4)运行Tomcat
环境变量配置完成之后,执行apache-tomcat-9.0.22\bin目录下的startup.bat文件。
看到http-nio-8080之类的字样,表示服务器已经运行,如下图。
(我这里不知道为啥乱码了,明明没有中文及空格等不合规目录,不过不影响使用)
在浏览器里输入:http://localhost:8080/ ,看到如下页面,表示Tomcat启动成功。
本篇就讲到这里,后边就要讲怎么实现代码及资源更新了。
晚安!