Addressable热更新使用基础
热更新
资源热更新
主要通过 AB 包来实现,比较简单。
代码热更新
csharp 代码打包以后就变成了二进制,和程序同时启动,无法修改。
热更新流程
MD5 值 用 md5 算法,生成资源对应的唯一标识符,有助于资源的增量打包
代码热更新的手段
Lua
ILRuntime
puerts
HyBridCLR(huatuo
AB 包
AssetsBundle Browser
AssetsBundle Browser 的安装
目前 unity packagemanager 已经找不到这个插件了
需要到github去下载
建议使用建议使用 url 的下载方式:unity 编辑器 →Window→packmanager→Add→Url 输入 github 上的获取链接
AssetsBundle Browser 安装问题
报错:boo 找不到
这个 boo Unity 很久就不用了,并且这个报错的脚本在一个叫 Tests 的文件夹中,因此大概率是 unity 团队忘了维护,或者有其他的理由,总之直接把这个 tests 文件夹删了即可。
不再使用 abb
突然发现 unity 官方已经不推荐使用 abb 了而是 addressables assets system(AA
所以现在来研究 AA
AssetStudio
可以对未加密的 ab 包进行逆向工程,解析出资源。
但是我这里软件加载资源出问题了,无法预览,也无法导出。
Addressables Assets System
Unity 新的打包工具,支持加密(应该,之前有个.CN 的加强版,现在找不到了,猜测是合并到一起了。)
安装
直接到 package manager 里面 install 即可
路径命名问题
使用 ab 包时,资源路径不能出现’[]’,建议使用’()’代替
两种不同的打包和加载方式
- 包体内打包与加载
- 包体外打包与加载
包体内我理解为打包到本地,加载则直接到本地的加载目录加载
包体外我理解为打包到服务器,加载则根据给定的服务器地址,进行加载(默认为本地
包体内打包的方式,在项目构建后会被打包到游戏文件内部
包体外的则会在项目的 ServerData/
文件中
打包
点击即可按照设置进行打包
报错
log 显示,有许多 unity 内置的模块居然找不到。尝试换一个编译器版本。
尝试新建项目,发现可以用了,之前的项目出于某种原因,似乎坏掉了。
加载资源
tips:InstantiateAsync 函数可以直接将获取的资源实例化
资源加载时,不需要管是远程资源还是本地资源
加载方法
- 通过 Addressable Name 加载
这种加载方式不需要管是本地资源包还是远程资源包
代码如下:
把这个脚本挂载到一个场景中的游戏物体即可
- 通过引用(AssetsReference)方式加载
原理是通过弱引用获取资源,然后根据弱引用实例化
加载途径
- Use AssetDatabase
这个就是直接加载资源,不是加载 ab 包,一般开发时就用这个就行,因为快。
- Simulate Group
在不打包的情况下,模拟 AssetBundle 的操作。这个模式下,可以通过分析器,查看资源加载状况,分析加载策略
- Use Exising Build
这个模式则是真正的加载资源包
加载远程资源
如果要在 editor 环境下进行测试,需要搭建 web 服务器。
可以使用 addressable 的 Hosting Services 工具
关于报错
要在 project settings/Player/Configuration 中 把 Allow download over HTTP* 选为允许。
打包模式和批量加载
每个 Group 都可以单独设置打包模式
三种模式,分别是 全部打进一个包中,全部分开打包,按照层级打包
第一个就是默认的,第二个所有资源都会单独打成一个 bundle 文件。
一般选第三个,将资源的层级设置好,就可以了,而且还能方便批量加载。
一个资源可以设置多个 lable
批量加载,方法如下。
注意方法名变了。 Asset 和 Assets
打资源热更新包
首先,要支持热更新,需要开启 Catalog
设置好资源打包加载路径。
打包
可能会报错,提示端口被占用,这是因为刚刚在测试远程加载时,开启了这个端口,现在只要 reset 一下就行,这个端口会被重新打开
现在打包出来的文件中,多了两个名为 catalog 的 .hash 和 . json 文件,用于增量打包时对比哪些文件发生了变化。
现在将 Group 中,一个需要替换的资源去除,然后将要替换的资源命名为相同的名字,加入到 Group 中,选择 Update a previous Build
就会多一个更新包
现在再加载,就会加载更新后的资源。
如果不更新,直接选择 Update… 就不会打新的包(亲测
关于资源释放
要通过 Addressables.Release 释放加载 handle 或者加载的结果
问题解决
以下是教程中没有提及的内容,如果你要参考,建议先看教程
首先是 unity 的设置问题,在 Player 的 Config 设置中,需要允许从 http 服务器下载资源
然后是编辑器中 Addressable asset settings
如果要实现热更新,必须开启 Build remote catalog
功能
这个选项下面的 Buid&Load Paths
指的是远程包对应的 catalog 的构建和加载路径路径
在构建项目,或者打包本地资源时,会输出两个同名文件 catalog,分别时.hash 和.json 后缀的文件。
勾选上述的 Build Remote Catalog
功能后,复制一份 catalog 作为你远程资源的目录,这份 catalog 的位置取决于你选择的路径。
个人理解,这份 catalog 应该作为最新的目录,放在服务器,用于进行资源更新对比。
构建游戏时,addressable 会自动打一次 local 包,同时将这些包作为游戏打包时的包内资源。
也就是说,游戏根目录中 streamingassets 文件中的资源,是由编辑器中所有 local 的 addressable 资源构成(包括所有 local 分组