# Addressables **Repository Path**: chasing2moro/addressables ## Basic Information - **Project Name**: Addressables - **Description**: 讲述Unity如何简单利用Addressables管理资源(包括加载资源、热更资源) - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 6 - **Created**: 2022-06-17 - **Last Updated**: 2024-09-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Addressables ### 介绍 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 ### 准备工作(无需手动修改,工程已设置好): 1. Assets\AddressableAssetsData 目录下 右击创建 CacheInitializationSettings ![图片](./Image/Change0.jpg) 2. 将CacheInitializationSettings作为AddressableAssetSettings 的 Initialization Objects之一 ![图片](./Image/Change1.png) 注意上面✓上的两个选项,意图是:游戏启动的时候不自动更新Catalog;而是在Loading界面更新这个Catalog,根据它获取并下载我们需要下载的资源 3. Cache Directory Override这一栏填上{UnityEngine.Application.persistentDataPath} ![图片](./Image/Change2.png) (感谢这位CSDN作者文章的贡献:https://blog.csdn.net/qq_33805569/article/details/123035205 ,所以用了一张作者的图片) 前面3步,意图是自定义本地路径来存放资源,这样可以方便我们管理资源,否则Addressables会将资源下载到另外一个缓存文件夹里 4. 这一步的设置,是为了和2. 前后呼应 ![图片](./Image/Change3.png) #### 一. Build Addressables资源 1. 打开XAddressables/Build窗口 ![图片](./Image/Build1.png) 2. 点击Mark Address按钮,给ResUpdate目录下所有资源加地址 ![图片](./Image/Build2.png) 加完地址后,你打开Window/Asset Management/Addressables/Groups窗口,会见到资源对应的地址 ![图片](./Image/Build2-1.png) 我们的资源地址是全局命名,不包含路径,这是方便以后资源移动路径。 3. 点击Build Content按钮,生成资源(Build Addressables Asset,简称Build AA) ![图片](./Image/Build3.png) 4. Editor运行游戏方式 4.1 本地资源运行:Window/Asset Management/Addressables/Groups窗口,选择Use Asset Database ![图片](./Image/Build4-1.png) 4.2 Build完的资源运行:Window/Asset Management/Addressables/Groups窗口,选择Use Existing Build ![图片](./Image/Build4-2.png) 5. 到此为止你就可以打包客户端了。 #### 二. 发布热更资源 1. 资源变更后:比如随便改个图片(pic_Hero.jpeg) 2. 打开XAddressables/Package窗口 ![图片](./Image/Package1.png) 3. 按照窗口如下步骤操作,就可以完成热更打包流程了。 ![图片](./Image/Package2.png) 4. 去 “工程路径/ServerData/平台/版本号”路劲下,把所有文件拷贝到服务器(修改服务器地址见下面),就可以热更了: ![图片](./Image/Package3.png) ![图片](./Image/Sever1.png) 5. 服务器地址修改方法如下图: ![图片](./Image/Package4.png) #### 入口场景为:Assets/Scenes/SceneLoading.unity #### 三. Editor上测试热更 1. Window/Asset Management/Addressables/Groups窗口,选择Use Existing Build ![图片](./Image/Build4-2.png) 2. 按照窗口如下步骤点击: ![图片](./Image/TestUpdateInEditor1.png) 因为选了Use Existing Build,所以需要找到第一次打包时的bundle(就是你所想的:存在apk里无法修改的bundle)来运行游戏。于是需要按“Restore bundle”。 直接运行,会用工程最新的Catalog,即使热更资源下载失败,也能加载变化后的bundle运行,无法判断热更是否成功。于是需要按“Restore catalog”,用第一次打包时的Catalog测试热更。 3. Editor上开启热更检测并下载: ![图片](./Image/TestUpdateInEditor2.png) #### 四. 加载资源 - 实例化GameObject: ``` 1. XFactory.Instance.CreateInstanceAsync(string key); //不使用孵化器 2. XFactory.Instance.CreateInstanceAsync(string key, XIncubator incubator, Action callBack)//使用孵化器 ``` - 销毁GameObject: `XGameObject.Destroy(GameObject obj);` 一定要调用上面方法销毁GameObject,才不会泄漏内存。 如果需要在Editor上销毁GameObject,需要右击点击XDestroy,才能保证不会泄露内存。(千万不要直接选中GameObject,然后按Delete键) ![图片](./Image/XDestroy.png) - 加载资源(Texture、Audio、Material...): 1.类 继承 XObjBase 2.调用`this.LoadAssetAsync(string key, Action callback)`方法,让底层管理释放(因为Addressables需要Load*和Release成对出现,才不会泄漏内存)。意思是:如果不想调用Release方法或者不知道啥时候调用Release方法释放资源,就调用这个推荐方法加载。事实上,整个游戏开发,都建议这样做。下面以Texture为例: ``` this.LoadAssetAsync(key, (texture) => { meshRenderer.material.mainTexture = texture; }); ```