本文档详细介绍了如何使用 YooAsset 插件在 Unity 项目中实现高效、稳定的资源热更新。
# 一、 安装与基础配置
## 1. 安装插件
打开 Edit -> Project Settings -> Package Manager,在 Scoped Registries 中添加 OpenUPM 仓库:
Name: package.openupm.com URL: https://package.openupm.com Scope(s): com.tuyoogame.yooasset
然后在 Window -> Package Manager 中切换到 My Registries,点击 Install。
## 2. 全局配置
创建配置文件:在 Project 视图内右键 Create -> YooAsset -> Create Setting。
存放路径:必须放在 Resources 文件夹下。
关键参数:Default Yoo Folder Name 决定了沙盒目录(手机存储)和内置目录的根文件夹名称。
# 二、 资源工作流配置
## 1. 资源收集 (Asset Collector)
决定哪些资源需要参与热更新。
- 打开 Window -> YooAsset -> Asset Collector。
- Create Package: 通常命名为 DefaultPackage。
- Create Group: 按功能分组(如 BaseRes, UI, Hero)。
- Collector:
- Static: 收集该文件夹下所有资源(包含子目录)。
- Addressable: 建议开启,可以使用简化路径(如 "HeroPrefab")加载。
## 2. 资源构建 (AssetBundle Builder)
1. 打开 Window -> YooAsset -> Asset Bundle Builder。
2. Build Output: 选择导出路径。
3. Build Version: 本次打包的版本号。
4. Build Mode:
- Force Rebuild: 强制全量重新构建。
- Incremental Build: 增量构建(推荐,速度快)。
5. 点击 Build 按钮生成 Bundle 文件和清单文件。
## 3. 资源部署
构建完成后,将 Build Output 路径下对应版本号的文件夹(包含 .bundle 和 .hash 文件)上传至你的 CDN 服务器。
部署路径示例:http://cdn.yourdomain.com/cdn/Android/1.0.0/
# 三、 YooAsset 运行时实现
## 1. 初始化 (Initialize)
根据运行模式(编辑器模式、单机模式、联机模式)初始化 Package。
IEnumerator Start()
{
// 1. 初始化
YooAssets.Initialize();
var package = YooAssets.CreatePackage("DefaultPackage");
YooAssets.SetDefaultPackage(package);
// 2. 联机模式初始化
var initParameters = new HostPlayModeParameters();
initParameters.BuildinQueryServices = new GameQueryServices(); // 内部查询类
initParameters.RemoteServices = new RemoteServices(); // 远程服务器地址
var initOperation = package.InitializeAsync(initParameters);
yield return initOperation;
if(initOperation.Status == EOperationStatus.Succeed)
Debug.Log("初始化成功!");
}
## 2. 资源更新 (Resource Update)
热更新通常遵循:获取版本号 -> 更新清单 -> 下载补丁 的步骤。
IEnumerator UpdateRes()
{
var package = YooAssets.GetAssetsPackage("DefaultPackage");
// A. 获取最新的版本号
var versionOp = package.UpdatePackageVersionAsync();
yield return versionOp;
string packageVersion = versionOp.PackageVersion;
// B. 更新资源清单
var manifestOp = package.UpdatePackageManifestAsync(packageVersion);
yield return manifestOp;
// C. 创建下载器并开始下载
int downloadingMaxNumber = 10;
int failedTryCount = 3;
var downloader = package.CreateResourceDownloader(downloadingMaxNumber, failedTryCount);
if (downloader.TotalDownloadCount == 0) {
Debug.Log("没有需要下载的资源");
} else {
downloader.BeginDownload();
yield return downloader;
if (downloader.Status == EOperationStatus.Succeed)
Debug.Log("更新完成!");
}
}
## 3. 资源加载与卸载
YooAsset 使用引用计数管理资源,必须配对使用。
// 加载资源
AssetHandle handle = package.LoadAssetAsync<GameObject>("HeroPrefab");
yield return handle;
GameObject go = handle.InstantiateSync();
// 卸载资源
handle.Release(); // 释放句柄,引用计数减1
package.UnloadUnusedAssets(); // 销毁不再使用的 AssetBundle
# 四、 常见问题与优化
- 增量更新:YooAsset 自动对比文件哈希值,只会下载有变动的文件。
- 断点续传:下载器 ResourceDownloader 原生支持断点续传。
- 内嵌资源:发布包时,记得将初始版本的资源放入 StreamingAssets 文件夹,减小首次进入游戏的下载量。