前面铺垫了这么久,终于要开始写热更新了。
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/";