feat: add EnsureBundleFileAsync operation

This commit is contained in:
何冠峰
2026-05-15 10:56:24 +08:00
parent 322c4a9847
commit 45ecd8baff
74 changed files with 1000 additions and 374 deletions

View File

@@ -14,7 +14,7 @@ using YooAsset;
/// 1. 异步加载 Bundle 文件,验证加载成功
/// 2. 释放 BundleFileHandle 引用,等待一帧
/// 3. 调用 UnloadUnusedAssetsAsync 清理未使用资源
/// 4. 再次加载同一 Bundle 文件,验证加载成功且文件路径有效
/// 4. 再次加载同一 Bundle 文件,验证加载成功
/// </remarks>
public class TestBundleFileRelease
{
@@ -39,7 +39,6 @@ public class TestBundleFileRelease
var reloadHandle = package.LoadBundleFileAsync("raw_file_e");
yield return reloadHandle;
Assert.AreEqual(EOperationStatus.Succeeded, reloadHandle.Status);
Assert.IsTrue(File.Exists(reloadHandle.GetBundleFilePath()));
reloadHandle.Release();
}
}

View File

@@ -0,0 +1,75 @@
using System.IO;
using System.Collections;
using UnityEngine.TestTools;
using NUnit.Framework;
using YooAsset;
/// <summary>
/// 测试确保资源包已就绪
/// </summary>
/// <remarks>
/// 覆盖 API: EnsureBundleFileAsync
/// 测试内容:
/// 1. RawBundle 包裹异步确保资源包已就绪验证文件路径有效raw_file_a
/// 2. AssetBundle 包裹异步确保资源包已就绪验证文件路径有效prefab_a
/// 3. ArchiveBundle 包裹异步确保资源包已就绪验证文件路径有效archive_file_a
/// </remarks>
public class TestEnsureBundleFile
{
public IEnumerator RuntimeTester_RawBundle()
{
ResourcePackage package = YooAssets.GetPackage(TestConsts.RawBundlePackageName);
Assert.IsNotNull(package);
{
var ensureOp = package.EnsureBundleFileAsync(new EnsureBundleFileOptions("raw_file_a"));
yield return ensureOp;
Assert.AreEqual(EOperationStatus.Succeeded, ensureOp.Status);
var detail = ensureOp.Detail;
Assert.IsNotNull(detail.BundleFilePath);
Assert.IsNotEmpty(detail.BundleFilePath);
Assert.IsTrue(File.Exists(detail.BundleFilePath), $"Bundle file does not exist: {detail.BundleFilePath}");
Assert.IsNotNull(detail.BundleName);
Assert.IsNotEmpty(detail.BundleName);
}
}
public IEnumerator RuntimeTester_AssetBundle()
{
ResourcePackage package = YooAssets.GetPackage(TestConsts.AssetBundlePackageName);
Assert.IsNotNull(package);
{
var ensureOp = package.EnsureBundleFileAsync(new EnsureBundleFileOptions("prefab_a"));
yield return ensureOp;
Assert.AreEqual(EOperationStatus.Succeeded, ensureOp.Status);
var detail = ensureOp.Detail;
Assert.IsNotNull(detail.BundleFilePath);
Assert.IsNotEmpty(detail.BundleFilePath);
Assert.IsTrue(File.Exists(detail.BundleFilePath), $"Bundle file does not exist: {detail.BundleFilePath}");
Assert.IsNotNull(detail.BundleName);
Assert.IsNotEmpty(detail.BundleName);
}
}
public IEnumerator RuntimeTester_ArchiveBundle()
{
ResourcePackage package = YooAssets.GetPackage(TestConsts.ArchiveBundlePackageName);
Assert.IsNotNull(package);
{
var ensureOp = package.EnsureBundleFileAsync(new EnsureBundleFileOptions("archive_file_a"));
yield return ensureOp;
Assert.AreEqual(EOperationStatus.Succeeded, ensureOp.Status);
var detail = ensureOp.Detail;
Assert.IsNotNull(detail.BundleFilePath);
Assert.IsNotEmpty(detail.BundleFilePath);
Assert.IsTrue(File.Exists(detail.BundleFilePath), $"Bundle file does not exist: {detail.BundleFilePath}");
Assert.IsNotNull(detail.BundleName);
Assert.IsNotEmpty(detail.BundleName);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7c4cd191337037a4da1cc228d1d871fc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -10,10 +10,10 @@ using YooAsset;
/// <remarks>
/// 覆盖 API: LoadAssetAsync(RawFileObject) / LoadAssetSync(RawFileObject) / UnloadUnusedAssetsAsync
/// 测试内容:
/// 1. 异步加载归档子文件,验证 GetBytes() 和 GetText() 均返回有效数据(raw_file_a
/// 2. 同步加载归档子文件,验证 GetBytes() 和 GetText() 均返回有效数据(raw_file_b
/// 3. 重复加载同一归档子文件,验证缓存命中不会失败(raw_file_c
/// 4. 释放句柄并卸载后重新加载,验证卸载保护和重载链路正常(raw_file_e
/// 1. 异步加载归档子文件,验证 GetBytes() 和 GetText() 均返回有效数据(archive_file_a
/// 2. 同步加载归档子文件,验证 GetBytes() 和 GetText() 均返回有效数据(archive_file_b
/// 3. 重复加载同一归档子文件,验证缓存命中不会失败(archive_file_c
/// 4. 释放句柄并卸载后重新加载,验证卸载保护和重载链路正常(archive_file_e
/// </remarks>
public class TestLoadArchiveBundle
{
@@ -24,7 +24,7 @@ public class TestLoadArchiveBundle
// 异步加载归档子文件
{
var assetHandle = package.LoadAssetAsync<RawFileObject>("raw_file_a");
var assetHandle = package.LoadAssetAsync<RawFileObject>("archive_file_a");
yield return assetHandle;
Assert.AreEqual(EOperationStatus.Succeeded, assetHandle.Status);
@@ -43,7 +43,7 @@ public class TestLoadArchiveBundle
// 同步加载归档子文件
{
var assetHandle = package.LoadAssetSync<RawFileObject>("raw_file_b");
var assetHandle = package.LoadAssetSync<RawFileObject>("archive_file_b");
Assert.AreEqual(EOperationStatus.Succeeded, assetHandle.Status);
var rawFileObject = assetHandle.GetAssetObject<RawFileObject>();
@@ -61,11 +61,11 @@ public class TestLoadArchiveBundle
// 重复加载同一归档子文件,验证缓存命中
{
var handle1 = package.LoadAssetAsync<RawFileObject>("raw_file_c");
var handle1 = package.LoadAssetAsync<RawFileObject>("archive_file_c");
yield return handle1;
Assert.AreEqual(EOperationStatus.Succeeded, handle1.Status);
var handle2 = package.LoadAssetAsync<RawFileObject>("raw_file_c");
var handle2 = package.LoadAssetAsync<RawFileObject>("archive_file_c");
yield return handle2;
Assert.AreEqual(EOperationStatus.Succeeded, handle2.Status);
@@ -80,7 +80,7 @@ public class TestLoadArchiveBundle
// 释放后卸载再重新加载,验证新旧对象不是同一实例
{
var assetHandle = package.LoadAssetAsync<RawFileObject>("raw_file_e");
var assetHandle = package.LoadAssetAsync<RawFileObject>("archive_file_e");
yield return assetHandle;
Assert.AreEqual(EOperationStatus.Succeeded, assetHandle.Status);
@@ -93,7 +93,7 @@ public class TestLoadArchiveBundle
yield return unloadOp;
Assert.AreEqual(EOperationStatus.Succeeded, unloadOp.Status);
var reloadHandle = package.LoadAssetAsync<RawFileObject>("raw_file_e");
var reloadHandle = package.LoadAssetAsync<RawFileObject>("archive_file_e");
yield return reloadHandle;
Assert.AreEqual(EOperationStatus.Succeeded, reloadHandle.Status);

View File

@@ -12,8 +12,8 @@ using YooAsset;
/// <remarks>
/// 覆盖 API: LoadBundleFileAsync / LoadBundleFileSync / LoadAssetAsync(RawFileObject) / LoadAssetSync(RawFileObject)
/// 测试内容:
/// 1. 异步加载 Bundle 文件,获取文件路径,验证文件存在且二进制数据非空raw_file_a
/// 2. 同步加载 Bundle 文件,获取文件路径,验证文件存在且二进制数据非空raw_file_b
/// 1. 异步加载 Bundle 文件raw_file_a
/// 2. 同步加载 Bundle 文件raw_file_b
/// 3. 异步通过 RawFileObject 加载,验证 GetBytes() 和 GetText() 均返回有效数据raw_file_c
/// 4. 同步通过 RawFileObject 加载,验证 GetBytes() 和 GetText() 均返回有效数据raw_file_d
/// </remarks>
@@ -29,14 +29,6 @@ public class TestLoadBundleFile
var bundleFileHandle = package.LoadBundleFileAsync("raw_file_a");
yield return bundleFileHandle;
Assert.AreEqual(EOperationStatus.Succeeded, bundleFileHandle.Status);
var filePath = bundleFileHandle.GetBundleFilePath();
Assert.IsNotNull(filePath);
Assert.IsTrue(File.Exists(filePath));
byte[] fileBytes = File.ReadAllBytes(filePath);
Assert.IsNotNull(fileBytes);
Assert.Greater(fileBytes.Length, 0);
bundleFileHandle.Release();
}
@@ -44,14 +36,6 @@ public class TestLoadBundleFile
{
var bundleFileHandle = package.LoadBundleFileSync("raw_file_b");
Assert.AreEqual(EOperationStatus.Succeeded, bundleFileHandle.Status);
var filePath = bundleFileHandle.GetBundleFilePath();
Assert.IsNotNull(filePath);
Assert.IsTrue(File.Exists(filePath));
byte[] fileBytes = File.ReadAllBytes(filePath);
Assert.IsNotNull(fileBytes);
Assert.Greater(fileBytes.Length, 0);
bundleFileHandle.Release();
}

View File

@@ -247,7 +247,7 @@ public class T0_InitYooAssets : IPrebuildSetup, IPostBuildCleanup
{
var collector1 = new YooAsset.Editor.BundleCollector();
collector1.CollectPath = "";
collector1.CollectorGUID = "fddaaf9430e24344196cc82ac3d006b4"; //TestRes/RawFiles目录
collector1.CollectorGUID = "c0444018376a7cd4ead6a671035617d6"; //TestRes/ArchiveFiles目录
collector1.CollectorType = YooAsset.Editor.ECollectorType.MainAssetCollector;
collector1.PackRuleName = nameof(YooAsset.Editor.PackCollector);
YooAsset.Editor.BundleCollectorSettingData.CreateCollector(archiveFileGroup, collector1);

View File

@@ -255,7 +255,28 @@ public class T1_TestEditorFileSystem : IPrebuildSetup, IPostBuildCleanup
}
[UnityTest]
public IEnumerator B12_TestUniTask()
public IEnumerator B12_TestEnsureBundleFile_RawBundle()
{
var tester = new TestEnsureBundleFile();
yield return tester.RuntimeTester_RawBundle();
}
[UnityTest]
public IEnumerator B13_TestEnsureBundleFile_AssetBundle()
{
var tester = new TestEnsureBundleFile();
yield return tester.RuntimeTester_AssetBundle();
}
[UnityTest]
public IEnumerator B14_TestEnsureBundleFile_ArchiveBundle()
{
var tester = new TestEnsureBundleFile();
yield return tester.RuntimeTester_ArchiveBundle();
}
[UnityTest]
public IEnumerator B15_TestUniTask()
{
var tester = new TestUniTask();
yield return tester.RuntimeTester();

View File

@@ -255,7 +255,28 @@ public class T2_TestBuiltinFileSystem : IPrebuildSetup, IPostBuildCleanup
}
[UnityTest]
public IEnumerator B12_TestUniTask()
public IEnumerator B12_TestEnsureBundleFile_RawBundle()
{
var tester = new TestEnsureBundleFile();
yield return tester.RuntimeTester_RawBundle();
}
[UnityTest]
public IEnumerator B13_TestEnsureBundleFile_AssetBundle()
{
var tester = new TestEnsureBundleFile();
yield return tester.RuntimeTester_AssetBundle();
}
[UnityTest]
public IEnumerator B14_TestEnsureBundleFile_ArchiveBundle()
{
var tester = new TestEnsureBundleFile();
yield return tester.RuntimeTester_ArchiveBundle();
}
[UnityTest]
public IEnumerator B15_TestUniTask()
{
var tester = new TestUniTask();
yield return tester.RuntimeTester();

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c0444018376a7cd4ead6a671035617d6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
this is archive file a !

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a84d58cf1f5f6d24aa165fe859227a5a
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
this is archive file b !

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cbf8014e6b7abb942a31ff5b316c5344
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
this is archive file c !

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ed5f41165a49cbe469594ab8f558bcfa
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
this is archive file d !

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9a66a58916a41684cb44606d5479caf1
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
this is archive file e !

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0c597b9bdd6ddd84eabd8fd3538947e9
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: