学习 Unity Addressables
Addressables 对比 AssetBundle 有什么优势
| AssetBundle 缺点 |
|---|
| 资源打包的冗余问题 |
| 资源打包的方式不直观 |
| 中间有很多细节(比如资源进首包,需要将ab包放到StreamingAssets目录下,再移除以避免Unity重新加载) |
| 资源依赖的问题 |
| 资源热更新方案(增量更新、文件对比、资源下载状态……) |
| 同步与异步资源加载 |
| 内存~Profiler |
| 等其他问题 |
| Addressables 优点 |
|---|
| 提供GUI的方式对资源打包进行管理,不需要频繁修改打包代码,对资源管理更加便捷 |
| 提供了加载实体AB包的开发模式,能够模拟真机的资源加载方式 |
| 资源依赖处理(打包、加载) |
| 傻瓜式的资源查询、更新方式(优劣参半),随用随下 |
| 打包检测工具 |
目前 Addressables 是 Unity 官方主推的资源热更新的方案。
Addressables 的工作步骤
1 创建资源组
2 将资源添加进资源组
3 打包资源
4 加载资源
安装 Addressables
打开 Asset Package Manager
切换为 Unity Register
在左侧的列表找到 Addressables 点击安装按钮
如何使用 Addressables
创建打包资源
我们分别创建 Local和Remote分别代表从本地和远程加载的资源目录,他们存放的资源如下。
Local文件夹存放一个 Cube 的预制体,使用一个红色的材质。Remote文件夹存放一个 Sphere 的预制体,使用一个绿色的材质。
打包 Addressables 资源
打开 Addressables 资源组
点击创建 Addressables Group Setting
修改默认的分组名称为 Local,并将 Assets/Local/Cube的预制体拖入进去。
再新建一个 Remote 分组将 Assets/Remote/Sphere的预制体拖入进去
进行打包资源
会打包当前的平台的资源
使用 Addressables
本地打的包存储在 [项目路径]/Library/com.unity.addressables/aa/OSX/StandaloneOSX下面(macOS 平台)
本地加载
创建一个脚本 LoadAddressables.cs 用来加载我们打包出来的 Addressables
// 用来加载 Addressables 资源包
public class LoadAddressables : MonoBehaviour
{
}
1 引入 [UnityEngine.AddressableAssets] 命名空间
using UnityEngine.AddressableAssets;
通过 AssetRef 进行使用资源
// 通过引用打包的资源
public AssetReference localPrefab;
private void Awake()
{
// 异步初始化资源
Addressables.InstantiateAsync(localPrefab);
}
使用资源的名称加载资源(热更新)
// 直接通过资源的名称加载资源
Addressables.InstantiateAsync("Assets/Local/Cube.prefab");
远程加载
远程打的包存放在 [项目目录]/ServerData/StandaloneOSX (macOS 平台)
将 Remote 文件夹的打包方式修改为远程方式
我们重新进行打包,切换 Play Mode Script 模式为远程加载。
修改加载为需要加载的远程资源的名称
Addressables.InstantiateAsync("Assets/Remote/Sphere.prefab");
搭建静态文件服务(caddy)
在当前项目目录创建文件 Caddyfile
# Caddyfile
:1010 {
root ServerData/StandaloneOSX
file_server browse
}
运行 Caddy run 启动服务
设置 Addressables 的监听端口为 1010
此时我们 Remote 的远程配置已经发生了变更
更新 Addressables
修改 Addressables 配置
我们需要重新打一次包,是因为刚才没有选择这个,后面打更新包会报错
修改 Green 的物料颜色为蓝色,重新进行打包。
选择我们本地生成 .bin文件
再次运行就变成蓝色小球了