游戏打包,安装到手机上后,沙盒目录下是空的,StreamingAssets目录下应该有三个bundle的配置文件和实际的bundle若干。三个配置文件分别是
AssetBundleManifest | unity自动生成 |
asset-bundle | 资源和Bundle对应关系(打包脚本生成) |
bundle-hash | 每个bundle的哈希值(打包脚本生成) |
游戏运行,首先从服务器下载最新的三个bundle配置文件到沙盒目录,然后对比StreamingAssets目录下hundle-hash的差异,
然后从服务器下载差异的bundle具体文件到沙盒目录。
游戏实际读取bundle配置文件从沙盒读取,读取具体的bundle文件,首先从沙盒目录取,沙盒目录里没有,才到StreamingAssets目录读取。
首次生成 | ||
沙盒目录 | StreamingAssets目录 | |
空 | AssetBundleManifest | unity自动生成 |
asset-bundle | 资源和Bundle对应关系(打包脚本生成) | |
bundle-hash | 每个bundle的哈希值(打包脚本生成) | |
bundle-1 | 实际的bundle | |
bundle-2 | ||
运行游戏(step_1) | ||
沙盒目录 | StreamingAssets目录 | |
AssetBundleManifest(服务器最新) | AssetBundleManifest | 从服务器获取最新的bunle配置文件到沙盒目录 |
asset-bundle(服务器最新) | asset-bundle | |
bundle-hash(服务器最新) | bundle-hash | |
bundle-1 | ||
bundle-2 | ||
运行游戏(step_2) | ||
沙盒目录 | StreamingAssets目录 | |
AssetBundleManifest(服务器最新) | AssetBundleManifest | 对比StreamingAssets下的bundle-hash和沙盒目录的bundle-hash,下载差异的bundle,这里是bundle-2变了,并新增加bundle-3 |
asset-bundle(服务器最新) | asset-bundle | |
bundle-hash(服务器最新) | bundle-hash | |
bundle-2_new | bundle-1 | |
bundle-3 | bundle-2 | |
运行游戏(step_3) | ||
沙盒目录 | StreamingAssets目录 | |
AssetBundleManifest(服务器最新) | AssetBundleManifest | 每次读bundle配置文件从沙盒目录读取,每次读实际的bundle首先从沙盒目录读,如果沙盒目录没有才从StreamingAssets目录取 |
asset-bundle(服务器最新) | asset-bundle | |
bundle-hash(服务器最新) | bundle-hash | |
bundle-2_new | bundle-1 | |
bundle-3 | bundle-2 |
以上流程貌似走通了,但实际还是有问题。第一次更新后StreamingAssets目录和沙盒目录都是bundle配置文件。如果第二次更新应该是沙盒的配置文化和服务器最新的配置文件对比。而且每次下载前应该对当前的bundle配置文件先备份,然后再从服务器下载最新的配置文件。因此为了统一流程,游戏运行时,如果发现沙盒目录没有bundle配置文件,那么先从StreamingAssets拷贝一份到沙盒目录,再备份,再下载最新的bundle配置文件,最后对比差异,下载差异的实际bundle。
这样流程是走通了,但每次都要备份bundle配置文件,然后从服务下载最新的配置文件。如果是有差异倒是罢了,但如果没有差异,就是没有更新,岂不是备份和下载是多余的吗? 可以优化下,把这三个配置文件做MD5,同时服务器也有这三个配置文件的MD5,如果发现沙盒的MD5和服务器MD5不一致才下载。这样也省去在沙盒目录备份bundle配置文件这一步骤。当然,上一步提的,如果发现沙盒目录是空的,需要从StreamingAssets目录拷贝一份过去,这一步还是需要的。当然,这一步能执行的条件也就是首次安装好游戏,首次运行时。
如果是大版本更新,那么首次安装后,StreamingAssets目录下的内容都是最新的,那怎么办?目录解决的方案是在当前包中记录一个版本号,安装后首先从PlayerPrefs中读取版本号,如果版本号为空,或者比包内版本小,那么执行上一段的中,从StreamingAssets目录中拷贝配置文件到沙盒目录,并且要清空沙盒目录下那些曾经下载过的具体的bundle文件。