Unity Addressables之Build资源、热更、加载
文章目录
介绍
Unity大家经常听说Addressables的好处,但是没有完成的例子。 下面讲述Addressables如何使用:
一. Build Addressables资源
二. 发布热更资源
三. Editor上测试热更
四. 加载资源
于是我写了一个完整的例子(Addressables Version 1.20.0 - May 04, 2022)贡献给大家。
gitee地址:https://gitee.com/chasing2moro/addressables
有问题可以查阅官网:https://docs.unity3d.com/Packages/com.unity.addressables@1.20/manual/index.html
如果解决不了,可以联系邮箱:chasing2moro@qq.com
准备工作(无需手动修改,工程已设置好):
- Assets\AddressableAssetsData 目录下 右击创建 CacheInitializationSettings
- 将CacheInitializationSettings作为AddressableAssetSettings 的 Initialization Objects之一
注意上面✓上的两个选项,意图是:游戏启动的时候不自动更新Catalog;而是在Loading界面更新这个Catalog,根据它获取并下载我们需要下载的资源 - Cache Directory Override这一栏填上{UnityEngine.Application.persistentDataPath}
(感谢这位CSDN作者文章的贡献:https://blog.csdn.net/qq_33805569/article/details/123035205 ,所以用了一张作者的图片)
前面3步,意图是自定义本地路径来存放资源,这样可以方便我们管理资源,否则Addressables会将资源下载到另外一个缓存文件夹里 - 这一步的设置,是为了和2. 前后呼应
一. Build Addressables资源
- 打开XAddressables/Build窗口
- 点击Mark Address按钮,给ResUpdate目录下所有资源加地址
加完地址后,你打开Window/Asset Management/Addressables/Groups窗口,会见到资源对应的地址
我们的资源地址是全局命名,不包含路径,这是方便以后资源移动路径。 - 点击Build Content按钮,生成资源(Build Addressables Asset,简称Build AA)
- Editor运行游戏方式
4.1 本地资源运行:Window/Asset Management/Addressables/Groups窗口,选择Use Asset Database
4.2 Build完的资源运行:Window/Asset Management/Addressables/Groups窗口,选择Use Existing Build
- 到此为止你就可以打包客户端了。
二. 发布热更资源
- 资源变更后:比如随便改个图片(pic_Hero.jpeg)
- 打开XAddressables/Package窗口
- 按照窗口如下步骤操作,就可以完成热更打包流程了。
- 去 “工程路径/ServerData/平台/版本号”路劲下,把所有文件拷贝到服务器(修改服务器地址见下面),就可以热更了:
- 服务器地址修改方法如下图:
入口场景为:Assets/Scenes/SceneLoading.unity
三. Editor上测试热更
- Window/Asset Management/Addressables/Groups窗口,选择Use Existing Build
- 按照窗口如下步骤点击:
因为选了Use Existing Build,所以需要找到第一次打包时的bundle(就是你所想的:存在apk里无法修改的bundle)来运行游戏。于是需要按“Restore bundle”。
直接运行,会用工程最新的Catalog,即使热更资源下载失败,也能加载变化后的bundle运行,无法判断热更是否成功。于是需要按“Restore catalog”,用第一次打包时的Catalog测试热更。 - Editor上开启热更检测并下载:
四. 加载资源
- 实例化GameObject:
1. XFactory.Instance.CreateInstanceAsync(string key); //不使用孵化器
2. XFactory.Instance.CreateInstanceAsync(string key, XIncubator incubator, Action<GameObject> callBack)//使用孵化器
- 销毁GameObject:
XGameObject.Destroy(GameObject obj);
一定要调用上面方法销毁GameObject,才不会泄漏内存。
如果需要在Editor上销毁GameObject,需要右击点击XDestroy,才能保证不会泄露内存。(千万不要直接选中GameObject,然后按Delete键)
- 加载资源(Texture、Audio、Material…):
1.类 继承 XObjBase
2.调用this.LoadAssetAsync<T>(string key, Action<T> callback)
方法,让底层管理释放(因为Addressables需要Load*和Release成对出现,才不会泄漏内存)。意思是:如果不想调用Release方法或者不知道啥时候调用Release方法释放资源,就调用这个推荐方法加载。事实上,整个游戏开发,都建议这样做。下面以Texture为例:
this.LoadAssetAsync<Texture>(key, (texture) =>
{
meshRenderer.material.mainTexture = texture;
});