diff --git a/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs b/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs index 55a7a9bf..d5a911ed 100644 --- a/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs +++ b/Assets/YooAsset/Runtime/DownloadSystem/DownloadSystemHelper.cs @@ -46,5 +46,19 @@ namespace YooAsset throw new System.NotImplementedException(); #endif } + + /// + /// 是否请求的本地文件 + /// + public static bool IsRequestLocalFile(string url) + { + //TODO : UNITY_STANDALONE_OSX平台目前无法确定 + if (url.StartsWith("file:")) + return true; + if (url.StartsWith("jar:file:")) + return true; + + return false; + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult.meta new file mode 100644 index 00000000..37e76299 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9ca0d0d29eb5294b9c6926c6a09e76b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult.meta new file mode 100644 index 00000000..f91f8b9c --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 167d849df37f45e42a77ab47464a9442 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/AssetBundleResult.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/AssetBundleResult.cs new file mode 100644 index 00000000..813587ac --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/AssetBundleResult.cs @@ -0,0 +1,73 @@ +using System.IO; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal class AssetBundleResult : BundleResult + { + private readonly IFileSystem _fileSystem; + private readonly PackageBundle _packageBundle; + private readonly AssetBundle _assetBundle; + private readonly Stream _managedStream; + + public AssetBundleResult(IFileSystem fileSystem, PackageBundle packageBundle, AssetBundle assetBundle, Stream managedStream) + { + _fileSystem = fileSystem; + _packageBundle = packageBundle; + _assetBundle = assetBundle; + _managedStream = managedStream; + } + + public override void UnloadBundleFile() + { + if (_assetBundle != null) + { + _assetBundle.Unload(true); + } + + if (_managedStream != null) + { + _managedStream.Close(); + _managedStream.Dispose(); + } + } + public override string GetBundleFilePath() + { + return _fileSystem.GetBundleFilePath(_packageBundle); + } + public override byte[] ReadBundleFileData() + { + return _fileSystem.ReadBundleFileData(_packageBundle); + } + public override string ReadBundleFileText() + { + return _fileSystem.ReadBundleFileText(_packageBundle); + } + + public override FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) + { + var operation = new AssetBundleLoadAssetOperation(_packageBundle, _assetBundle, assetInfo); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) + { + var operation = new AssetBundleLoadAllAssetsOperation(_packageBundle, _assetBundle, assetInfo); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) + { + var operation = new AssetBundleLoadSubAssetsOperation(_packageBundle, _assetBundle, assetInfo); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + { + var operation = new AssetBundleLoadSceneOperation(assetInfo, loadParams, suspendLoad); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/AssetBundleResult.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/AssetBundleResult.cs.meta new file mode 100644 index 00000000..45cdeefb --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/AssetBundleResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e30b4a882730b534e98d7d70821de979 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation.meta new file mode 100644 index 00000000..fcb5cca8 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e310d20cf53709541bc66d1483afe627 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAllAssetsOperation.cs new file mode 100644 index 00000000..c07af327 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAllAssetsOperation.cs @@ -0,0 +1,121 @@ +using UnityEngine; + +namespace YooAsset +{ + internal class AssetBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation + { + protected enum ESteps + { + None, + CheckBundle, + LoadAsset, + CheckResult, + Done, + } + + private readonly PackageBundle _packageBundle; + private readonly AssetBundle _assetBundle; + private readonly AssetInfo _assetInfo; + private AssetBundleRequest _request; + private ESteps _steps = ESteps.None; + + public AssetBundleLoadAllAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) + { + _packageBundle = packageBundle; + _assetBundle = assetBundle; + _assetInfo = assetInfo; + } + internal override void InternalOnStart() + { + _steps = ESteps.CheckBundle; + } + internal override void InternalOnUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckBundle) + { + if (_assetBundle == null) + { + _steps = ESteps.Done; + Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs !"; + Status = EOperationStatus.Failed; + return; + } + + _steps = ESteps.LoadAsset; + } + + if (_steps == ESteps.LoadAsset) + { + if (IsWaitForAsyncComplete) + { + if (_assetInfo.AssetType == null) + Result = _assetBundle.LoadAllAssets(); + else + Result = _assetBundle.LoadAllAssets(_assetInfo.AssetType); + } + else + { + if (_assetInfo.AssetType == null) + _request = _assetBundle.LoadAllAssetsAsync(); + else + _request = _assetBundle.LoadAllAssetsAsync(_assetInfo.AssetType); + } + + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (_request != null) + { + if (IsWaitForAsyncComplete) + { + // 强制挂起主线程(注意:该操作会很耗时) + YooLogger.Warning("Suspend the main thread to load unity asset."); + Result = _request.allAssets; + } + else + { + Progress = _request.progress; + if (_request.isDone == false) + return; + Result = _request.allAssets; + } + } + + if (Result == null) + { + string error; + if (_assetInfo.AssetType == null) + error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}"; + else + error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}"; + YooLogger.Error(error); + + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } + } + internal override void InternalWaitForAsyncComplete() + { + while (true) + { + if (ExecuteWhileDone()) + { + _steps = ESteps.Done; + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAllAssetsOperation.cs.meta new file mode 100644 index 00000000..e2d27ee2 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAllAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15e73c9ca9f0a7143b155e87ef1a3ce4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAssetOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAssetOperation.cs new file mode 100644 index 00000000..5989576c --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAssetOperation.cs @@ -0,0 +1,121 @@ +using UnityEngine; + +namespace YooAsset +{ + internal class AssetBundleLoadAssetOperation : FSLoadAssetOperation + { + protected enum ESteps + { + None, + CheckBundle, + LoadAsset, + CheckResult, + Done, + } + + private readonly PackageBundle _packageBundle; + private readonly AssetBundle _assetBundle; + private readonly AssetInfo _assetInfo; + private AssetBundleRequest _request; + private ESteps _steps = ESteps.None; + + public AssetBundleLoadAssetOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) + { + _packageBundle = packageBundle; + _assetBundle = assetBundle; + _assetInfo = assetInfo; + } + internal override void InternalOnStart() + { + _steps = ESteps.CheckBundle; + } + internal override void InternalOnUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckBundle) + { + if (_assetBundle == null) + { + _steps = ESteps.Done; + Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs !"; + Status = EOperationStatus.Failed; + return; + } + + _steps = ESteps.LoadAsset; + } + + if (_steps == ESteps.LoadAsset) + { + if (IsWaitForAsyncComplete) + { + if (_assetInfo.AssetType == null) + Result = _assetBundle.LoadAsset(_assetInfo.AssetPath); + else + Result = _assetBundle.LoadAsset(_assetInfo.AssetPath, _assetInfo.AssetType); + } + else + { + if (_assetInfo.AssetType == null) + _request = _assetBundle.LoadAssetAsync(_assetInfo.AssetPath); + else + _request = _assetBundle.LoadAssetAsync(_assetInfo.AssetPath, _assetInfo.AssetType); + } + + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (_request != null) + { + if (IsWaitForAsyncComplete) + { + // 强制挂起主线程(注意:该操作会很耗时) + YooLogger.Warning("Suspend the main thread to load unity asset."); + Result = _request.asset; + } + else + { + Progress = _request.progress; + if (_request.isDone == false) + return; + Result = _request.asset; + } + } + + if (Result == null) + { + string error; + if (_assetInfo.AssetType == null) + error = $"Failed to load asset : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}"; + else + error = $"Failed to load asset : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}"; + YooLogger.Error(error); + + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } + } + internal override void InternalWaitForAsyncComplete() + { + while (true) + { + if (ExecuteWhileDone()) + { + _steps = ESteps.Done; + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAssetOperation.cs.meta new file mode 100644 index 00000000..131c32bd --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadAssetOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 88d19b84940f37a4c9814e60cfaff893 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSceneOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSceneOperation.cs new file mode 100644 index 00000000..ee7a1d21 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSceneOperation.cs @@ -0,0 +1,112 @@ +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal class AssetBundleLoadSceneOperation : FSLoadSceneOperation + { + protected enum ESteps + { + None, + LoadScene, + CheckResult, + Done, + } + + private readonly AssetInfo _assetInfo; + private readonly LoadSceneParameters _loadParams; + private bool _suspendLoad; + private AsyncOperation _asyncOperation; + private ESteps _steps = ESteps.None; + + public AssetBundleLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + { + _assetInfo = assetInfo; + _loadParams = loadParams; + _suspendLoad = suspendLoad; + } + internal override void InternalOnStart() + { + _steps = ESteps.LoadScene; + } + internal override void InternalOnUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.LoadScene) + { + if (IsWaitForAsyncComplete) + { + // 注意:场景同步加载方法不会立即加载场景,而是在下一帧加载。 + Result = SceneManager.LoadScene(_assetInfo.AssetPath, _loadParams); + _steps = ESteps.CheckResult; + } + else + { + // 注意:如果场景不存在异步加载方法返回NULL + // 注意:即使是异步加载也要在当帧获取到场景对象 + _asyncOperation = SceneManager.LoadSceneAsync(_assetInfo.AssetPath, _loadParams); + if (_asyncOperation != null) + { + _asyncOperation.allowSceneActivation = !_suspendLoad; + _asyncOperation.priority = 100; + Result = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); + _steps = ESteps.CheckResult; + } + else + { + string error = $"Failed to load scene : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + } + } + + if (_steps == ESteps.CheckResult) + { + if (_asyncOperation != null) + { + if (IsWaitForAsyncComplete) + { + // 场景加载无法强制异步转同步 + YooLogger.Error("The scene is loading asyn !"); + } + else + { + // 注意:在业务层中途可以取消挂起 + if (_asyncOperation.allowSceneActivation == false) + { + if (_suspendLoad == false) + _asyncOperation.allowSceneActivation = true; + } + + Progress = _asyncOperation.progress; + if (_asyncOperation.isDone == false) + return; + } + } + + if (Result.IsValid()) + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + else + { + string error = $"The loaded scene is invalid : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + } + } + public override void UnSuspendLoad() + { + _suspendLoad = false; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSceneOperation.cs.meta new file mode 100644 index 00000000..782ba156 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSceneOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 797fb02af35f2414a8b4bdb937c68ae2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSubAssetsOperation.cs new file mode 100644 index 00000000..084294b5 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSubAssetsOperation.cs @@ -0,0 +1,121 @@ +using UnityEngine; + +namespace YooAsset +{ + internal class AssetBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation + { + protected enum ESteps + { + None, + CheckBundle, + LoadAsset, + CheckResult, + Done, + } + + private readonly PackageBundle _packageBundle; + private readonly AssetBundle _assetBundle; + private readonly AssetInfo _assetInfo; + private AssetBundleRequest _request; + private ESteps _steps = ESteps.None; + + public AssetBundleLoadSubAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo) + { + _packageBundle = packageBundle; + _assetBundle = assetBundle; + _assetInfo = assetInfo; + } + internal override void InternalOnStart() + { + _steps = ESteps.CheckBundle; + } + internal override void InternalOnUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckBundle) + { + if (_assetBundle == null) + { + _steps = ESteps.Done; + Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs !"; + Status = EOperationStatus.Failed; + return; + } + + _steps = ESteps.LoadAsset; + } + + if (_steps == ESteps.LoadAsset) + { + if (IsWaitForAsyncComplete) + { + if (_assetInfo.AssetType == null) + Result = _assetBundle.LoadAssetWithSubAssets(_assetInfo.AssetPath); + else + Result = _assetBundle.LoadAssetWithSubAssets(_assetInfo.AssetPath, _assetInfo.AssetType); + } + else + { + if (_assetInfo.AssetType == null) + _request = _assetBundle.LoadAssetWithSubAssetsAsync(_assetInfo.AssetPath); + else + _request = _assetBundle.LoadAssetWithSubAssetsAsync(_assetInfo.AssetPath, _assetInfo.AssetType); + } + + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (_request != null) + { + if (IsWaitForAsyncComplete) + { + // 强制挂起主线程(注意:该操作会很耗时) + YooLogger.Warning("Suspend the main thread to load unity asset."); + Result = _request.allAssets; + } + else + { + Progress = _request.progress; + if (_request.isDone == false) + return; + Result = _request.allAssets; + } + } + + if (Result == null) + { + string error; + if (_assetInfo.AssetType == null) + error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}"; + else + error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}"; + YooLogger.Error(error); + + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } + } + internal override void InternalWaitForAsyncComplete() + { + while (true) + { + if (ExecuteWhileDone()) + { + _steps = ESteps.Done; + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSubAssetsOperation.cs.meta new file mode 100644 index 00000000..8906cc13 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/AssetBundleResult/Operation/AssetBundleLoadSubAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f0ff91311450bc44b8e9fc46637dcc4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/BundleResult.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/BundleResult.cs new file mode 100644 index 00000000..9b3e2a1e --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/BundleResult.cs @@ -0,0 +1,48 @@ +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal abstract class BundleResult + { + /// + /// 卸载资源包文件 + /// + public abstract void UnloadBundleFile(); + + /// + /// 获取资源包文件的路径 + /// + public abstract string GetBundleFilePath(); + + /// + /// 读取资源包文件的二进制数据 + /// + public abstract byte[] ReadBundleFileData(); + + /// + /// 读取资源包文件的文本数据 + /// + public abstract string ReadBundleFileText(); + + + /// + /// 加载资源包内的资源对象 + /// + public abstract FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo); + + /// + /// 加载资源包内的所有资源对象 + /// + public abstract FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo); + + /// + /// 加载资源包内的资源对象及所有子资源对象 + /// + public abstract FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo); + + /// + /// 加载资源包内的场景对象 + /// + public abstract FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/BundleResult.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/BundleResult.cs.meta new file mode 100644 index 00000000..8642fb2b --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/BundleResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 773d121e67073ec44adaa843ebcb01a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult.meta new file mode 100644 index 00000000..c5f9b75a --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 87cc377fd18e5f948ba2b1f3e5175781 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation.meta new file mode 100644 index 00000000..06abb811 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 436e50c3a761f854d990f680fdf277ad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAllAssetsOperation.cs new file mode 100644 index 00000000..374d0fec --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAllAssetsOperation.cs @@ -0,0 +1,15 @@ + +namespace YooAsset +{ + internal class RawBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation + { + internal override void InternalOnStart() + { + Error = $"{nameof(RawBundleLoadAllAssetsOperation)} not support load all assets !"; + Status = EOperationStatus.Failed; + } + internal override void InternalOnUpdate() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAllAssetsOperation.cs.meta new file mode 100644 index 00000000..0b292a07 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAllAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 11c2a5a73d3ce674fbe95f014c5f17c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAssetOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAssetOperation.cs new file mode 100644 index 00000000..e38e3ed1 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAssetOperation.cs @@ -0,0 +1,15 @@ + +namespace YooAsset +{ + internal class RawBundleLoadAssetOperation : FSLoadAssetOperation + { + internal override void InternalOnStart() + { + Error = $"{nameof(RawBundleLoadAssetOperation)} not support load asset !"; + Status = EOperationStatus.Failed; + } + internal override void InternalOnUpdate() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAssetOperation.cs.meta new file mode 100644 index 00000000..abbf4556 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadAssetOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f2a4519177358454695404c8af876509 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSceneOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSceneOperation.cs new file mode 100644 index 00000000..51ddc661 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSceneOperation.cs @@ -0,0 +1,18 @@ + +namespace YooAsset +{ + internal class RawBundleLoadSceneOperation : FSLoadSceneOperation + { + internal override void InternalOnStart() + { + Error = $"{nameof(RawBundleLoadSceneOperation)} not support load scene !"; + Status = EOperationStatus.Failed; + } + internal override void InternalOnUpdate() + { + } + public override void UnSuspendLoad() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSceneOperation.cs.meta new file mode 100644 index 00000000..75f9cb80 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSceneOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e4c5d4b0b12d7045bf0c371f9efe0ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSubAssetsOperation.cs new file mode 100644 index 00000000..259c127d --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSubAssetsOperation.cs @@ -0,0 +1,15 @@ + +namespace YooAsset +{ + internal class RawBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation + { + internal override void InternalOnStart() + { + Error = $"{nameof(RawBundleLoadSubAssetsOperation)} not support load sub assets !"; + Status = EOperationStatus.Failed; + } + internal override void InternalOnUpdate() + { + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSubAssetsOperation.cs.meta new file mode 100644 index 00000000..dd3079ce --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/Operation/RawBundleLoadSubAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a6227d1a6e648e04d8b2e50a456c98bb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/RawBundleResult.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/RawBundleResult.cs new file mode 100644 index 00000000..951ff8f9 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/RawBundleResult.cs @@ -0,0 +1,57 @@ +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal class RawBundleResult : BundleResult + { + private readonly IFileSystem _fileSystem; + private readonly PackageBundle _packageBundle; + + public RawBundleResult(IFileSystem fileSystem, PackageBundle packageBundle) + { + _fileSystem = fileSystem; + _packageBundle = packageBundle; + } + + public override void UnloadBundleFile() + { + } + public override string GetBundleFilePath() + { + return _fileSystem.GetBundleFilePath(_packageBundle); + } + public override byte[] ReadBundleFileData() + { + return _fileSystem.ReadBundleFileData(_packageBundle); + } + public override string ReadBundleFileText() + { + return _fileSystem.ReadBundleFileText(_packageBundle); + } + + public override FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) + { + var operation = new RawBundleLoadAssetOperation(); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) + { + var operation = new RawBundleLoadAllAssetsOperation(); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) + { + var operation = new RawBundleLoadSubAssetsOperation(); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + { + var operation = new RawBundleLoadSceneOperation(); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/RawBundleResult.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/RawBundleResult.cs.meta new file mode 100644 index 00000000..1abf950e --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/RawBundleResult/RawBundleResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6e71c986d2a8c74d981deeed7b5a8ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult.meta new file mode 100644 index 00000000..0efc28fc --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e49e0ae672b9944783571b2ad737df9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation.meta new file mode 100644 index 00000000..7f95e038 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 81e8e8c03e8b3f840aa8ffef751d5207 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAllAssetsOperation.cs new file mode 100644 index 00000000..69b57151 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAllAssetsOperation.cs @@ -0,0 +1,122 @@ +using System.Collections.Generic; + +namespace YooAsset +{ + internal class VirtualBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation + { + protected enum ESteps + { + None, + CheckBundle, + LoadAsset, + CheckResult, + Done, + } + + private readonly PackageBundle _packageBundle; + private readonly AssetInfo _assetInfo; + private ESteps _steps = ESteps.None; + + public VirtualBundleLoadAllAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo) + { + _packageBundle = packageBundle; + _assetInfo = assetInfo; + } + internal override void InternalOnStart() + { +#if UNITY_EDITOR + _steps = ESteps.CheckBundle; +#else + _steps = ESteps.Done; + Error = $"{nameof(VirtualBundleLoadAllAssetsOperation)} only support unity editor platform !"; + Status = EOperationStatus.Failed; +#endif + } + internal override void InternalOnUpdate() + { +#if UNITY_EDITOR + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckBundle) + { + // 检测资源文件是否存在 + string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath); + if (string.IsNullOrEmpty(guid)) + { + string error = $"Not found asset : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + return; + } + + _steps = ESteps.LoadAsset; + } + + if (_steps == ESteps.LoadAsset) + { + if (_assetInfo.AssetType == null) + { + List result = new List(); + foreach (var packageAsset in _packageBundle.IncludeMainAssets) + { + string assetPath = packageAsset.AssetPath; + UnityEngine.Object mainAsset = UnityEditor.AssetDatabase.LoadMainAssetAtPath(assetPath); + if (mainAsset != null) + result.Add(mainAsset); + } + Result = result.ToArray(); + } + else + { + List result = new List(); + foreach (var packageAsset in _packageBundle.IncludeMainAssets) + { + string assetPath = packageAsset.AssetPath; + UnityEngine.Object mainAsset = UnityEditor.AssetDatabase.LoadAssetAtPath(assetPath, _assetInfo.AssetType); + if (mainAsset != null) + result.Add(mainAsset); + } + Result = result.ToArray(); + } + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (Result == null) + { + string error; + if (_assetInfo.AssetType == null) + error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : null"; + else + error = $"Failed to load all assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}"; + YooLogger.Error(error); + + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } +#endif + } + internal override void InternalWaitForAsyncComplete() + { + while (true) + { + if (ExecuteWhileDone()) + { + _steps = ESteps.Done; + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAllAssetsOperation.cs.meta new file mode 100644 index 00000000..6a36ed07 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAllAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f357dc3f2b24d0a478e4f01d4464bf8f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAssetOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAssetOperation.cs new file mode 100644 index 00000000..2da09a24 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAssetOperation.cs @@ -0,0 +1,101 @@ + +namespace YooAsset +{ + internal class VirtualBundleLoadAssetOperation : FSLoadAssetOperation + { + protected enum ESteps + { + None, + CheckBundle, + LoadAsset, + CheckResult, + Done, + } + + private readonly PackageBundle _packageBundle; + private readonly AssetInfo _assetInfo; + private ESteps _steps = ESteps.None; + + public VirtualBundleLoadAssetOperation(PackageBundle packageBundle, AssetInfo assetInfo) + { + _packageBundle = packageBundle; + _assetInfo = assetInfo; + } + internal override void InternalOnStart() + { +#if UNITY_EDITOR + _steps = ESteps.CheckBundle; +#else + _steps = ESteps.Done; + Error = $"{nameof(VirtualBundleLoadAssetOperation)} only support unity editor platform !"; + Status = EOperationStatus.Failed; +#endif + } + internal override void InternalOnUpdate() + { +#if UNITY_EDITOR + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckBundle) + { + // 检测资源文件是否存在 + string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath); + if (string.IsNullOrEmpty(guid)) + { + string error = $"Not found asset : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + return; + } + + _steps = ESteps.LoadAsset; + } + + if (_steps == ESteps.LoadAsset) + { + if (_assetInfo.AssetType == null) + Result = UnityEditor.AssetDatabase.LoadMainAssetAtPath(_assetInfo.AssetPath); + else + Result = UnityEditor.AssetDatabase.LoadAssetAtPath(_assetInfo.AssetPath, _assetInfo.AssetType); + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (Result == null) + { + string error; + if (_assetInfo.AssetType == null) + error = $"Failed to load asset object : {_assetInfo.AssetPath} AssetType : null"; + else + error = $"Failed to load asset object : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}"; + YooLogger.Error(error); + + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } +#endif + } + internal override void InternalWaitForAsyncComplete() + { + while (true) + { + if (ExecuteWhileDone()) + { + _steps = ESteps.Done; + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAssetOperation.cs.meta new file mode 100644 index 00000000..9532ca89 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadAssetOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03615d03f7c5f1a4cb20309d7cce231d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSceneOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSceneOperation.cs new file mode 100644 index 00000000..88157baf --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSceneOperation.cs @@ -0,0 +1,118 @@ +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal class VirtualBundleLoadSceneOperation : FSLoadSceneOperation + { + protected enum ESteps + { + None, + LoadScene, + CheckResult, + Done, + } + + private readonly AssetInfo _assetInfo; + private readonly LoadSceneParameters _loadParams; + private bool _suspendLoad; + private AsyncOperation _asyncOperation; + private ESteps _steps = ESteps.None; + + public VirtualBundleLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + { + _assetInfo = assetInfo; + _loadParams = loadParams; + _suspendLoad = suspendLoad; + } + internal override void InternalOnStart() + { +#if UNITY_EDITOR + _steps = ESteps.LoadScene; +#else + _steps = ESteps.Done; + Error = $"{nameof(VirtualBundleLoadSceneOperation)} only support unity editor platform !"; + Status = EOperationStatus.Failed; +#endif + } + internal override void InternalOnUpdate() + { +#if UNITY_EDITOR + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.LoadScene) + { + if (IsWaitForAsyncComplete) + { + Result = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneInPlayMode(_assetInfo.AssetPath, _loadParams); + _steps = ESteps.CheckResult; + } + else + { + _asyncOperation = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(_assetInfo.AssetPath, _loadParams); + if (_asyncOperation != null) + { + _asyncOperation.allowSceneActivation = !_suspendLoad; + _asyncOperation.priority = 100; + Result = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); + _steps = ESteps.CheckResult; + } + else + { + string error = $"Failed to load scene : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + return; + } + } + } + + if (_steps == ESteps.CheckResult) + { + if (_asyncOperation != null) + { + if (IsWaitForAsyncComplete) + { + // 场景加载无法强制异步转同步 + YooLogger.Error("The scene is loading asyn !"); + } + else + { + // 注意:在业务层中途可以取消挂起 + if (_asyncOperation.allowSceneActivation == false) + { + if (_suspendLoad == false) + _asyncOperation.allowSceneActivation = true; + } + + Progress = _asyncOperation.progress; + if (_asyncOperation.isDone == false) + return; + } + } + + if (Result.IsValid()) + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + else + { + string error = $"The loaded scene is invalid : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + } +#endif + } + public override void UnSuspendLoad() + { + _suspendLoad = false; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSceneOperation.cs.meta new file mode 100644 index 00000000..dbc1d32b --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSceneOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b8822604da5ad44db43c220ab019a3d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSubAssetsOperation.cs new file mode 100644 index 00000000..f8d90155 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSubAssetsOperation.cs @@ -0,0 +1,113 @@ +using System.Collections.Generic; + +namespace YooAsset +{ + internal class VirtualBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation + { + protected enum ESteps + { + None, + CheckBundle, + LoadAsset, + CheckResult, + Done, + } + + private readonly PackageBundle _packageBundle; + private readonly AssetInfo _assetInfo; + private ESteps _steps = ESteps.None; + + public VirtualBundleLoadSubAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo) + { + _packageBundle = packageBundle; + _assetInfo = assetInfo; + } + internal override void InternalOnStart() + { +#if UNITY_EDITOR + _steps = ESteps.CheckBundle; +#else + _steps = ESteps.Done; + Error = $"{nameof(VirtualBundleLoadSubAssetsOperation)} only support unity editor platform !"; + Status = EOperationStatus.Failed; +#endif + } + internal override void InternalOnUpdate() + { +#if UNITY_EDITOR + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckBundle) + { + // 检测资源文件是否存在 + string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath); + if (string.IsNullOrEmpty(guid)) + { + string error = $"Not found asset : {_assetInfo.AssetPath}"; + YooLogger.Error(error); + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + return; + } + + _steps = ESteps.LoadAsset; + } + + if (_steps == ESteps.LoadAsset) + { + if (_assetInfo.AssetType == null) + { + Result = UnityEditor.AssetDatabase.LoadAllAssetRepresentationsAtPath(_assetInfo.AssetPath); + } + else + { + UnityEngine.Object[] findAssets = UnityEditor.AssetDatabase.LoadAllAssetRepresentationsAtPath(_assetInfo.AssetPath); + List result = new List(findAssets.Length); + foreach (var findAsset in findAssets) + { + if (_assetInfo.AssetType.IsAssignableFrom(findAsset.GetType())) + result.Add(findAsset); + } + Result = result.ToArray(); + } + _steps = ESteps.CheckResult; + } + + if (_steps == ESteps.CheckResult) + { + if (Result == null) + { + string error; + if (_assetInfo.AssetType == null) + error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : null"; + else + error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}"; + YooLogger.Error(error); + + _steps = ESteps.Done; + Error = error; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } +#endif + } + internal override void InternalWaitForAsyncComplete() + { + while (true) + { + if (ExecuteWhileDone()) + { + _steps = ESteps.Done; + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSubAssetsOperation.cs.meta new file mode 100644 index 00000000..6bbdc1ec --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/Operation/VirtualBundleLoadSubAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afdd738603565e6499dc48e4f00ca178 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/VirtualBundleResult.cs b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/VirtualBundleResult.cs new file mode 100644 index 00000000..32aecadd --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/VirtualBundleResult.cs @@ -0,0 +1,57 @@ +using UnityEngine.SceneManagement; + +namespace YooAsset +{ + internal class VirtualBundleResult : BundleResult + { + private readonly IFileSystem _fileSystem; + private readonly PackageBundle _packageBundle; + + public VirtualBundleResult(IFileSystem fileSystem, PackageBundle bundle) + { + _fileSystem = fileSystem; + _packageBundle = bundle; + } + + public override void UnloadBundleFile() + { + } + public override string GetBundleFilePath() + { + return _fileSystem.GetBundleFilePath(_packageBundle); + } + public override byte[] ReadBundleFileData() + { + return _fileSystem.ReadBundleFileData(_packageBundle); + } + public override string ReadBundleFileText() + { + return _fileSystem.ReadBundleFileText(_packageBundle); + } + + public override FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo) + { + var operation = new VirtualBundleLoadAssetOperation(_packageBundle, assetInfo); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo) + { + var operation = new VirtualBundleLoadAllAssetsOperation(_packageBundle, assetInfo); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo) + { + var operation = new VirtualBundleLoadSubAssetsOperation(_packageBundle, assetInfo); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + public override FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad) + { + var operation = new VirtualBundleLoadSceneOperation(assetInfo, loadParams, suspendLoad); + OperationSystem.StartOperation(_fileSystem.PackageName, operation); + return operation; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/VirtualBundleResult.cs.meta b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/VirtualBundleResult.cs.meta new file mode 100644 index 00000000..775e6565 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/BundleResult/VirtualBundleResult/VirtualBundleResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 822bb85f05144d842977dda341174db2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadNormalFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadNormalFileOperation.cs index 291787d0..fa8a4fb4 100644 --- a/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadNormalFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadNormalFileOperation.cs @@ -9,6 +9,7 @@ namespace YooAsset private readonly IFileSystem _fileSystem; private readonly ICacheSystem _cacheSystem; private VerifyTempFileOperation _verifyOperation; + private bool _isReuqestLocalFile; private string _tempFilePath; private ESteps _steps = ESteps.None; @@ -19,6 +20,7 @@ namespace YooAsset } internal override void InternalOnStart() { + _isReuqestLocalFile = DownloadSystemHelper.IsRequestLocalFile(Param.MainURL); _tempFilePath = _cacheSystem.GetTempFilePath(Bundle); _steps = ESteps.CheckExists; } @@ -131,6 +133,15 @@ namespace YooAsset // 重新尝试下载 if (_steps == ESteps.TryAgain) { + //TODO : 拷贝本地文件失败后不再尝试! + if (_isReuqestLocalFile) + { + Status = EOperationStatus.Failed; + _steps = ESteps.Done; + YooLogger.Error(Error); + return; + } + if (FailedTryAgain <= 0) { Status = EOperationStatus.Failed; @@ -155,12 +166,16 @@ namespace YooAsset } internal override void InternalWaitForAsyncComplete() { - bool isReuqestLocalFile = IsRequestLocalFile(); + //TODO : 防止下载器挂起陷入无限死循环! + if (_steps == ESteps.None) + { + InternalOnStart(); + } while (true) { - // 注意:如果是导入或解压本地文件,执行等待完毕 - if (isReuqestLocalFile) + //TODO : 如果是导入或解压本地文件,执行等待完毕 + if (_isReuqestLocalFile) { InternalOnUpdate(); if (IsDone) diff --git a/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadResumeFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadResumeFileOperation.cs index f45b8fe8..1655368a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadResumeFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/DownloadResumeFileOperation.cs @@ -12,6 +12,7 @@ namespace YooAsset private readonly List _responseCodes; private DownloadHandlerFileRange _downloadHandle; private VerifyTempFileOperation _verifyOperation; + private bool _isReuqestLocalFile; private long _fileOriginLength = 0; private string _tempFilePath; private ESteps _steps = ESteps.None; @@ -25,6 +26,7 @@ namespace YooAsset } internal override void InternalOnStart() { + _isReuqestLocalFile = DownloadSystemHelper.IsRequestLocalFile(Param.MainURL); _tempFilePath = _cacheSystem.GetTempFilePath(Bundle); _steps = ESteps.CheckExists; } @@ -153,6 +155,15 @@ namespace YooAsset // 重新尝试下载 if (_steps == ESteps.TryAgain) { + //TODO : 拷贝本地文件失败后不再尝试! + if (_isReuqestLocalFile) + { + Status = EOperationStatus.Failed; + _steps = ESteps.Done; + YooLogger.Error(Error); + return; + } + if (FailedTryAgain <= 0) { Status = EOperationStatus.Failed; @@ -177,12 +188,16 @@ namespace YooAsset } internal override void InternalWaitForAsyncComplete() { - bool isReuqestLocalFile = IsRequestLocalFile(); + //TODO : 防止下载器挂起陷入无限死循环! + if (_steps == ESteps.None) + { + InternalOnStart(); + } while (true) { - // 注意:如果是导入或解压本地文件,执行等待完毕 - if (isReuqestLocalFile) + //TODO : 如果是导入或解压本地文件,执行等待完毕 + if (_isReuqestLocalFile) { InternalOnUpdate(); if (IsDone) diff --git a/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/VerifyTempFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/VerifyTempFileOperation.cs index 271cdaaa..de79c21a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/VerifyTempFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/CacheSystem/Operation/VerifyTempFileOperation.cs @@ -70,7 +70,7 @@ namespace YooAsset { while (true) { - // 注意:等待子线程验证文件完毕 + //TODO : 等待子线程验证文件完毕,该操作会挂起主线程 InternalOnUpdate(); if (IsDone) break; diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index 1856e574..8b4fb9a1 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -21,7 +21,6 @@ namespace YooAsset } protected readonly Dictionary _wrappers = new Dictionary(10000); - protected readonly Dictionary _loadedStream = new Dictionary(10000); protected readonly Dictionary _buildinFilePaths = new Dictionary(10000); protected IFileSystem _unpackFileSystem; protected string _packageRoot; @@ -64,11 +63,6 @@ namespace YooAsset /// public bool AppendFileExtension { private set; get; } = false; - /// - /// 自定义参数:原生文件构建管线 - /// - public bool RawFileBuildPipeline { private set; get; } = false; - /// /// 自定义参数:解密方法类 /// @@ -113,7 +107,13 @@ namespace YooAsset return _unpackFileSystem.LoadBundleFile(bundle); } - if (RawFileBuildPipeline) + if (bundle.BundleType == (int)EBuildBundleType.AssetBundle) + { + var operation = new DBFSLoadAssetBundleOperation(this, bundle); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } + else if (bundle.BundleType == (int)EBuildBundleType.RawBundle) { var operation = new DBFSLoadRawBundleOperation(this, bundle); OperationSystem.StartOperation(PackageName, operation); @@ -121,37 +121,12 @@ namespace YooAsset } else { - var operation = new DBFSLoadAssetBundleOperation(this, bundle); + string error = $"{nameof(DefaultBuildinFileSystem)} not support load bundle type : {bundle.BundleType}"; + var operation = new FSLoadBundleCompleteOperation(error); OperationSystem.StartOperation(PackageName, operation); return operation; } } - public virtual void UnloadBundleFile(PackageBundle bundle, object result) - { - AssetBundle assetBundle = result as AssetBundle; - if (assetBundle == null) - return; - - if (_unpackFileSystem.Exists(bundle)) - { - _unpackFileSystem.UnloadBundleFile(bundle, assetBundle); - } - else - { - if (assetBundle != null) - assetBundle.Unload(true); - - if (_loadedStream.TryGetValue(bundle.BundleGUID, out Stream managedStream)) - { - if (managedStream != null) - { - managedStream.Close(); - managedStream.Dispose(); - } - _loadedStream.Remove(bundle.BundleGUID); - } - } - } public virtual void SetParameter(string name, object value) { @@ -163,10 +138,6 @@ namespace YooAsset { AppendFileExtension = (bool)value; } - else if (name == FileSystemParametersDefine.RAW_FILE_BUILD_PIPELINE) - { - RawFileBuildPipeline = (bool)value; - } else if (name == FileSystemParametersDefine.DECRYPTION_SERVICES) { DecryptionServices = (IDecryptionServices)value; @@ -191,7 +162,6 @@ namespace YooAsset _unpackFileSystem.SetParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices); _unpackFileSystem.SetParameter(FileSystemParametersDefine.FILE_VERIFY_LEVEL, FileVerifyLevel); _unpackFileSystem.SetParameter(FileSystemParametersDefine.APPEND_FILE_EXTENSION, AppendFileExtension); - _unpackFileSystem.SetParameter(FileSystemParametersDefine.RAW_FILE_BUILD_PIPELINE, RawFileBuildPipeline); _unpackFileSystem.SetParameter(FileSystemParametersDefine.DECRYPTION_SERVICES, DecryptionServices); _unpackFileSystem.OnCreate(packageName, null); } @@ -218,7 +188,7 @@ namespace YooAsset return false; #if UNITY_ANDROID - return RawFileBuildPipeline || bundle.Encrypted; + return bundle.BundleType == (int)EBuildBundleType.RawBundle || bundle.Encrypted; #else return false; #endif @@ -228,10 +198,17 @@ namespace YooAsset return false; } - public virtual byte[] ReadFileData(PackageBundle bundle) + public virtual string GetBundleFilePath(PackageBundle bundle) { if (NeedUnpack(bundle)) - return _unpackFileSystem.ReadFileData(bundle); + return _unpackFileSystem.GetBundleFilePath(bundle); + + return GetBuildinFileLoadPath(bundle); + } + public virtual byte[] ReadBundleFileData(PackageBundle bundle) + { + if (NeedUnpack(bundle)) + return _unpackFileSystem.ReadBundleFileData(bundle); if (Exists(bundle) == false) return null; @@ -259,10 +236,10 @@ namespace YooAsset return FileUtility.ReadAllBytes(filePath); } } - public virtual string ReadFileText(PackageBundle bundle) + public virtual string ReadBundleFileText(PackageBundle bundle) { if (NeedUnpack(bundle)) - return _unpackFileSystem.ReadFileText(bundle); + return _unpackFileSystem.ReadBundleFileText(bundle); if (Exists(bundle) == false) return null; @@ -350,9 +327,9 @@ namespace YooAsset } /// - /// 加载加密资源文件 + /// 加载加密的资源文件 /// - public AssetBundle LoadEncryptedAssetBundle(PackageBundle bundle) + public DecryptResult LoadEncryptedAssetBundle(PackageBundle bundle) { string filePath = GetBuildinFileLoadPath(bundle); var fileInfo = new DecryptFileInfo() @@ -361,16 +338,13 @@ namespace YooAsset FileLoadCRC = bundle.UnityCRC, FileLoadPath = filePath, }; - - var assetBundle = DecryptionServices.LoadAssetBundle(fileInfo, out var managedStream); - _loadedStream.Add(bundle.BundleGUID, managedStream); - return assetBundle; + return DecryptionServices.LoadAssetBundle(fileInfo); } /// - /// 加载加密资源文件 + /// 加载加密的资源文件 /// - public AssetBundleCreateRequest LoadEncryptedAssetBundleAsync(PackageBundle bundle) + public DecryptResult LoadEncryptedAssetBundleAsync(PackageBundle bundle) { string filePath = GetBuildinFileLoadPath(bundle); var fileInfo = new DecryptFileInfo() @@ -379,10 +353,7 @@ namespace YooAsset FileLoadCRC = bundle.UnityCRC, FileLoadPath = filePath, }; - - var createRequest = DecryptionServices.LoadAssetBundleAsync(fileInfo, out var managedStream); - _loadedStream.Add(bundle.BundleGUID, managedStream); - return createRequest; + return DecryptionServices.LoadAssetBundleAsync(fileInfo); } #endregion } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSLoadBundleOperation.cs index 20aeb520..fb7c310e 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/DBFSLoadBundleOperation.cs @@ -19,6 +19,8 @@ namespace YooAsset private readonly DefaultBuildinFileSystem _fileSystem; private readonly PackageBundle _bundle; private AssetBundleCreateRequest _createRequest; + private AssetBundle _assetBundle; + private Stream _managedStream; private ESteps _steps = ESteps.None; @@ -56,19 +58,23 @@ namespace YooAsset { if (_bundle.Encrypted) { - Result = _fileSystem.LoadEncryptedAssetBundle(_bundle); + var decryptResult = _fileSystem.LoadEncryptedAssetBundle(_bundle); + _assetBundle = decryptResult.Result; + _managedStream = decryptResult.ManagedStream; } else { string filePath = _fileSystem.GetBuildinFileLoadPath(_bundle); - Result = AssetBundle.LoadFromFile(filePath); + _assetBundle = AssetBundle.LoadFromFile(filePath); } } else { if (_bundle.Encrypted) { - _createRequest = _fileSystem.LoadEncryptedAssetBundleAsync(_bundle); + var decryptResult = _fileSystem.LoadEncryptedAssetBundleAsync(_bundle); + _createRequest = decryptResult.CreateRequest; + _managedStream = decryptResult.ManagedStream; } else { @@ -88,19 +94,20 @@ namespace YooAsset { // 强制挂起主线程(注意:该操作会很耗时) YooLogger.Warning("Suspend the main thread to load unity bundle."); - Result = _createRequest.assetBundle; + _assetBundle = _createRequest.assetBundle; } else { if (_createRequest.isDone == false) return; - Result = _createRequest.assetBundle; + _assetBundle = _createRequest.assetBundle; } } - if (Result != null) + if (_assetBundle != null) { _steps = ESteps.Done; + Result = new AssetBundleResult(_fileSystem, _bundle, _assetBundle, _managedStream); Status = EOperationStatus.Succeed; return; } @@ -176,7 +183,7 @@ namespace YooAsset if (File.Exists(filePath)) { _steps = ESteps.Done; - Result = new RawBundle(_fileSystem, _bundle, filePath); + Result = new RawBundleResult(_fileSystem, _bundle); Status = EOperationStatus.Succeed; } else diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheDownloadCenter.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheDownloadCenter.cs index 726aa382..864d3917 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheDownloadCenter.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheDownloadCenter.cs @@ -84,7 +84,6 @@ namespace YooAsset } // 设置请求URL - bool importFile = false; if (string.IsNullOrEmpty(param.ImportFilePath)) { param.MainURL = _fileSystem.RemoteServices.GetRemoteMainURL(bundle.FileName); @@ -95,7 +94,6 @@ namespace YooAsset // 注意:把本地文件路径指定为远端下载地址 param.MainURL = DownloadSystemHelper.ConvertToWWWPath(param.ImportFilePath); param.FallbackURL = param.MainURL; - importFile = true; } // 创建新的下载器 @@ -112,12 +110,6 @@ namespace YooAsset newDownloader.Reference(); _downloaders.Add(bundle.BundleGUID, newDownloader); } - - // 注意:导入文件不要限制并发!导入文件涉及到异步转同步,限制并发会导致主线程卡死风险! - if (importFile) - { - OperationSystem.StartOperation(_fileSystem.PackageName, newDownloader); - } return newDownloader; } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index 26c146ea..b8932b13 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -13,7 +13,6 @@ namespace YooAsset internal class DefaultCacheFileSystem : IFileSystem, ICacheSystem { protected readonly Dictionary _wrappers = new Dictionary(10000); - protected readonly Dictionary _loadedStream = new Dictionary(10000); protected readonly Dictionary _dataFilePaths = new Dictionary(10000); protected readonly Dictionary _infoFilePaths = new Dictionary(10000); protected readonly Dictionary _tempFilePaths = new Dictionary(10000); @@ -67,11 +66,6 @@ namespace YooAsset /// public bool AppendFileExtension { private set; get; } = false; - /// - /// 自定义参数:原生文件构建管线 - /// - public bool RawFileBuildPipeline { private set; get; } = false; - /// /// 自定义参数:最大并发连接数 /// @@ -154,7 +148,13 @@ namespace YooAsset } public virtual FSLoadBundleOperation LoadBundleFile(PackageBundle bundle) { - if (RawFileBuildPipeline) + if (bundle.BundleType == (int)EBuildBundleType.AssetBundle) + { + var operation = new DCFSLoadAssetBundleOperation(this, bundle); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } + else if (bundle.BundleType == (int)EBuildBundleType.RawBundle) { var operation = new DCFSLoadRawBundleOperation(this, bundle); OperationSystem.StartOperation(PackageName, operation); @@ -162,30 +162,12 @@ namespace YooAsset } else { - var operation = new DCFSLoadAssetBundleOperation(this, bundle); + string error = $"{nameof(DefaultCacheFileSystem)} not support load bundle type : {bundle.BundleType}"; + var operation = new FSLoadBundleCompleteOperation(error); OperationSystem.StartOperation(PackageName, operation); return operation; } } - public virtual void UnloadBundleFile(PackageBundle bundle, object result) - { - AssetBundle assetBundle = result as AssetBundle; - if (assetBundle == null) - return; - - if (assetBundle != null) - assetBundle.Unload(true); - - if (_loadedStream.TryGetValue(bundle.BundleGUID, out Stream managedStream)) - { - if (managedStream != null) - { - managedStream.Close(); - managedStream.Dispose(); - } - _loadedStream.Remove(bundle.BundleGUID); - } - } public virtual void SetParameter(string name, object value) { @@ -201,10 +183,6 @@ namespace YooAsset { AppendFileExtension = (bool)value; } - else if (name == FileSystemParametersDefine.RAW_FILE_BUILD_PIPELINE) - { - RawFileBuildPipeline = (bool)value; - } else if (name == FileSystemParametersDefine.DOWNLOAD_MAX_CONCURRENCY) { DownloadMaxConcurrency = (int)value; @@ -276,7 +254,11 @@ namespace YooAsset return Exists(bundle) == false; } - public virtual byte[] ReadFileData(PackageBundle bundle) + public virtual string GetBundleFilePath(PackageBundle bundle) + { + return GetCacheFileLoadPath(bundle); + } + public virtual byte[] ReadBundleFileData(PackageBundle bundle) { if (Exists(bundle) == false) return null; @@ -304,7 +286,7 @@ namespace YooAsset return FileUtility.ReadAllBytes(filePath); } } - public virtual string ReadFileText(PackageBundle bundle) + public virtual string ReadBundleFileText(PackageBundle bundle) { if (Exists(bundle) == false) return null; @@ -523,7 +505,7 @@ namespace YooAsset /// /// 加载加密资源文件 /// - public AssetBundle LoadEncryptedAssetBundle(PackageBundle bundle) + public DecryptResult LoadEncryptedAssetBundle(PackageBundle bundle) { string filePath = GetCacheFileLoadPath(bundle); var fileInfo = new DecryptFileInfo() @@ -532,16 +514,13 @@ namespace YooAsset FileLoadCRC = bundle.UnityCRC, FileLoadPath = filePath, }; - - var assetBundle = DecryptionServices.LoadAssetBundle(fileInfo, out var managedStream); - _loadedStream.Add(bundle.BundleGUID, managedStream); - return assetBundle; + return DecryptionServices.LoadAssetBundle(fileInfo); } /// /// 加载加密资源文件 /// - public AssetBundleCreateRequest LoadEncryptedAssetBundleAsync(PackageBundle bundle) + public DecryptResult LoadEncryptedAssetBundleAsync(PackageBundle bundle) { string filePath = GetCacheFileLoadPath(bundle); var fileInfo = new DecryptFileInfo() @@ -550,10 +529,7 @@ namespace YooAsset FileLoadCRC = bundle.UnityCRC, FileLoadPath = filePath, }; - - var createRequest = DecryptionServices.LoadAssetBundleAsync(fileInfo, out var managedStream); - _loadedStream.Add(bundle.BundleGUID, managedStream); - return createRequest; + return DecryptionServices.LoadAssetBundleAsync(fileInfo); } #endregion } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs index 0d8d91ee..feea33ab 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/DCFSLoadBundleOperation.cs @@ -19,6 +19,8 @@ namespace YooAsset protected readonly PackageBundle _bundle; protected FSDownloadFileOperation _downloadFileOp; protected AssetBundleCreateRequest _createRequest; + private AssetBundle _assetBundle; + private Stream _managedStream; protected ESteps _steps = ESteps.None; @@ -96,19 +98,23 @@ namespace YooAsset { if (_bundle.Encrypted) { - Result = _fileSystem.LoadEncryptedAssetBundle(_bundle); + var decryptResult = _fileSystem.LoadEncryptedAssetBundle(_bundle); + _assetBundle = decryptResult.Result; + _managedStream = decryptResult.ManagedStream; } else { string filePath = _fileSystem.GetCacheFileLoadPath(_bundle); - Result = AssetBundle.LoadFromFile(filePath); + _assetBundle = AssetBundle.LoadFromFile(filePath); } } else { if (_bundle.Encrypted) { - _createRequest = _fileSystem.LoadEncryptedAssetBundleAsync(_bundle); + var decryptResult = _fileSystem.LoadEncryptedAssetBundleAsync(_bundle); + _createRequest = decryptResult.CreateRequest; + _managedStream = decryptResult.ManagedStream; } else { @@ -128,19 +134,20 @@ namespace YooAsset { // 强制挂起主线程(注意:该操作会很耗时) YooLogger.Warning("Suspend the main thread to load unity bundle."); - Result = _createRequest.assetBundle; + _assetBundle = _createRequest.assetBundle; } else { if (_createRequest.isDone == false) return; - Result = _createRequest.assetBundle; + _assetBundle = _createRequest.assetBundle; } } - if (Result != null) + if (_assetBundle != null) { _steps = ESteps.Done; + Result = new AssetBundleResult(_fileSystem, _bundle, _assetBundle, _managedStream); Status = EOperationStatus.Succeed; return; } @@ -165,8 +172,8 @@ namespace YooAsset byte[] fileData = FileUtility.ReadAllBytes(filePath); if (fileData != null && fileData.Length > 0) { - Result = AssetBundle.LoadFromMemory(fileData); - if (Result == null) + _assetBundle = AssetBundle.LoadFromMemory(fileData); + if (_assetBundle == null) { _steps = ESteps.Done; Status = EOperationStatus.Failed; @@ -176,6 +183,7 @@ namespace YooAsset else { _steps = ESteps.Done; + Result = new AssetBundleResult(_fileSystem, _bundle, _assetBundle, null); Status = EOperationStatus.Succeed; } } @@ -300,7 +308,7 @@ namespace YooAsset if (File.Exists(filePath)) { _steps = ESteps.Done; - Result = new RawBundle(_fileSystem, _bundle, filePath); + Result = new RawBundleResult(_fileSystem, _bundle); Status = EOperationStatus.Succeed; } else @@ -318,6 +326,7 @@ namespace YooAsset { if (ExecuteWhileDone()) { + //TODO 拷贝本地文件失败也会触发该错误! if (_downloadFileOp != null && _downloadFileOp.Status == EOperationStatus.Failed) YooLogger.Error($"Try load bundle {_bundle.BundleName} from remote !"); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs index 329fe313..fd719968 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/DefaultEditorFileSystem.cs @@ -81,12 +81,19 @@ namespace YooAsset } public virtual FSLoadBundleOperation LoadBundleFile(PackageBundle bundle) { - var operation = new DEFSLoadBundleOperation(this, bundle); - OperationSystem.StartOperation(PackageName, operation); - return operation; - } - public virtual void UnloadBundleFile(PackageBundle bundle, object result) - { + if (bundle.BundleType == (int)EBuildBundleType.VirtualBundle) + { + var operation = new DEFSLoadBundleOperation(this, bundle); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } + else + { + string error = $"{nameof(DefaultEditorFileSystem)} not support load bundle type : {bundle.BundleType}"; + var operation = new FSLoadBundleCompleteOperation(error); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } } public virtual void SetParameter(string name, object value) @@ -139,13 +146,29 @@ namespace YooAsset return false; } - public virtual byte[] ReadFileData(PackageBundle bundle) + public virtual string GetBundleFilePath(PackageBundle bundle) { - throw new System.NotImplementedException(); + if (bundle.IncludeMainAssets.Count == 0) + return string.Empty; + + var pacakgeAsset = bundle.IncludeMainAssets[0]; + return pacakgeAsset.AssetPath; } - public virtual string ReadFileText(PackageBundle bundle) + public virtual byte[] ReadBundleFileData(PackageBundle bundle) { - throw new System.NotImplementedException(); + if (bundle.IncludeMainAssets.Count == 0) + return null; + + var pacakgeAsset = bundle.IncludeMainAssets[0]; + return FileUtility.ReadAllBytes(pacakgeAsset.AssetPath); + } + public virtual string ReadBundleFileText(PackageBundle bundle) + { + if (bundle.IncludeMainAssets.Count == 0) + return null; + + var pacakgeAsset = bundle.IncludeMainAssets[0]; + return FileUtility.ReadAllText(pacakgeAsset.AssetPath); } #region 内部方法 diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/DEFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/DEFSLoadBundleOperation.cs index b408f669..87db4cde 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/DEFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultEditorFileSystem/Operation/DEFSLoadBundleOperation.cs @@ -57,7 +57,7 @@ namespace YooAsset if (_steps == ESteps.CheckResult) { _steps = ESteps.Done; - Result = new VirtualBundle(_fileSystem, _bundle); + Result = new VirtualBundleResult(_fileSystem, _bundle); Status = EOperationStatus.Succeed; } } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs index fc69cd6e..184e5b71 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/DefaultWebRemoteFileSystem.cs @@ -83,18 +83,19 @@ namespace YooAsset } public virtual FSLoadBundleOperation LoadBundleFile(PackageBundle bundle) { - var operation = new DWRFSLoadAssetBundleOperation(this, bundle); - OperationSystem.StartOperation(PackageName, operation); - return operation; - } - public virtual void UnloadBundleFile(PackageBundle bundle, object result) - { - AssetBundle assetBundle = result as AssetBundle; - if (assetBundle == null) - return; - - if (assetBundle != null) - assetBundle.Unload(true); + if (bundle.BundleType == (int)EBuildBundleType.AssetBundle) + { + var operation = new DWRFSLoadAssetBundleOperation(this, bundle); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } + else + { + string error = $"{nameof(DefaultWebRemoteFileSystem)} not support load bundle type : {bundle.BundleType}"; + var operation = new FSLoadBundleCompleteOperation(error); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } } public virtual void SetParameter(string name, object value) @@ -141,11 +142,15 @@ namespace YooAsset return false; } - public virtual byte[] ReadFileData(PackageBundle bundle) + public virtual string GetBundleFilePath(PackageBundle bundle) { throw new System.NotImplementedException(); } - public virtual string ReadFileText(PackageBundle bundle) + public virtual byte[] ReadBundleFileData(PackageBundle bundle) + { + throw new System.NotImplementedException(); + } + public virtual string ReadBundleFileText(PackageBundle bundle) { throw new System.NotImplementedException(); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/DWRFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/DWRFSLoadBundleOperation.cs index 884b86a3..293bae15 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/DWRFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebRemoteFileSystem/Operation/DWRFSLoadBundleOperation.cs @@ -1,4 +1,6 @@  +using UnityEngine; + namespace YooAsset { internal class DWRFSLoadAssetBundleOperation : FSLoadBundleOperation @@ -49,9 +51,19 @@ namespace YooAsset if (_downloadhanlderAssetBundleOp.Status == EOperationStatus.Succeed) { - _steps = ESteps.Done; - Result = _downloadhanlderAssetBundleOp.Result; - Status = EOperationStatus.Succeed; + var assetBundle = _downloadhanlderAssetBundleOp.Result; + if(assetBundle == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(DownloadHandlerAssetBundleOperation)} loaded asset bundle is null !"; + } + else + { + _steps = ESteps.Done; + Result = new AssetBundleResult(_fileSystem, _bundle, assetBundle, null); + Status = EOperationStatus.Succeed; + } } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs index 1a6e0b13..a726393c 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs @@ -92,18 +92,19 @@ namespace YooAsset } public virtual FSLoadBundleOperation LoadBundleFile(PackageBundle bundle) { - var operation = new DWSFSLoadAssetBundleOperation(this, bundle); - OperationSystem.StartOperation(PackageName, operation); - return operation; - } - public virtual void UnloadBundleFile(PackageBundle bundle, object result) - { - AssetBundle assetBundle = result as AssetBundle; - if (assetBundle == null) - return; - - if (assetBundle != null) - assetBundle.Unload(true); + if (bundle.BundleType == (int)EBuildBundleType.AssetBundle) + { + var operation = new DWSFSLoadAssetBundleOperation(this, bundle); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } + else + { + string error = $"{nameof(DefaultWebServerFileSystem)} not support load bundle type : {bundle.BundleType}"; + var operation = new FSLoadBundleCompleteOperation(error); + OperationSystem.StartOperation(PackageName, operation); + return operation; + } } public virtual void SetParameter(string name, object value) @@ -151,11 +152,15 @@ namespace YooAsset return false; } - public virtual byte[] ReadFileData(PackageBundle bundle) + public virtual string GetBundleFilePath(PackageBundle bundle) { throw new System.NotImplementedException(); } - public virtual string ReadFileText(PackageBundle bundle) + public virtual byte[] ReadBundleFileData(PackageBundle bundle) + { + throw new System.NotImplementedException(); + } + public virtual string ReadBundleFileText(PackageBundle bundle) { throw new System.NotImplementedException(); } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSLoadBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSLoadBundleOperation.cs index a0f6b11d..c908c97d 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSLoadBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/DWSFSLoadBundleOperation.cs @@ -50,9 +50,19 @@ namespace YooAsset if (_downloadhanlderAssetBundleOp.Status == EOperationStatus.Succeed) { - _steps = ESteps.Done; - Result = _downloadhanlderAssetBundleOp.Result; - Status = EOperationStatus.Succeed; + var assetBundle = _downloadhanlderAssetBundleOp.Result; + if (assetBundle == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"{nameof(DownloadHandlerAssetBundleOperation)} loaded asset bundle is null !"; + } + else + { + _steps = ESteps.Done; + Result = new AssetBundleResult(_fileSystem, _bundle, assetBundle, null); + Status = EOperationStatus.Succeed; + } } else { diff --git a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs index 079031c2..e4a9795a 100644 --- a/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/FileSystemParametersDefine.cs @@ -7,7 +7,6 @@ namespace YooAsset public const string REMOTE_SERVICES = "REMOTE_SERVICES"; public const string DECRYPTION_SERVICES = "DECRYPTION_SERVICES"; public const string APPEND_FILE_EXTENSION = "APPEND_FILE_EXTENSION"; - public const string RAW_FILE_BUILD_PIPELINE = "RAW_FILE_BUILD_PIPELINE"; public const string DISABLE_UNITY_WEB_CACHE = "DISABLE_UNITY_WEB_CACHE"; public const string DOWNLOAD_MAX_CONCURRENCY = "DOWNLOAD_MAX_CONCURRENCY"; public const string DOWNLOAD_MAX_REQUEST_PER_FRAME = "DOWNLOAD_MAX_REQUEST_PER_FRAME"; diff --git a/Assets/YooAsset/Runtime/FileSystem/Interface/IFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/Interface/IFileSystem.cs index 8eec9c87..c7df5ccc 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Interface/IFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Interface/IFileSystem.cs @@ -48,12 +48,7 @@ namespace YooAsset /// 加载Bundle文件 /// FSLoadBundleOperation LoadBundleFile(PackageBundle bundle); - - /// - /// 卸载Bundle文件 - /// - void UnloadBundleFile(PackageBundle bundle, object result); - + /// /// 设置自定义参数 @@ -98,13 +93,18 @@ namespace YooAsset /// - /// 读取文件二进制数据 + /// 获取Bundle文件路径 /// - byte[] ReadFileData(PackageBundle bundle); + string GetBundleFilePath(PackageBundle bundle); /// - /// 读取文件文本数据 + /// 读取Bundle文件的二进制数据 /// - string ReadFileText(PackageBundle bundle); + byte[] ReadBundleFileData(PackageBundle bundle); + + /// + /// 读取Bundle文件的文本数据 + /// + string ReadBundleFileText(PackageBundle bundle); } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAllAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAllAssetsOperation.cs new file mode 100644 index 00000000..9250aac8 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAllAssetsOperation.cs @@ -0,0 +1,8 @@ + +namespace YooAsset +{ + internal abstract class FSLoadAllAssetsOperation : AsyncOperationBase + { + public UnityEngine.Object[] Result; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAllAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAllAssetsOperation.cs.meta new file mode 100644 index 00000000..62c5063d --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAllAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45cfe41807608d24dbe5506c8d7b4a9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAssetOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAssetOperation.cs new file mode 100644 index 00000000..8d104412 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAssetOperation.cs @@ -0,0 +1,8 @@ + +namespace YooAsset +{ + internal abstract class FSLoadAssetOperation : AsyncOperationBase + { + public UnityEngine.Object Result; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAssetOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAssetOperation.cs.meta new file mode 100644 index 00000000..51c21395 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadAssetOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 51851bd94e8307d4881ceecc84ee71e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadBundleFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadBundleFileOperation.cs index ccd6e078..135dc792 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadBundleFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadBundleFileOperation.cs @@ -7,7 +7,7 @@ namespace YooAsset /// /// 加载结果 /// - public object Result { protected set; get; } + public BundleResult Result { protected set; get; } /// /// 下载进度 @@ -24,4 +24,25 @@ namespace YooAsset /// public abstract void AbortDownloadOperation(); } + + internal sealed class FSLoadBundleCompleteOperation : FSLoadBundleOperation + { + private readonly string _error; + + internal FSLoadBundleCompleteOperation(string error) + { + _error = error; + } + internal override void InternalOnStart() + { + Status = EOperationStatus.Failed; + Error = _error; + } + internal override void InternalOnUpdate() + { + } + public override void AbortDownloadOperation() + { + } + } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSceneOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSceneOperation.cs new file mode 100644 index 00000000..c6fc5d7a --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSceneOperation.cs @@ -0,0 +1,10 @@ + +namespace YooAsset +{ + internal abstract class FSLoadSceneOperation : AsyncOperationBase + { + public UnityEngine.SceneManagement.Scene Result; + + public abstract void UnSuspendLoad(); + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSceneOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSceneOperation.cs.meta new file mode 100644 index 00000000..a22c7e0a --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSceneOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ad384dede61ad6478cc376d4af598a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSubAssetsOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSubAssetsOperation.cs new file mode 100644 index 00000000..a984c204 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSubAssetsOperation.cs @@ -0,0 +1,8 @@ + +namespace YooAsset +{ + internal abstract class FSLoadSubAssetsOperation : AsyncOperationBase + { + public UnityEngine.Object[] Result; + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSubAssetsOperation.cs.meta b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSubAssetsOperation.cs.meta new file mode 100644 index 00000000..ce5e6a55 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/FSLoadSubAssetsOperation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b44c0a8ba7b4bcd4a9271675db5a5a83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs index 976ebf6b..e37d300b 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DefaultDownloadFileOperation.cs @@ -126,19 +126,5 @@ namespace YooAsset } #endif } - - /// - /// 是否请求的本地文件 - /// - protected bool IsRequestLocalFile() - { - //TODO : UNITY_STANDALONE_OSX平台目前无法确定 - if (Param.MainURL.StartsWith("file:")) - return true; - if (Param.MainURL.StartsWith("jar:file:")) - return true; - - return false; - } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadHandlerAssetBundleOperation.cs b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadHandlerAssetBundleOperation.cs index 2791763e..4ffda656 100644 --- a/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadHandlerAssetBundleOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/Operation/Internal/DownloadHandlerAssetBundleOperation.cs @@ -55,9 +55,19 @@ namespace YooAsset // 检查网络错误 if (CheckRequestResult()) { - _steps = ESteps.Done; - Result = _downloadhandler.assetBundle; - Status = EOperationStatus.Succeed; + var assetBundle = _downloadhandler.assetBundle; + if (assetBundle == null) + { + _steps = ESteps.Done; + Error = "Download handler asset bundle object is null !"; + Status = EOperationStatus.Failed; + } + else + { + _steps = ESteps.Done; + Result = assetBundle; + Status = EOperationStatus.Succeed; + } } else {