前一段时间换工作,一直没有稳定下来,所以一直没有写文章,今天好不容易有了时间,刚刚好现在的工作刚刚写了资源更新这一块,故记录下。
0 编辑器中的工作
需要在编辑器中进行资源打包(自定义版本号),会生成资源配置表和版本号配置。并且将两个配置表和需要更新的资源上传值服务器。一般这一步都是在专门的打包工程进行,可以使用Unity命令行工具,或者使用jenkins在自动构建时自动进行。
1 资源配置表
资源配置表用来表示记录资源。保存资源的路径和资源的MD5值类似如下
ABs/font/font.ab|1746131361f22d8575fb5832db155932|5c084153d4545e6fed456182ec47c4c9
ABs/shader/shader.ab|b012e0dfd1c75538bf0f8a0f65272f15|cc0ca75be9cd3a78642cc2b9b4604ebe
ABs/uiatlas/activesence.ab|3041b67bfa0f844dd99310380afe371e|35386009967d4eaa39507b3dd713d4e3
ABs/uiatlas/choukagold.ab|6c511f035d85a404726658aea8dff57c|8d19009e595db0d54b4fa78e82f069b5
ABs/uiatlas/choukazuanshi.ab|ae2090bb2a31abae3656085d33fc8765|f1c3efe282aae9c6333b24929a51986a
该表服务器和客户端各有一份,进行对比就可以知道那些资源有变化。前面的路径是资源在客户端中表示在Unity中的相对路径,在服务中则表示该资源的存储地址。中间的值是Unity中资源的唯一标识hash值。后面的值的MD5,表示该资源的唯一信,如果服务器和客户端相同的资源MD5不一样,则表示该资源有问题。
2 解包文件
在进行开发的时候,资源文件(assetsbundle文件)一般都是放在StreamAssets文件夹下面的,但是这个路径是只读的,没有办法进行动态的替换或者更新。所以使用可读可写的Application.Persistentdatapath对应的路径作为资源更新的目标路径。在游戏启动的时候,判断目标路径下是否有文件就可知道游戏是否是第一次启动。
如果是第一次启动就需要将客户端的资源,资源配置文件和版本号文件复制到目标路径。为了节省时间,不在进行资源的复制(目标路径只是存储配置文件和从服务下载下来的更新资源,读取的时候优先读取目标目标下,如果读不到,则读取StreamAssets中资源)。在解包完成的时候进行版本对比,否则直接进行版本对比
3 版本对比
在解包完成或游戏启动的时需要想服务器请求最新的资源版本和更新地址。然后使用这个版本号和和客户端目标目录下的版本进行对比,就可以知道客户端资源是不是最新的。如果服务器版本号大于客户端则进入更新流程。否则直接进入游戏。
4 生成差异文件
在服务器版本号大于客户端版本时,需要向服务器请求资源配置文件。然后和目录目录下的资源配置文件进行对比,如果目标路径下没有版本号对于的差异文件,则生成差异文件,用服务器的资源配置文件替换目录目录下的资源配置文件。否则说明上面更新失败,直接进行资源更新。
差异文件的格式如下:
Abs/font.ab|5c084153d4545e6fed456182ec47c4c9 ABs/shader/shader.ab|cc0ca75be9cd3a78642cc2b9b4604ebe
|前的的表示资源的路径,|后面表示资源的MD5值,资源的更新将基于这个差异文件,并且也可以保存更新的进度。
5 更新资源
更第4步生成的差异文件中|前面的资源路径资源更新地址,得到该资源的更新地址。下载最新的资源到目标路径中资源配置文件记录的路径中,进行资源文件的更新,然后更新对应的差异文件。
6 更新配置文件
完成更新一个资源,需要在差异文件中,删除对应的资源记录。如果全部更新全部完成,则删除差异文件,替换版本号。否则,直接跳出,差异文件和版本文件不会被更新。
总结
本文记录了Unity中资源热更新的流程。在lua代码热更新中,lua被视为一种文本资源,所以该流程对lua热更新同样适用。
关注公众号,回复“热更”,获取源码下载
欢迎扫码关注,获得精彩内容
各位客官,觉得有用,点个赞分享一下吧~
本文分享自微信公众号 - 游戏人的开发分享(No_2SeeYou)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。