Addressables 资源管理全解

本文详细介绍了Unity的Addressables系统,用于动态加载和管理游戏资源。内容包括Addressables的导入、设置、资源分包、远程资源配置、打包流程、多种加载方式以及资源释放。此外,还讨论了加载环境模拟、引用分析、本地服务器和WebGL平台的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是Addresables

Unity Addressable Asset system 提供了一个可以随着您的项目而增长的系统,无需编程即可以取代AssetBundle管理资源。
具备自分配地址功能,使用到时自动寻址加载、自动对本地移动资源进行跟踪并处理依赖关系。

二、导入Addressables

1.点击 Windows > PackageManager
2.搜索 Addressables ,并导入插件
3.Unity要求使用2019以后版本
在这里插入图片描述

注:实际项目中,建议大家下载 Addressables.CN 版本。
在这里插入图片描述

三、创建Addressables Settings 资产包管理

1.点击 Windows > Asset Management > Addressables > Groups
在这里插入图片描述

2.在弹出的 Addressables Group 窗口中点击 Create Addressables Settings 按钮,创建 AddressablesAssetsData
此时默认创建了一个组 Default Local Group (Default) , Addressable 默认按**Group**为节进行AssetBundle打包
即,此界面中可以创建多个 Group ,可存放资源,即会按 Group 为生成 AssetBundle.
在这里插入图片描述

3.创建 Addressable Settings 时工程中也会生成一个 AddressableAssetsData 文件夹,里面有很多设置文件。
在这里插入图片描述

四、资源集合Group的基本操作(资源分包)

1.在 Addressables Group 中可以通过点击空白处,创建新的 Group ,可用做包外资源组(远程资源包)
在这里插入图片描述

2.通过右键 Rename 可以修改 Group 名字
在这里插入图片描述

3.然后可以通过拖入或勾选资源 Inspector 窗口上的 Addressable 加入资源。
在这里插入图片描述

4.在创建 Group 时, AssetGroups 也会对应的生成 YAML 格式文件,记录资源内容与引导
在这里插入图片描述

五、设置远程资源包

1.选择 Group 或对应的 YAML 格式文件,在Inspector窗口可以看到构建路径 Build Path 和 加载路径 Load Path.
在这里插入图片描述
2.可以对应修改为 RemoteBuildPathRemoteLoadPath ,可以看到下面对应的地址也发生了改变。
在这里插入图片描述
这样构建和加载时就会去到以上对应的地址。

3.远程资源包的地址可以点击 Addressables Groups > Manager Profiles
在这里插入图片描述
Windows > Asset Management > Addressables > Profiles 按钮
在这里插入图片描述

4.打开 Addressables Profiles 窗口进行修改,如下图:在这里插入图片描述

可以先保持不动,下面会先用到这个地址。

六、如何打包

1.我们执行一下 Build / New Build / Default Build Script ,打出 Addressable 资源包,点击后等待一会,完成会有Log提示。
在这里插入图片描述

2.构建出来的本地资源Bundle会存放 Library 下指定地址内,如下图:
在这里插入图片描述

3.构建出来的远程资源工程 根目录下 会存放ServerData下指定地址内,如下图:
在这里插入图片描述

4.值得注意:
是本地资源是会随着APK打包在包体内的。
而远程资源则不会被打包进去 ,需要放到指定位置去加载。

七、加载方式

7-1. Mono脚本指定和实例化:

Mono 脚本 public AssetReference 指定和实例化:
如果我们声明的不是 AssetReference 类型,而是 GameObject 类型,那么场景就直接依赖了预设,这个预设会被打到场景中,但我们这里用的是 AssetReference ,场景并不会真的依赖Sphere预设,它是一个弱引用。

public AssetReference spherePrefabRef;
void Start()
{
    spherePrefabRef.LoadAssetAsync<GameObject>().Completed += (obj) =>
    {
        // 预设
        GameObject spherePrefab = obj.Result;
        // 实例化
        GameObject sphereObj = Instantiate(spherePrefab);
    };
}
7-2. 直接实例化指定物体

AssetReference 直接实例化指定物体:
同样, AssetReference 也提供了 InstantiateAsync 方法,方便一步到位进行实例化:

spherePrefabRef.InstantiateAsync().Completed += (obj) =>
{
  // 已实例化的物体
  GameObject sphereObj = obj.Result;
};
7-3.异步回调加载

例子 Addressables.LoadAssetAsync ,监听 Completed 回调,在回调中拿到资源然后进行操作:
我们加载资源的时间不需要知道资源在哪个 Group 中,也不需要知道资源在哪。只需要知道 Addressable Name
以此为加载依据即可,比如:
在这里插入图片描述

如图资源名字:Map1Bulid

Addressables.LoadAssetAsync<GameObject>("Map1Bulid").Completed += (handle) =>
{
    // 预设物体
    GameObject prefabObj = handle.Result;
    // 实例化
    GameObject cubeObj = Instantiate(prefabObj);
};
7-4.异步直接实例化

Addressables 还提供了 InstantiateAsync 接口,方便直接一步到位实例化,示例:

Addressables.InstantiateAsync("Map1Bulid").Completed += (handle) =>
{
    // 已实例化的物体
    GameObject cubeObj = handle.Result;
};
7-5.使用 async 、await的方式

使用 asyncawait 的方式,示例:

private async void InstantiateCube()
{
    // 虽然这里使用了Task,但并没有使用多线程
    GameObject prefabObj = await Addressables.LoadAssetAsync<GameObject>("Map1Bulid").Task;
    // 实例化
    GameObject cubeObj = Instantiate(prefabObj);
    // 也可直接使用InstantiateAsync方法
    // GameObject cubeObj = await Addressables.InstantiateAsync("Map1Bulid").Task;
}
7-6.加载场景

使用 Addressables.LoadSceneAsync 加载场景

StartCoroutine(LoadScene());
private IEnumerator LoadScene()
{
    var sceneHandle = Addressables.LoadSceneAsync("NewScene");
    if (sceneHandle.Status == AsyncOperationStatus.Failed)
    {
        Debug.LogError("场景加载异常:" + sceneHandle.OperationException.ToString());
    }
    while (!sceneHandle.IsDone)
    {
        //监控进度0~1
        float progress = sceneHandle.PercentComplete;
        Debug.Log("加载进度:" + progress);
        yield return null;
    }
    Debug.Log("加载完毕:");
}

八、加载环境模拟

Addressables资源加载模式有三个,如下,默认情况下是Use Asset Database (fastest)
在这里插入图片描述

1. Use Asset Database (fastest)

可以直接从AssetDatabase加载资源,避免打包过程,因此加载速度很快。但是这种方式获取的Profiler信息较少,因为Addressables系统不需要打包资源,所以不会产生AssetBundle的缓存信息。因此,在项目开发阶段,建议使用这种非打包方式,以快速加载资源。

2. Simulate Groups (advanced)

这种模式下,是通过模拟AssetBundle的操作,以获取与打包方式类似的Profiler信息。但不同于直接从AssetDatabase加载资源,其会模拟出AssetBundle的缓存信息,然后通过分析这些信息来获取Profiler数据。因为不需要打包Addressable资源包,所以也无需执行Build操作。因此,这种模式既快又能够获取丰富的Profiler信息,是一个很好的开发调试方式。

3. Use Exising Build(requires built groups)

在这种模式下,仍然需要执行Build操作,将资源打包为Addressable资源包。在运行时,Addressables系统会根据Load Path去加载实际的AssetBundle文件并读取资源。与前面两种模式不同的是,这个模式需要打包资源,所以需要先执行Build操作。如果不先Build,运行时会无法加载资源,导致程序报错。因此,这种模式适用于项目发布或上线前的阶段,以确保资源能够被正确加载。

九、查看引用分析面板

1.点击菜单 Project > AddressableAssetsData > AddressableAssetSettings
在这里插入图片描述

2.在 Inspector 窗口中找到 Send Profiler Events 并勾选(不同版本位置不一样)
在这里插入图片描述

3.然后点击 Windows > Asset Management > Addressables > Event Viewer
在这里插入图片描述

4.打开 **Addressables Event Viewer**窗口,即可看到资源使用情况,引用次数等信息。

在分析器中可以看到我们实例化出来的预设所依赖的资源,还可以看到引用计数等信息,虽然我们没有打出AssetBundle包,
但却模拟了类似从AssetBundle包中加载资源的效果,这样可以方便我们快速分析加载策略,
在这里插入图片描述

十、Hosting Service 本地服务器

这个功能可用于在本地环境模拟加载远端服务器资源(win11系统的慎用,不稳定)
点击菜单 Window / Asset Management / Addressables / Hosting ,接着点击 Create / Local Hosting,创建一个本地Web服务器,
在这里插入图片描述

然后勾选 Enable
在这里插入图片描述

这样我们就开启了一个本地的服务器了,IP地址是我本机的局域网IP,我可以通过localhost进行访问,注意这里的端口号是55716。
我们可以看到,它对我们上文中提到的两个文件夹目录进行了 Hosting
在这里插入图片描述

十一、查看重复资源

1.使用此功能查看重复引用的资源,在AddressablesGroup中选择 Tools > Window > Analyze 打开 **Addressables Analyze**窗口

2.如下图操作
在这里插入图片描述

3.经过一段时间的等待,即可查看在不同包间重复引用的资源,从而方便我们调整分配打包

十一、WebGL平台问题

1.外部包用时编辑器无法正确读取webgl资源
2.将资源组下 Use Asset Bundle Cache 勾选去掉
在这里插入图片描述

3.在编辑器下还是会看不到,发布出webGl就好了。

十二、Unity版本选择

1.用官方推荐的几个版本不然容易出些奇怪的问题

十三、资源释放

1.下面是资源加载后对应的释放方式 Addressables.LoadAssetAsync 加载的,配套用 Addressables.Release 进行卸载
例子:
//获取资源与实例化

Addressables.LoadAssetAsync<GameObject>("ModelHero0").Completed += (res) =>{
    ThisObj = res.Result;
    GameObject sphereObj = Instantiate(ThisObj);
};
//销毁和释放资源
GameObject.Destroy(ThisObj);
Addressables.Release(ThisObj);

下面以以看到加载时开时有引用计数,销毁会清除
在这里插入图片描述

2.场景场景加载使用 Addressables.LoadSceneAsync 卸载使用 Addressables.UnloadSceneAsync

3.使用 Addressables.InstantiateAsync 实例化的可以使用,配套的 Addressables.ReleaseInstance 可直接卸载并清除引用
举例:

//加载并实例化
Addressables.InstantiateAsync("ModelHero0").Completed += (obj) =>
 { 
 	ThisObj = obj.Result; 
 };
//卸载并清除引用
Addressables.ReleaseInstance(ThisObj);
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值