diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCopyBuildinFiles_BBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCopyBuildinFiles_BBP.cs index 28e6c420..24850b08 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCopyBuildinFiles_BBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCopyBuildinFiles_BBP.cs @@ -15,6 +15,7 @@ namespace YooAsset.Editor if (buildParametersContext.Parameters.BuildinFileCopyOption != EBuildinFileCopyOption.None) { CopyBuildinFilesToStreaming(buildParametersContext, manifestContext.Manifest); + DefaultBuildinFileSystemBuild.ExportBuildinCatalogFile(); } } } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCopyBuildinFiles_RFBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCopyBuildinFiles_RFBP.cs index 037d19eb..849331f6 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCopyBuildinFiles_RFBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCopyBuildinFiles_RFBP.cs @@ -16,6 +16,7 @@ namespace YooAsset.Editor if (buildParameters.BuildinFileCopyOption != EBuildinFileCopyOption.None) { CopyBuildinFilesToStreaming(buildParametersContext, manifestContext.Manifest); + DefaultBuildinFileSystemBuild.ExportBuildinCatalogFile(); } } } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCopyBuildinFiles_SBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCopyBuildinFiles_SBP.cs index aa95380f..7060c443 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCopyBuildinFiles_SBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCopyBuildinFiles_SBP.cs @@ -15,6 +15,7 @@ namespace YooAsset.Editor if (buildParametersContext.Parameters.BuildinFileCopyOption != EBuildinFileCopyOption.None) { CopyBuildinFilesToStreaming(buildParametersContext, manifestContext.Manifest); + DefaultBuildinFileSystemBuild.ExportBuildinCatalogFile(); } } } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs index bc991a86..8a501687 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs @@ -1,13 +1,13 @@ using System; using System.Collections.Generic; -using UnityEngine; namespace YooAsset { /// /// 内置资源清单目录 /// - internal class DefaultBuildinFileCatalog : ScriptableObject + [Serializable] + internal class DefaultBuildinFileCatalog { [Serializable] public class FileWrapper diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs index f3c12cb8..9261f263 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs @@ -338,8 +338,8 @@ namespace YooAsset } public string GetCatalogFileLoadPath() { - string fileName = Path.GetFileNameWithoutExtension(DefaultBuildinFileSystemDefine.BuildinCatalogFileName); - return YooAssetSettingsData.GetYooResourcesLoadPath(PackageName, fileName); + string fileName = DefaultBuildinFileSystemDefine.BuildinCatalogFileName; + return PathUtility.Combine(YooAssetSettingsData.GetRequestYooDefaultBuildinRoot(), PackageName, fileName); } /// diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs index b117f411..dcd72847 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs @@ -5,22 +5,16 @@ using UnityEngine; namespace YooAsset { - public class DefaultBuildinFileSystemBuild : UnityEditor.Build.IPreprocessBuildWithReport + public class DefaultBuildinFileSystemBuild { - public int callbackOrder { get { return 0; } } - /// - /// 在构建应用程序前自动生成内置资源目录文件。 - /// 原理:搜索StreamingAssets目录下的所有资源文件,然后将这些文件信息写入文件,并存储在Resources目录下。 + /// 输出包裹的内置资源目录文件 /// - public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report) + /// + public static void ExportBuildinCatalogFile() { YooLogger.Log("Begin to create catalog file !"); - string savePath = YooAssetSettingsData.GetYooResourcesFullPath(); - if (UnityEditor.AssetDatabase.DeleteAsset(savePath)) - UnityEditor.AssetDatabase.Refresh(); - string rootPath = YooAssetSettingsData.GetYooDefaultBuildinRoot(); DirectoryInfo rootDirectory = new DirectoryInfo(rootPath); if (rootDirectory.Exists == false) @@ -87,7 +81,7 @@ namespace YooAsset } // 创建内置清单实例 - var buildinFileCatalog = ScriptableObject.CreateInstance(); + var buildinFileCatalog = new DefaultBuildinFileCatalog(); buildinFileCatalog.PackageName = packageName; buildinFileCatalog.PackageVersion = packageVersion; @@ -111,6 +105,8 @@ namespace YooAsset continue; if (fileInfo.Name == $"{packageName}_{packageVersion}.report") continue; + if (fileInfo.Name == DefaultBuildinFileSystemDefine.BuildinCatalogFileName) + continue; string fileName = fileInfo.Name; if (fileMapping.TryGetValue(fileName, out string bundleGUID)) @@ -125,18 +121,13 @@ namespace YooAsset } // 创建输出目录 - string fullPath = YooAssetSettingsData.GetYooResourcesFullPath(); + string fullPath = YooAssetSettingsData.GetYooDefaultBuildinRoot(); string saveFilePath = $"{fullPath}/{packageName}/{DefaultBuildinFileSystemDefine.BuildinCatalogFileName}"; FileUtility.CreateFileDirectory(saveFilePath); // 创建输出文件 - UnityEditor.AssetDatabase.CreateAsset(buildinFileCatalog, saveFilePath); - UnityEditor.EditorUtility.SetDirty(buildinFileCatalog); -#if UNITY_2019 - UnityEditor.AssetDatabase.SaveAssets(); -#else - UnityEditor.AssetDatabase.SaveAssetIfDirty(buildinFileCatalog); -#endif + File.WriteAllText(saveFilePath, JsonUtility.ToJson(buildinFileCatalog, false)); + UnityEditor.AssetDatabase.Refresh(); Debug.Log($"Succeed to save buildin file catalog : {saveFilePath}"); return true; diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs index 876e01d2..5a70375b 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs @@ -6,6 +6,6 @@ namespace YooAsset /// /// 内置清单文件名称 /// - public const string BuildinCatalogFileName = "BuildinCatalog.asset"; + public const string BuildinCatalogFileName = "BuildinCatalog.json"; } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs index 3490e52c..85daf173 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs @@ -1,4 +1,5 @@ using UnityEngine; +using UnityEngine.Networking; namespace YooAsset { @@ -8,9 +9,11 @@ namespace YooAsset { None, LoadCatalog, + WaitForRequest, Done, } + private UnityWebRequest _request; private readonly DefaultBuildinFileSystem _fileSystem; private ESteps _steps = ESteps.None; @@ -28,12 +31,39 @@ namespace YooAsset if (_steps == ESteps.None || _steps == ESteps.Done) return; + string catalogFilePath = _fileSystem.GetCatalogFileLoadPath(); + if (_steps == ESteps.LoadCatalog) { - string catalogFilePath = _fileSystem.GetCatalogFileLoadPath(); - var catalog = Resources.Load(catalogFilePath); + _request = UnityWebRequest.Get(catalogFilePath); + _request.SendWebRequest(); + _steps = ESteps.WaitForRequest; + return; + } + + if (_steps == ESteps.WaitForRequest) + { + // 等待请求完成 + if (!_request.isDone) + return; + + if (_request.result != UnityWebRequest.Result.Success) + { + _request.Dispose(); + _request = null; + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Failed to load catalog file: {_request.error}"; + return; + } + + // 解析 JSON + string jsonText = _request.downloadHandler.text; + var catalog = JsonUtility.FromJson(jsonText); if (catalog == null) { + _request.Dispose(); + _request = null; _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"Failed to load catalog file : {catalogFilePath}"; @@ -42,6 +72,8 @@ namespace YooAsset if (catalog.PackageName != _fileSystem.PackageName) { + _request.Dispose(); + _request = null; _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"Catalog file package name {catalog.PackageName} cannot match the file system package name {_fileSystem.PackageName}"; @@ -55,6 +87,8 @@ namespace YooAsset } YooLogger.Log($"Package '{_fileSystem.PackageName}' buildin catalog files count : {catalog.Wrappers.Count}"); + _request.Dispose(); + _request = null; _steps = ESteps.Done; Status = EOperationStatus.Succeed; } diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs index 2b3b4f6b..77534af1 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs @@ -3,6 +3,7 @@ using System.IO; using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Networking; namespace YooAsset { @@ -12,9 +13,11 @@ namespace YooAsset { None, LoadCatalog, + WaitForRequest, Done, } + private UnityWebRequest _request; private readonly DefaultWebServerFileSystem _fileSystem; private ESteps _steps = ESteps.None; @@ -36,12 +39,39 @@ namespace YooAsset if (_steps == ESteps.None || _steps == ESteps.Done) return; + string catalogFilePath = _fileSystem.GetCatalogFileLoadPath(); + if (_steps == ESteps.LoadCatalog) { - string catalogFilePath = _fileSystem.GetCatalogFileLoadPath(); - var catalog = Resources.Load(catalogFilePath); + _request = UnityWebRequest.Get(catalogFilePath); + _request.SendWebRequest(); + _steps = ESteps.WaitForRequest; + return; + } + + if (_steps == ESteps.WaitForRequest) + { + // 等待请求完成 + if (!_request.isDone) + return; + + if (_request.result != UnityWebRequest.Result.Success) + { + _request.Dispose(); + _request = null; + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Failed to load web server catalog file: {_request.error}"; + return; + } + + // 解析 JSON + string jsonText = _request.downloadHandler.text; + var catalog = JsonUtility.FromJson(jsonText); if (catalog == null) { + _request.Dispose(); + _request = null; _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"Failed to load web server catalog file : {catalogFilePath}"; @@ -50,6 +80,8 @@ namespace YooAsset if (catalog.PackageName != _fileSystem.PackageName) { + _request.Dispose(); + _request = null; _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"Web server catalog file package name {catalog.PackageName} cannot match the file system package name {_fileSystem.PackageName}"; @@ -64,6 +96,8 @@ namespace YooAsset } YooLogger.Log($"Package '{_fileSystem.PackageName}' catalog files count : {catalog.Wrappers.Count}"); + _request.Dispose(); + _request = null; _steps = ESteps.Done; Status = EOperationStatus.Succeed; } diff --git a/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs b/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs index 6ea1560b..3d24e9f0 100644 --- a/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs +++ b/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs @@ -220,6 +220,26 @@ namespace YooAsset else return PathUtility.Combine(Application.streamingAssetsPath, Setting.DefaultYooFolderName); } + + internal static string GetRequestYooDefaultBuildinRoot() + { + if (string.IsNullOrEmpty(Setting.DefaultYooFolderName)) + return GetRequestStreamingAssetsPath(); + else + return PathUtility.Combine(GetRequestStreamingAssetsPath(), Setting.DefaultYooFolderName); + } + + /// + /// 获取UnityWebRequest StreamingAssets的路径 (OSX and iOS 需要加 file://) + /// + internal static string GetRequestStreamingAssetsPath() + { +#if UNITY_STANDALONE_OSX || UNITY_IOS + return $"file://{Application.streamingAssetsPath}"; +#else + return Application.streamingAssetsPath; +#endif + } #endregion } } \ No newline at end of file