制作一个承载想法的东西(四)——更新场景

  • A+
所属分类:Unity3d 原创文章

前面说过场景管理器在初始化的时候就会进入一个默认的场景,它就是这个更新场景。更新场景就如其名,功能就是就检测版本更新,下载资源文件的。首先就不先看更新场景的逻辑了,一步一步来,既然要检测版本更新,就要有版本信息的文件,要下载新资源就要检测资源的是否是新,就要对应的一个记录文件md5信息的文件。

首先,主要更新的东西就是每个整场景的资源文件和一个一个的lua脚本文件,我没有将资源一个一个的细分为AssetBundle也没有将lua脚本打包成AssetBundle,甚至也没有加密lua脚本,是因为这仅仅只是我做一些自己想法的东西,很多东西就怎么方便怎么来了,如果后面有这样的需求就再修改就好了。所以这样就很简单明了了,资源就是一个一个的场景流文件和一个一个的lua脚本,将他们分别放在一个文件夹内,这样就很好的管理起来不混乱了。

 

资源场景的打包,都存放都一个叫Res的文件夹中,代表的就是资源文件,下面看一下把整场景打包成AssetBundle的工具类,存放的路径统一放在项目的根目录下的Res文件夹中,因为后面生成版本文件的时候就需要用到了。除了场景资源,以后所有的更新资源都放在这里,通过子文件夹分类

 

好了,资源文件已经准备好了,现在还需要准备的就是lua文件了,lua'文件就比较简单了,因为它们已经规范的都放置再一个叫Src的文件夹中了

制作一个承载想法的东西(四)——更新场景

 

那么就可以开始生成我们的版本文件了和文件的md5信息了,这里通过使用python很方便去执行。首先就是将原来准备好的资源目录和脚本目录复制到该python脚本的路径下,先说说为什么复制,因为文件都是需要上传到服务器的,为了减少上传,可以做当前版本和未来版本对比,移除不需要更新的部分(我这里没做,嘻嘻)。然后就是遍历这两个文件夹的这些文件咯,计算md5值,保存成json文件咯。

制作一个承载想法的东西(四)——更新场景制作一个承载想法的东西(四)——更新场景

 

好了,所有东西都准备好了,可以来去看看更新场景UpdateScene.lua了。很简单明了,主要在初始化的时候,获取了进度条和显示信息的文本UI,注册事件以更新UI信息,最后驱动UpdateController.lua的运行,主要更新逻辑在那里。

 

 

下面就来看看这个最重要的更新逻辑了,首先携程调用检测版本信息,对比通过网络请求远程额版本文件信息和本地的版本文件信息,这个版本文件和同样记录md5信息的文件在打包的时候会生成一次最新的存放在Resources中,若在更新目录中找不到它们就会去Resources中去获取。如果版本信息是大版本更新,则打开官方去下载新包或内置下载也行,如果是小版本更新,则开启检测md5文件信息。同样的,是开启一个携程,对比远程下载的md5信息文件和本地的md5信息文件,遍历md5信息,新加的和md5对应不上的,都添加到下载,通过计数器来判断下载是否完成。在下载完成后,显示一个退出的按钮,提示退出应用后再进,因为如果更新了一些管理类的话不重启是不会用到最新的,暂时没想到自动重启的办法。这里有一个下载管理器,其实也是通过携程运用WWW去下载文件的,获取到byte数组数据通过工具类保存文件,也没什么好展示的了。

 

对了,lua文件下载下来了,怎么知道在lua脚本中require的是从最新的下载目录中的呢。所以需要提供一个资源加载器,ToLua中已经有了,在new一个LuaState之前new一个LuaResLoader替代LuaFileUtils,这里重写了加载的方法,是优先读取下载目录的文件还是根据SerachPath来(base)都是可以根据不同情况自己决定的。而LuaState初始化的时候会向lua环境中添加一个LuaLoader,而这个Loader会调用LuaResLoader的ReadFile方法,所以require也是用的同一个加载方式,管好自己的加载顺序就好了。

 

好了,这样更新场景就完成了,在需要更新的时候,将场景资源打包,修改版本信息,运行Update.py,生成好版本文件和md5信息文件,然后将Res和Src目录文件上传到服务器中,再将Version下的版本信息文件上传,这样更新步骤就完成了。

再这里用到的registEvent、callEvent、removeEvent和UtilityManager都可以在上一篇中看到,这里就不再重复内容了。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: