diff --git a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs index ac6aefe..40aeda1 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs @@ -387,7 +387,7 @@ namespace YooAsset // 新增下载需求 #if UNITY_WEBGL if (bundleInfo.Bundle.IsRawFile) - loader = new RawBundleFileLoader(this, bundleInfo); + loader = new RawBundleWebLoader(this, bundleInfo); else loader = new AssetBundleWebLoader(this, bundleInfo); #else diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs index a8232eb..efdd1c0 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleFileLoader.cs @@ -300,7 +300,7 @@ namespace YooAsset if (_isShowWaitForAsyncError == false) { _isShowWaitForAsyncError = true; - YooLogger.Error($"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !"); + YooLogger.Error($"{nameof(WaitForAsyncComplete)} failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !"); } break; } diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs index 8e2a3d6..0b21ebd 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/AssetBundleWebLoader.cs @@ -7,6 +7,9 @@ using UnityEngine.Networking; namespace YooAsset { + /// + /// WebGL平台加载器 + /// internal sealed class AssetBundleWebLoader : BundleLoaderBase { private enum ESteps @@ -24,7 +27,6 @@ namespace YooAsset private ESteps _steps = ESteps.None; private float _tryTimer = 0; - private bool _isShowWaitForAsyncError = false; private DownloaderBase _downloader; private UnityWebRequest _webRequest; private AssetBundleCreateRequest _createRequest; @@ -225,10 +227,11 @@ namespace YooAsset /// public override void WaitForAsyncComplete() { - if (_isShowWaitForAsyncError == false) + if (IsDone() == false) { - _isShowWaitForAsyncError = true; - YooLogger.Error($"WebGL platform not support {nameof(WaitForAsyncComplete)} ! Use the async load method instead of the sync load method !"); + Status = EStatus.Failed; + LastError = $"{nameof(WaitForAsyncComplete)} failed ! WebGL platform not support sync load method !"; + YooLogger.Error(LastError); } } } diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs index 1ebf7ff..d2394a2 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleFileLoader.cs @@ -16,7 +16,6 @@ namespace YooAsset } private ESteps _steps = ESteps.None; - private bool _isShowWaitForAsyncError = false; private DownloaderBase _unpacker; private DownloaderBase _downloader; @@ -42,7 +41,7 @@ namespace YooAsset } else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming) { -#if UNITY_ANDROID || UNITY_WEBGL +#if UNITY_ANDROID _steps = ESteps.Unpack; FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath; #else @@ -156,14 +155,15 @@ namespace YooAsset } // 保险机制 - // 注意:如果需要从WEB端下载资源,可能会触发保险机制! + // 注意:如果需要从远端下载资源,可能会触发保险机制! frame--; if (frame == 0) { - if (_isShowWaitForAsyncError == false) + if (IsDone() == false) { - _isShowWaitForAsyncError = true; - YooLogger.Error($"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !"); + Status = EStatus.Failed; + LastError = $"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !"; + YooLogger.Error(LastError); } break; } diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs new file mode 100644 index 0000000..6459873 --- /dev/null +++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs @@ -0,0 +1,151 @@ +using System.IO; + +namespace YooAsset +{ + /// + /// WebGL平台加载器 + /// + internal class RawBundleWebLoader : BundleLoaderBase + { + private enum ESteps + { + None, + Download, + CheckDownload, + Website, + CheckWebsite, + CheckFile, + Done, + } + + private ESteps _steps = ESteps.None; + private DownloaderBase _website; + private DownloaderBase _downloader; + + + public RawBundleWebLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo) + { + } + + /// + /// 轮询更新 + /// + public override void Update() + { + if (_steps == ESteps.Done) + return; + + if (_steps == ESteps.None) + { + if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote) + { + _steps = ESteps.Download; + FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath; + } + else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming) + { + _steps = ESteps.Website; + FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath; + } + else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache) + { + _steps = ESteps.CheckFile; + FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath; + } + else + { + throw new System.NotImplementedException(MainBundleInfo.LoadMode.ToString()); + } + } + + // 1. 下载远端文件 + if (_steps == ESteps.Download) + { + int failedTryAgain = int.MaxValue; + _downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain); + _steps = ESteps.CheckDownload; + } + + // 2. 检测下载结果 + if (_steps == ESteps.CheckDownload) + { + DownloadProgress = _downloader.DownloadProgress; + DownloadedBytes = _downloader.DownloadedBytes; + if (_downloader.IsDone() == false) + return; + + if (_downloader.HasError()) + { + _steps = ESteps.Done; + Status = EStatus.Failed; + LastError = _downloader.GetLastError(); + } + else + { + _steps = ESteps.CheckFile; + } + } + + // 3. 从站点下载 + if (_steps == ESteps.Website) + { + int failedTryAgain = 1; + var bundleInfo = PatchManifestTools.GetUnpackInfo(MainBundleInfo.Bundle); + _website = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain); + _steps = ESteps.CheckWebsite; + } + + // 4. 检测站点下载 + if (_steps == ESteps.CheckWebsite) + { + DownloadProgress = _website.DownloadProgress; + DownloadedBytes = _website.DownloadedBytes; + if (_website.IsDone() == false) + return; + + if (_website.HasError()) + { + _steps = ESteps.Done; + Status = EStatus.Failed; + LastError = _website.GetLastError(); + } + else + { + _steps = ESteps.CheckFile; + } + } + + // 5. 检测结果 + if (_steps == ESteps.CheckFile) + { + // 设置下载进度 + DownloadProgress = 1f; + DownloadedBytes = (ulong)MainBundleInfo.Bundle.FileSize; + + _steps = ESteps.Done; + if (File.Exists(FileLoadPath)) + { + Status = EStatus.Succeed; + } + else + { + Status = EStatus.Failed; + LastError = $"Raw file not found : {FileLoadPath}"; + } + } + } + + /// + /// 主线程等待异步操作完毕 + /// + public override void WaitForAsyncComplete() + { + if (IsDone() == false) + { + Status = EStatus.Failed; + LastError = $"{nameof(WaitForAsyncComplete)} failed ! WebGL platform not support sync load method !"; + YooLogger.Error(LastError); + } + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs.meta b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs.meta new file mode 100644 index 0000000..6420e98 --- /dev/null +++ b/Assets/YooAsset/Runtime/AssetSystem/Loader/RawBundleWebLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1d16b689f73611e44bd01a4cc429a6ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: