前面铺垫了这么久,终于要开始写热更新了。html
Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。java
资源更新是Unity原本就支持的,在各大平台也都能用。而脚本的热更新在iOS平台则是不被容许的(除了Lua)。apache
为了让一套代码能在各个平台都支持热更,将游戏的业务逻辑全面Lua化,是一种解决方法。这也是ToLua在作的事。windows
关于Unity热更与平台的关系 能够阅读陈嘉栋大佬的文章:谁偷了个人热更新?Mono,JIT,iOS浏览器
一、热更新的简单理解
手机App的更新方式有两种。tomcat
第一种是全量更新。每一次App更新,开发者都须要上传一个完整的软件包(apk、ipa)到分发平台,而用户也须要下载一个完整的新软件包来从新安装。这对用户来讲很不友好,对开发者更不友好。服务器
由于开发者上传到平台后,还须要等待平台的漫长审核,特别是iOS平台(短则两天,长则十天半月),非常影响游戏的版本计划。网络
所以第二种更新方式就出来了。oracle
第二种是增量更新,每次更新,开发者上传本次更新的内容到资源服务器上,用户的App客户端也只用更新本次新增内容就行,无需从新下载App。框架
看似很完美的方式,而且在端游上也是成熟的操做,可是这样的方式由于更新内容不可控,被苹果给禁止了(Lua是苹果留的一个口子)。
二、热更新原理详解
(由于我我的对此框架的理解还仅限于使用阶段,并不能很好的阐述其原理。为避免误导,现直接将我学习此框架时所看的文章对于此原理的解释直接引用过来。)
原文连接: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启动成功。
本篇就讲到这里,后边就要讲怎么实现代码及资源更新了。
晚安!