第1章 Addressables概述与环境搭建

第1章 Addressables概述与环境搭建

什么是Addressables系统

Unity Addressables系统是Unity提供的一种高级资源管理解决方案,它允许开发者以地址(Address)的方式引用和加载资源,而不是直接引用资源对象。Addressables系统建立在AssetBundle之上,提供了更高级别的抽象和更灵活的资源管理方式。

Addressables系统的核心思想是将资源与其位置解耦,开发者可以通过一个地址字符串来获取资源,而不需要关心资源具体存储在本地还是远程服务器上。这种设计使得资源管理更加灵活,支持本地资源、远程资源、打包资源和非打包资源的统一管理。

Addressables系统的主要特点包括:

  • 统一的资源加载API
  • 支持本地和远程资源
  • 自动处理依赖关系
  • 内置缓存管理
  • 支持内容更新
  • 灵活的分组策略

为什么需要Addressables(vs传统Resources/AssetBundle)

传统Resources系统的局限性

传统的Resources文件夹方式虽然简单易用,但存在以下严重问题:

  1. 打包体积过大:所有Resources文件夹中的资源都会被打包到APK/IPA中,无法实现按需加载
  2. 内存占用高:资源无法在运行时卸载,导致内存持续占用
  3. 更新困难:资源更新需要重新发布整个应用
  4. 缺乏灵活性:无法区分本地和远程资源
  5. 无依赖管理:需要手动处理资源依赖关系

AssetBundle的复杂性

AssetBundle虽然解决了Resources系统的部分问题,但带来了新的复杂性:

  1. 手动管理复杂:需要手动处理打包、依赖、加载、卸载等流程
  2. 版本管理困难:需要自己实现版本控制和更新机制
  3. 错误处理繁琐:需要处理各种加载失败的情况
  4. 缓存管理复杂:需要手动管理AssetBundle缓存

Addressables的优势

Addressables系统结合了Resources的易用性和AssetBundle的灵活性:

  1. 简化API:统一的加载和卸载API
  2. 自动依赖管理:系统自动处理资源依赖关系
  3. 灵活的分组策略:可以按需分组资源
  4. 内置更新机制:支持内容更新和差量更新
  5. 统一本地远程:本地和远程资源使用相同API
  6. 完善的缓存系统:自动管理内存和磁盘缓存

核心概念预览:地址、组、构建、加载

地址(Address)

地址是Addressables系统的核心概念之一,它是资源的唯一标识符。地址可以是:

  • 字符串形式的唯一标识
  • 资源路径
  • 自定义命名

地址与资源位置解耦,同一个资源可以有多个地址,同一地址也可以指向不同位置的资源。

组(Group)

组是资源的逻辑集合,用于组织和管理资源。通过分组可以:

  • 控制资源的打包策略
  • 统一管理资源的构建路径
  • 实现资源的分类管理

构建(Build)

构建是将标记为Addressable的资源打包成AssetBundle的过程。构建过程会:

  • 分析资源依赖关系
  • 按组打包资源
  • 生成内容目录(Catalog)
  • 创建加载路径

加载(Load)

加载是从本地或远程获取资源的过程。Addressables提供统一的加载API,支持:

  • 同步和异步加载
  • 多种资源类型加载
  • 自动依赖处理

安装Addressables包

通过Package Manager安装

  1. 打开Unity编辑器
  2. 选择Window > Package Manager
  3. 在Package Manager窗口中,选择Unity Registry
  4. 搜索”Addressables”
  5. 找到”Addressable Asset System”包
  6. 点击Install按钮安装

通过manifest.json安装

如果需要在项目中明确指定版本,可以在Packages/manifest.json文件中添加:

1
2
3
4
5
6
{
"dependencies": {
"com.unity.addressables": "1.21.10",
// 其他依赖...
}
}

项目初始化配置

初始化Addressables系统

安装完成后,需要初始化Addressables系统:

  1. 选择菜单Window > Asset Management > Addressables > Groups
  2. 如果是首次使用,系统会提示初始化Addressables
  3. 点击”Yes”确认初始化

初始化过程会:

  • 创建AddressableAssetSettings配置文件
  • 设置默认的组配置
  • 创建必要的配置文件夹

AddressableAssetSettings配置

AddressableAssetSettings.asset文件包含系统的主要配置:

  1. Build Path:构建后AssetBundle的输出路径
  2. Load Path:运行时加载AssetBundle的路径
  3. Profile:不同平台的配置文件
  4. Catalog:内容目录配置
  5. Build:构建相关设置

第一个Addressables资源的创建与加载

标记资源为Addressable

  1. 在Project窗口中选择一个资源(如一个Prefab或Texture)
  2. 在Inspector窗口中找到Addressable Asset组件
  3. 勾选”Addressable”复选框
  4. 设置资源的Address(默认使用文件路径)

创建简单的加载脚本

创建一个简单的脚本用于加载Addressable资源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class SimpleAssetLoader : MonoBehaviour
{
public string assetAddress = "Assets/Prefabs/MyPrefab.prefab";

private GameObject loadedObject;

void Start()
{
LoadAsset();
}

void LoadAsset()
{
// 异步加载资源
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(assetAddress);

handle.Completed += (operation) =>
{
if (operation.Status == AsyncOperationStatus.Succeeded)
{
// 实例化加载的资源
loadedObject = Instantiate(operation.Result);
Debug.Log("资源加载成功: " + assetAddress);
}
else
{
Debug.LogError("资源加载失败: " + operation.OperationException);
}

// 释放操作句柄
Addressables.Release(handle);
};
}

void OnDestroy()
{
// 释放加载的资源
if (loadedObject != null)
{
Destroy(loadedObject);
}

// 释放Addressables引用
Addressables.ReleaseInstance(loadedObject);
}
}

运行测试

  1. 将上述脚本挂载到场景中的一个GameObject上
  2. 设置assetAddress为实际的资源地址
  3. 运行场景,观察资源是否成功加载

关键要点

  • 资源加载完成后需要正确释放
  • 使用异步加载避免阻塞主线程
  • 正确处理加载失败的情况
  • 记住在适当时机释放资源引用

通过本章的学习,您已经了解了Addressables系统的基本概念和如何创建第一个Addressables资源。下一章我们将深入学习资源的标记和管理方法。