一、什么是Addressables
简单来说 Addressables是取代AssetBundle管理资源的系统。它具备自动分配地址功能,在使用时自动寻址加载,自动对本地移动资源进行跟踪并处理资源之间的依赖关系。
二、Addressables的基本配置
1、导入Addressables资源包
2、创建Addressables 的资产包管理
点击 Windows > Asset ManageMent > Addressables > Groups
然后点击创建Addressables Settings
3、资源集合Group的基本操作
- 右键Groups窗口创建一个新的Group,选中新创建出来的Group,按F2修改其名称
- 在创建一个新的Group时,AssetGroups会对应生成YAML格式的文件,用来记录资源内容和引导
- 选中一个Group,右侧的Inspector窗口会显示一些基本信息(构建路径、加载路径等等)
4、配置P配置Profile设置
- 在打开的Groups窗口中 点击 Profile > Manage Profiles
- 修改Local的Type为Custom,将下面的Local.BuildPath和Local.LoadPath改成自己想要的文件目录
- Local...Path为本地相关路径。 Remote...Path为远程资源包路径设置相关
- 当我们手动修改Profile的设置时,对应Group的YAML的文件中的路径也会跟着变化
5、添加Addressables Labels
点击Groups窗口的Tools > Window > Labels
点击+号创建Labels
Addressables Labels用途
- 可以使用一个或多个标签作为标识需要再运行时加载的资产
- 可以根据其分配的标签将资产打包到一个组中
- 可以在Groups窗口中用标签来筛选资产
三、本地热更流程
1、创建一个Cube预制体,将Cube预制体手动拖动到Group中
2、点击Group下的资源,按F2修改其名字,并手动修改Labels
3、创建一个热更脚本,命名为HotUpdateTest
- 脚本中的“Test”就是我们前面修改的资源包名称
- 将脚本挂载在场景的空节点下
using UnityEngine;
using UnityEngine.AddressableAssets;
public class HotUpdateTest : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.C))
{
//异步加载 实例化 名为 Test 的预制件 并设置 其位置、旋转等 参数
Addressables.InstantiateAsync("Test", new Vector3(0, 1.4f, 0), Quaternion.identity);
}
if (Input.GetKeyDown(KeyCode.Escape))
{
//退出程序
Application.Quit();
}
}
}
4、打开Groups窗口,进行第一次资源包Build
- 本地资源会在包体内,而远程资源是不会打进包体的,需要放到指定位置去加载。
5、然后我们打个游戏包,运行游戏按C会出现一个正方体
6、实现本地资源热更新
- 修改Groups下的资源,新建一个Cylinder圆柱体,拖入Group中,修改名称为Test,将原来的资源删除
- 点击Bulid > Update a Previous Build 选中Windows下的Bin文件
- 等待处理完毕
- 我们重新运行刚刚打出的游戏包
- 这个时候我们按C创建出来的是刚刚添加的圆柱体了
四、加载资源API
参数我用伪代码带过
//使用Addressables.LoadAssetAsync加载单个资源:
Addressables.LoadAssetAsync<GameObject>("Test").Completed += handle =>
{
GameObject obj = handle.Result;
Instantiate(obj);
};
//使用Addressables.LoadAssetsAsync加载多个资源:
Addressables.LoadAssetsAsync<GameObject>(new List<GameObject>...).Completed += handle =>
{
foreach (var obj in handle.Result)
{
Instantiate(obj);
}
};
//使用Addressables.InstantiateAsync直接实例化资源:
Addressables.InstantiateAsync("Test").Completed += handle =>
{
GameObject obj = handle.Result;
// 实例化后的处理
};
//使用Addressables.Release来释放资源:
Addressables.Release(GameObject);