【m】框架大更新

This commit is contained in:
2025-10-31 11:18:23 +08:00
parent ae6e7c804b
commit 8e1d52ddbf
1883 changed files with 213934 additions and 640 deletions
@@ -0,0 +1,231 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
using UnityEngine.TestTools;
using NUnit.Framework;
using YooAsset;
public class T2_TestBuldinFileSystem : IPrebuildSetup, IPostBuildCleanup
{
public const string ASSET_BUNDLE_PACKAGE_ROOT_KEY = "T2_ASSET_BUNDLE_PACKAGE_ROOT_KEY";
public const string RAW_BUNDLE_PACKAGE_ROOT_KEY = "T2_RAW_BUNDLE_PACKAGE_ROOT_KEY";
void IPrebuildSetup.Setup()
{
#if UNITY_EDITOR
// 构建AssetBundlePackage
{
var buildParams = new PackageInvokeBuildParam(TestDefine.AssetBundlePackageName);
buildParams.BuildPipelineName = "ScriptableBuildPipeline";
buildParams.InvokeAssmeblyName = "YooAsset.Test.Editor";
buildParams.InvokeClassFullName = "TestPackageBuilder";
buildParams.InvokeMethodName = "BuildPackage";
var simulateResult = PackageInvokeBuilder.InvokeBuilder(buildParams);
UnityEditor.EditorPrefs.SetString(ASSET_BUNDLE_PACKAGE_ROOT_KEY, simulateResult.PackageRootDirectory);
}
// 构建RawBundlePackage
{
var buildParams = new PackageInvokeBuildParam(TestDefine.RawBundlePackageName);
buildParams.BuildPipelineName = "RawFileBuildPipeline";
buildParams.InvokeAssmeblyName = "YooAsset.Test.Editor";
buildParams.InvokeClassFullName = "TestPackageBuilder";
buildParams.InvokeMethodName = "BuildPackage";
var simulateResult = PackageInvokeBuilder.InvokeBuilder(buildParams);
UnityEditor.EditorPrefs.SetString(RAW_BUNDLE_PACKAGE_ROOT_KEY, simulateResult.PackageRootDirectory);
}
#endif
}
void IPostBuildCleanup.Cleanup()
{
}
[UnityTest]
public IEnumerator A_InitializePackage()
{
// 初始化资源包 ASSET_BUNDLE
{
string packageRoot = string.Empty;
#if UNITY_EDITOR
packageRoot = UnityEditor.EditorPrefs.GetString(ASSET_BUNDLE_PACKAGE_ROOT_KEY);
#endif
if (Directory.Exists(packageRoot) == false)
throw new Exception($"Not found package root : {packageRoot}");
var package = YooAssets.CreatePackage(TestDefine.AssetBundlePackageName);
// 初始化资源包
var initParams = new OfflinePlayModeParameters();
var fileDecryption = new TestFileStreamDecryption();
var manifestServices = new TestRestoreManifest();
initParams.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(fileDecryption, packageRoot);
initParams.BuildinFileSystemParameters.AddParameter(FileSystemParametersDefine.DISABLE_CATALOG_FILE, true);
initParams.BuildinFileSystemParameters.AddParameter(FileSystemParametersDefine.MANIFEST_SERVICES, manifestServices);
var initializeOp = package.InitializeAsync(initParams);
yield return initializeOp;
if (initializeOp.Status != EOperationStatus.Succeed)
Debug.LogError(initializeOp.Error);
Assert.AreEqual(EOperationStatus.Succeed, initializeOp.Status);
// 请求资源版本
var requetVersionOp = package.RequestPackageVersionAsync();
yield return requetVersionOp;
if (requetVersionOp.Status != EOperationStatus.Succeed)
Debug.LogError(requetVersionOp.Error);
Assert.AreEqual(EOperationStatus.Succeed, requetVersionOp.Status);
// 更新资源清单
var updateManifestOp = package.UpdatePackageManifestAsync(requetVersionOp.PackageVersion);
yield return updateManifestOp;
if (updateManifestOp.Status != EOperationStatus.Succeed)
Debug.LogError(updateManifestOp.Error);
Assert.AreEqual(EOperationStatus.Succeed, updateManifestOp.Status);
}
// 初始化资源包 RAW_BUNDLE
{
string packageRoot = string.Empty;
#if UNITY_EDITOR
packageRoot = UnityEditor.EditorPrefs.GetString(RAW_BUNDLE_PACKAGE_ROOT_KEY);
#endif
if (Directory.Exists(packageRoot) == false)
throw new Exception($"Not found package root : {packageRoot}");
var package = YooAssets.CreatePackage(TestDefine.RawBundlePackageName);
// 初始化资源包
var initParams = new OfflinePlayModeParameters();
initParams.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(null, packageRoot);
initParams.BuildinFileSystemParameters.AddParameter(FileSystemParametersDefine.APPEND_FILE_EXTENSION, true);
initParams.BuildinFileSystemParameters.AddParameter(FileSystemParametersDefine.DISABLE_CATALOG_FILE, true);
var initializeOp = package.InitializeAsync(initParams);
yield return initializeOp;
if (initializeOp.Status != EOperationStatus.Succeed)
Debug.LogError(initializeOp.Error);
Assert.AreEqual(EOperationStatus.Succeed, initializeOp.Status);
// 请求资源版本
var requetVersionOp = package.RequestPackageVersionAsync();
yield return requetVersionOp;
if (requetVersionOp.Status != EOperationStatus.Succeed)
Debug.LogError(requetVersionOp.Error);
Assert.AreEqual(EOperationStatus.Succeed, requetVersionOp.Status);
// 更新资源清单
var updateManifestOp = package.UpdatePackageManifestAsync(requetVersionOp.PackageVersion);
yield return updateManifestOp;
if (updateManifestOp.Status != EOperationStatus.Succeed)
Debug.LogError(updateManifestOp.Error);
Assert.AreEqual(EOperationStatus.Succeed, updateManifestOp.Status);
}
}
[UnityTest]
public IEnumerator B1_TestAsyncTask()
{
var tester = new TestAsyncTask();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B2_TestLoadAsset()
{
var tester = new TestLoadAsset();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B3_TestLoadSubAssets()
{
var tester = new TestLoadSubAssets();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B4_TestLoadAllAssets()
{
var tester = new TestLoadAllAssets();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B5_TestLoadSpriteAtlas()
{
var tester = new TestLoadSpriteAtlas();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B6_TestLoadScriptableObject()
{
var tester = new TestLoadScriptableObject();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B7_TestLoadScene()
{
var tester = new TestLoadScene();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B8_TestLoadRawFile()
{
var tester = new TestLoadRawFile();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator B9_TestLoadVideo()
{
var tester = new TestLoadVideo();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator C1_TestGetAssetInfos()
{
var tester = new TestGetAssetInfos();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator C2_TestBundleEncryption()
{
var tester = new TestBundleEncryption();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator C3_TestBundleUnpacker()
{
var tester = new TestBundleUnpacker();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator C4_TestBundleReference()
{
var tester = new TestBundleReference();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator C4_TestBundleUnload()
{
var tester = new TestBundleUnload();
yield return tester.RuntimeTester();
}
[UnityTest]
public IEnumerator D_DestroyPackage()
{
var tester = new TestDestroyPackage();
yield return tester.RuntimeTester(true);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bcc55b0010a446748977341328325575
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,76 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using UnityEngine;
using NUnit.Framework;
using YooAsset;
/// <summary>
/// 测试加载加密文件
/// </summary>
public class TestBundleEncryption
{
public IEnumerator RuntimeTester()
{
ResourcePackage package = YooAssets.GetPackage(TestDefine.AssetBundlePackageName);
Assert.IsNotNull(package);
// 异步加载加密的预制体
// 说明:测试内置文件解压
{
var assetHandle = package.LoadAssetAsync<GameObject>("prefab_encryptA");
yield return assetHandle;
Assert.AreEqual(EOperationStatus.Succeed, assetHandle.Status);
var go = assetHandle.InstantiateSync(Vector3.zero, Quaternion.identity);
Assert.IsNotNull(go);
}
// 同步加载加密的预制体
// 说明:测试内置文件解压
{
var assetHandle = package.LoadAssetSync<GameObject>("prefab_encryptB");
Assert.AreEqual(EOperationStatus.Succeed, assetHandle.Status);
var go = assetHandle.InstantiateSync(Vector3.zero, Quaternion.identity);
Assert.IsNotNull(go);
}
}
}
/* 资源代码流程
* 内置文件解压(加载器触发)
BuildinFileSystem::LoadBundleFile()
{
if (IsUnpackBundleFile(bundle))
{
_unpackFileSystem.LoadBundleFile(bundle);
}
}
UnpackFileSystem::LoadBundleFile()
{
var operation = new DCFSLoadAssetBundleOperation(this, bundle);
return operation;
}
DCFSLoadAssetBundleOperation::InternalUpdate()
{
if (_steps == ESteps.DownloadFile)
{
DownloadFileOptions options = new DownloadFileOptions(int.MaxValue);
_unpackFileSystem.DownloadFileAsync(_bundle, options);
}
}
UnpackFileSystem::DownloadFileAsync()
{
if (string.IsNullOrEmpty(options.ImportFilePath))
{
//RemoteServices返回内置文件路径
string mainURL = RemoteServices.GetRemoteMainURL(bundle.FileName);
string fallbackURL = RemoteServices.GetRemoteFallbackURL(bundle.FileName);
options.SetURL(mainURL, fallbackURL);
var downloader = new DownloadPackageBundleOperation(bundle, options);
return downloader;
}
}
*/
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4e7786f8fc24d464d89b91d575076759
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,72 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
using UnityEngine.TestTools;
using NUnit.Framework;
using YooAsset;
public class TestBundleReference
{
public IEnumerator RuntimeTester()
{
ResourcePackage package = YooAssets.GetPackage(TestDefine.AssetBundlePackageName);
Assert.IsNotNull(package);
// 加载HeroA
{
var assetHandle = package.LoadAssetAsync<GameObject>("hero_a");
yield return assetHandle;
Assert.AreEqual(EOperationStatus.Succeed, assetHandle.Status);
var pos = new Vector3(-1, -1, 0);
var go = assetHandle.InstantiateSync(pos, Quaternion.identity);
Assert.IsNotNull(go);
}
// 加载HeroB
AssetHandle heroHandle;
GameObject heroObject;
{
heroHandle = package.LoadAssetAsync<GameObject>("hero_b");
yield return heroHandle;
Assert.AreEqual(EOperationStatus.Succeed, heroHandle.Status);
var pos = new Vector3(1, -1, 0);
heroObject = heroHandle.InstantiateSync(pos, Quaternion.identity);
Assert.IsNotNull(heroObject);
}
// 卸载HeroB
{
heroHandle.Release();
GameObject.Destroy(heroObject);
yield return new WaitForEndOfFrame();
}
// 清理未使用资源
{
var operation = package.UnloadUnusedAssetsAsync();
yield return operation;
Assert.AreEqual(EOperationStatus.Succeed, operation.Status);
}
// 再次加载HeroB
{
heroHandle = package.LoadAssetAsync<GameObject>("hero_b");
yield return heroHandle;
Assert.AreEqual(EOperationStatus.Succeed, heroHandle.Status);
var pos = new Vector3(1, -1, 0);
heroObject = heroHandle.InstantiateSync(pos, Quaternion.identity);
Assert.IsNotNull(heroObject);
// 检测材质球关联的纹理是否为空
var mat = heroObject.GetComponent<MeshRenderer>().material;
Assert.IsNotNull(mat.mainTexture);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 31ab830e018f9934f8b95ca1a63b3a03
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,44 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
using UnityEngine.TestTools;
using NUnit.Framework;
using YooAsset;
using System.Linq;
public class TestBundleUnload
{
public IEnumerator RuntimeTester()
{
ResourcePackage package = YooAssets.GetPackage(TestDefine.AssetBundlePackageName);
Assert.IsNotNull(package);
string targetBundleName = "assets_samples_test_sample_testres4_enemy.bundle";
// 加载Enemy
AssetHandle assetHandle;
{
assetHandle = package.LoadAssetAsync<GameObject>("enemy");
yield return assetHandle;
Assert.AreEqual(EOperationStatus.Succeed, assetHandle.Status);
DebugPackageData debugData = package.GetDebugPackageData();
var findItem = debugData.BundleInfos.Where(x => x.BundleName == targetBundleName);
Assert.AreEqual(findItem.Count(), 1);
}
// 卸载Enemy
{
assetHandle.Release();
package.TryUnloadUnusedAsset("enemy");
DebugPackageData debugData = package.GetDebugPackageData();
var findItem = debugData.BundleInfos.Where(x => x.BundleName == targetBundleName);
Assert.AreEqual(findItem.Count(), 0);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c9cf81becc940b94b98926a171bca520
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,49 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using UnityEngine;
using NUnit.Framework;
using YooAsset;
/// <summary>
/// 测试内置文件解压
/// </summary>
public class TestBundleUnpacker
{
public IEnumerator RuntimeTester()
{
ResourcePackage package = YooAssets.GetPackage(TestDefine.AssetBundlePackageName);
Assert.IsNotNull(package);
var resourceUnpacker = package.CreateResourceUnpacker("unpack", 10, 1);
Assert.AreEqual(resourceUnpacker.TotalDownloadCount, 2);
resourceUnpacker.BeginDownload();
yield return resourceUnpacker;
Assert.AreEqual(EOperationStatus.Succeed, resourceUnpacker.Status);
}
}
/* 资源代码流程
* 内置文件解压(解压器触发)
BundleInfo::CreateDownloader()
{
return _buildFileSystem.DownloadFileAsync(Bundle, options);
}
BuildinFileSystem::DownloadFileAsync()
{
options.ImportFilePath = GetBuildinFileLoadPath(bundle);
return _unpackFileSystem.DownloadFileAsync(bundle, options);
}
UnpackFileSystem::DownloadFileAsync()
{
if (string.IsNullOrEmpty(options.ImportFilePath) == false)
{
string mainURL = ConvertToWWWPath(options.ImportFilePath);
options.SetURL(mainURL, mainURL);
var downloader = new DownloadPackageBundleOperation(bundle, options);
return downloader;
}
}
*/
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5e56d0784f1af504c821e67a5ba81862
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
using UnityEngine.TestTools;
using NUnit.Framework;
using YooAsset;
public class TestGetAssetInfos
{
public IEnumerator RuntimeTester()
{
ResourcePackage package = YooAssets.GetPackage(TestDefine.AssetBundlePackageName);
Assert.IsNotNull(package);
// 获取所有资源对象信息
var allAssetInfos = package.GetAllAssetInfos();
Assert.AreEqual(allAssetInfos.Length, 28);
// 获取指定资源对象信息
var assetInfos = package.GetAssetInfos("import");
Assert.AreEqual(assetInfos.Length, 2);
yield break;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ed2ce0f1d01df854da3622e757694128
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: