谈到客户端应用的开发都不得不谈到资源管理,毕竟这影响到包体机,还有用户体验等,而Unity本身提供了AssetBundle这么一个用来管理资源的东西,是挺好用的。所以也是基于它,恰好最近在捋手头上开发的应用的,想记录下这个资源管理的方式。这个方式并非独创,其实应该有不少的人已经在这么做了,所以单纯的整理一下实现的思路。
现在经常能够看到一些手机游戏他们的包体积非常小,但往往进入之后只玩完一个向导,就会提示用户下载一个很大的数据包。所以今天要说的这个实现方式正是它,那么首先我们在打包时应该只把程序基础的资源打包进去,这个基础资源通常也就是指应用的入口,或者更深一些,比如加上游戏的向导。在接下来的流程里面应该是这样的:判断有没有新的资源需要下载,这个可以通过版本号实现,自己游戏缓存一个存着资源版本号的文件,然后由服务端提供一个获取资源版本号的网络协议。通过对比两者的大小,来得知客户端需不需要下载新的资源文件。如果需要那么从服务端给的链接下载新的资源包,并且缓存到本地(关于如何缓存到本地我之前有写过一篇讲如何动态加载资源并且缓存到本地的文章,另外补充下之前文章说到的WWW的LoadFromCacheOrDownload函数是说如果内存中有且内存中的AssetBundle是最新,那么直接使用内存的,如果没有才去对应的URL加载这个URL可以来自网络,也可以来自本地,这也是为什么单独使用它并不能缓存到本地,因为他加载后是加载到内存中,导致退出应用后每次又去网络下载)。这里的资源包就是Unity提供的AssetBundle,所以这需要我们在开发过程中,把这些需要通过动态加载的资源放在一个目录,然后通过写一个编辑器扩展的脚本来对这些资源打包成AssetBundle,然后之前我们提到的入口程序执行完毕并且下载完资源包缓存到本地之后,接下来需要做的就是通过动态加载这些资源包生成我们的场景,页面,音乐,模型等,加载的过程需要一些时间,所以可以安排一个Loading页面来做。
总结一下,这个资源管理的逻辑应该是先判断有没有资源包需要更新,有则下载并且缓存到本地,然后通过WWW类加载这些缓存到本地的AssetBundle实现资源的动态加载。这个方案未必是最好,但是考虑到3d游戏所含资源大小比较大的时候所实现的一种方式,如果本身游戏大小可以接受的话,还是可以直接将资源打到包里,这样毕竟是最快的,可以省去加载AssetBundle的时间。所以,具体使用哪种方式,还是要根据实际项目来决定。