From 576b842368d759d896c07a07076dfcca48602152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Wed, 19 Feb 2025 18:27:23 +0800 Subject: [PATCH] support legacy dependency mode YOOASSET_LEGACY_DEPENDENCY --- .../AssetBundleBuilder/BuildParameters.cs | 5 + .../BaseTasks/TaskCreateManifest.cs | 161 +++++++++++++++++- .../BaseTasks/TaskCreateReport.cs | 1 + .../BuildTasks/TaskBuilding_SBP.cs | 4 + .../BuildSystem/BuildContext.cs | 22 ++- .../AssetBundleReporter/ReportSummary.cs | 1 + .../VisualViewers/ReporterSummaryViewer.cs | 3 +- .../Internal/LoadBundleFileOperation.cs | 18 +- .../ResourceManager/ResourceManager.cs | 8 + .../ResourcePackage/Interface/IBundleQuery.cs | 5 + .../Runtime/ResourcePackage/ManifestTools.cs | 6 + .../Internal/DeserializeManifestOperation.cs | 3 + .../Runtime/ResourcePackage/PackageAsset.cs | 11 +- .../Runtime/ResourcePackage/PackageBundle.cs | 14 ++ .../ResourcePackage/PackageManifest.cs | 63 +++++-- .../PlayMode/EditorSimulateModeImpl.cs | 6 + .../PlayMode/HostPlayModeImpl.cs | 6 + .../PlayMode/OfflinePlayModeImpl.cs | 6 + .../PlayMode/WebPlayModeImpl.cs | 6 + .../Runtime/Settings/YooAssetSettings.cs | 2 +- 20 files changed, 317 insertions(+), 34 deletions(-) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs index e701dabe..28a53a26 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs @@ -51,6 +51,11 @@ namespace YooAsset.Editor /// public string PackageNote; + /// + /// 旧版依赖模式 + /// + public bool LegacyDependency = false; + /// /// 清空构建缓存文件 /// diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs index b6979fbe..da1ee066 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs @@ -31,6 +31,7 @@ namespace YooAsset.Editor // 创建新补丁清单 PackageManifest manifest = new PackageManifest(); manifest.FileVersion = YooAssetSettings.ManifestFileVersion; + manifest.LegacyDependency = buildParameters.LegacyDependency; manifest.EnableAddressable = buildMapContext.Command.EnableAddressable; manifest.LocationToLower = buildMapContext.Command.LocationToLower; manifest.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID; @@ -43,8 +44,8 @@ namespace YooAsset.Editor manifest.AssetList = CreatePackageAssetList(buildMapContext); manifest.BundleList = CreatePackageBundleList(buildMapContext); - // 处理资源清单的ID数据 - ProcessPacakgeIDs(manifest); + // 处理资源清单的资源对象 + ProcessPacakgeAsset(manifest); // 处理资源包的依赖列表 if (processBundleDepends) @@ -54,6 +55,14 @@ namespace YooAsset.Editor if (processBundleTags) ProcessBundleTags(manifest); + #region YOOASSET_LEGACY_DEPENDENCY + if (buildParameters.LegacyDependency) + { + if (processBundleDepends) + ProcessLegacyDependency(context, manifest); + } + #endregion + // 创建补丁清单文本文件 { string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion); @@ -137,7 +146,7 @@ namespace YooAsset.Editor packageAsset.AssetPath = assetInfo.AssetInfo.AssetPath; packageAsset.AssetGUID = buildMapContext.Command.IncludeAssetGUID ? assetInfo.AssetInfo.AssetGUID : string.Empty; packageAsset.AssetTags = assetInfo.AssetTags.ToArray(); - packageAsset.BundleNameInEditor = assetInfo.BundleName; + packageAsset.TempDataInEditor = assetInfo; result.Add(packageAsset); } } @@ -165,9 +174,9 @@ namespace YooAsset.Editor } /// - /// 处理资源清单的ID数据 + /// 处理资源清单的资源对象列表 /// - private void ProcessPacakgeIDs(PackageManifest manifest) + private void ProcessPacakgeAsset(PackageManifest manifest) { // 注意:优先缓存资源包索引 for (int index = 0; index < manifest.BundleList.Count; index++) @@ -176,10 +185,11 @@ namespace YooAsset.Editor _cachedBundleIndexIDs.Add(bundleName, index); } + // 记录资源对象所属的资源包ID foreach (var packageAsset in manifest.AssetList) { - string bundleName = packageAsset.BundleNameInEditor; - packageAsset.BundleID = GetCachedBundleIndexID(bundleName); + var assetInfo = packageAsset.TempDataInEditor as BuildAssetInfo; + packageAsset.BundleID = GetCachedBundleIndexID(assetInfo.BundleName); } } @@ -192,7 +202,7 @@ namespace YooAsset.Editor foreach (var packageBundle in manifest.BundleList) { int mainBundleID = GetCachedBundleIndexID(packageBundle.BundleName); - var depends = GetBundleDepends(context, packageBundle.BundleName); + string[] depends = GetBundleDepends(context, packageBundle.BundleName); List dependIDs = new List(depends.Length); foreach (var dependBundleName in depends) { @@ -264,5 +274,140 @@ namespace YooAsset.Editor } return value; } + + /// + /// 是否包含该资源包的索引ID + /// + private bool ContainsCachedBundleIndexID(string bundleName) + { + return _cachedBundleIndexIDs.ContainsKey(bundleName); + } + + #region YOOASSET_LEGACY_DEPENDENCY + private class DependencyQuery + { + private readonly HashSet _dependIDs; + + public DependencyQuery(int[] dependIDs) + { + _dependIDs = new HashSet(dependIDs); + } + public bool Contains(int bundleID) + { + return _dependIDs.Contains(bundleID); + } + } + private void ProcessLegacyDependency(BuildContext context, PackageManifest manifest) + { + foreach (var packageBundle in manifest.BundleList) + { + var dependIDs = packageBundle.DependIDs; + packageBundle.TempDataInEditor = new DependencyQuery(dependIDs); + } + + // 记录资源对象依赖的资源包ID集合 + // 注意:依赖关系非引擎构建结果里查询! + foreach (var packageAsset in manifest.AssetList) + { + var mainAssetInfo = packageAsset.TempDataInEditor as BuildAssetInfo; + packageAsset.DependBundleIDs = GetAssetDependBundleIDs(mainAssetInfo); + } + + // 记录引用该资源包的资源包ID集合 + foreach (var packageBundle in manifest.BundleList) + { + packageBundle.ReferenceBundleIDs = GetBundleReferenceBundleIDs(manifest, packageBundle); + } + + // 注意:如果是可编程构建管线,需要补充内置资源包 + // 注意:该步骤依赖前面的操作! + var buildResultContext = context.TryGetContextObject(); + if (buildResultContext != null) + { + ProcessBuiltinBundleReference(context, manifest, buildResultContext.BuiltinShadersBundleName); + ProcessBuiltinBundleReference(context, manifest, buildResultContext.MonoScriptsBundleName); + } + } + private void ProcessBuiltinBundleReference(BuildContext context, PackageManifest manifest, string builtinBundleName) + { + if (string.IsNullOrEmpty(builtinBundleName)) + return; + + // 查询内置资源包是否存在 + if (ContainsCachedBundleIndexID(builtinBundleName) == false) + return; + + // 获取内置资源包 + int builtinBundleID = GetCachedBundleIndexID(builtinBundleName); + var builtinPackageBundle = manifest.BundleList[builtinBundleID]; + + // 更新依赖资源包ID集合 + HashSet cacheBundleIDs = new HashSet(builtinPackageBundle.ReferenceBundleIDs); + HashSet tempTags = new HashSet(); + foreach (var packageAsset in manifest.AssetList) + { + if (cacheBundleIDs.Contains(packageAsset.BundleID)) + { + if (packageAsset.DependBundleIDs.Contains(builtinBundleID) == false) + { + var tempBundleIDs = new List(packageAsset.DependBundleIDs); + tempBundleIDs.Add(builtinBundleID); + packageAsset.DependBundleIDs = tempBundleIDs.ToArray(); + } + + foreach (var tag in packageAsset.AssetTags) + { + if (tempTags.Contains(tag) == false) + tempTags.Add(tag); + } + } + } + + // 更新内置资源包的标签集合 + foreach (var tag in builtinPackageBundle.Tags) + { + if (tempTags.Contains(tag) == false) + tempTags.Add(tag); + } + builtinPackageBundle.Tags = tempTags.ToArray(); + } + private int[] GetAssetDependBundleIDs(BuildAssetInfo mainAssetInfo) + { + HashSet result = new HashSet(); + int mainBundleID = GetCachedBundleIndexID(mainAssetInfo.BundleName); + foreach (var dependAssetInfo in mainAssetInfo.AllDependAssetInfos) + { + if (dependAssetInfo.HasBundleName()) + { + int bundleID = GetCachedBundleIndexID(dependAssetInfo.BundleName); + if (mainBundleID != bundleID) + { + if (result.Contains(bundleID) == false) + result.Add(bundleID); + } + } + } + return result.ToArray(); + } + private int[] GetBundleReferenceBundleIDs(PackageManifest manifest, PackageBundle queryBundle) + { + int queryBundleID = GetCachedBundleIndexID(queryBundle.BundleName); + List result = new List(); + foreach (var packageBundle in manifest.BundleList) + { + if (packageBundle == queryBundle) + continue; + + var dependencyQuery = packageBundle.TempDataInEditor as DependencyQuery; + if (dependencyQuery.Contains(queryBundleID)) + { + int referenceBundleID = GetCachedBundleIndexID(packageBundle.BundleName); + if (result.Contains(referenceBundleID) == false) + result.Add(referenceBundleID); + } + } + return result.ToArray(); + } + #endregion } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs index 17c5580a..a2aab138 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs @@ -42,6 +42,7 @@ namespace YooAsset.Editor buildReport.Summary.AutoCollectShaders = buildMapContext.Command.AutoCollectShaders; // 构建参数 + buildReport.Summary.LegacyDependency = buildParameters.LegacyDependency; buildReport.Summary.ClearBuildCacheFiles = buildParameters.ClearBuildCacheFiles; buildReport.Summary.UseAssetDependencyDB = buildParameters.UseAssetDependencyDB; buildReport.Summary.EnableSharePackRule = buildParameters.EnableSharePackRule; diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskBuilding_SBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskBuilding_SBP.cs index fb716bcd..78ea9475 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskBuilding_SBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskBuilding_SBP.cs @@ -13,6 +13,8 @@ namespace YooAsset.Editor public class BuildResultContext : IContextObject { public IBundleBuildResults Results; + public string BuiltinShadersBundleName; + public string MonoScriptsBundleName; } void IBuildTask.Run(BuildContext context) @@ -53,6 +55,8 @@ namespace YooAsset.Editor BuildLogger.Log("UnityEngine build success!"); BuildResultContext buildResultContext = new BuildResultContext(); buildResultContext.Results = buildResults; + buildResultContext.BuiltinShadersBundleName = builtinShadersBundleName; + buildResultContext.MonoScriptsBundleName = monoScriptsBundleName; context.SetContextObject(buildResultContext); } } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildContext.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildContext.cs index 668415a1..53603ff0 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildContext.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildSystem/BuildContext.cs @@ -9,7 +9,7 @@ namespace YooAsset.Editor private readonly Dictionary _contextObjects = new Dictionary(); /// - /// 清空所有情景对象 + /// 清空所有上下文对象 /// public void ClearAllContext() { @@ -17,7 +17,7 @@ namespace YooAsset.Editor } /// - /// 设置情景对象 + /// 设置上下文对象 /// public void SetContextObject(IContextObject contextObject) { @@ -32,7 +32,7 @@ namespace YooAsset.Editor } /// - /// 获取情景对象 + /// 获取上下文对象 /// public T GetContextObject() where T : IContextObject { @@ -46,5 +46,21 @@ namespace YooAsset.Editor throw new Exception($"Not found context object : {type}"); } } + + /// + /// 获取上下文对象 + /// + public T TryGetContextObject() where T : IContextObject + { + var type = typeof(T); + if (_contextObjects.TryGetValue(type, out IContextObject contextObject)) + { + return (T)contextObject; + } + else + { + return default; + } + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs index fc54f651..bf13b6fd 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs @@ -67,6 +67,7 @@ namespace YooAsset.Editor public string IgnoreRuleName; // 构建参数 + public bool LegacyDependency; public bool ClearBuildCacheFiles; public bool UseAssetDependencyDB; public bool EnableSharePackRule; diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs index 168c5e6b..9c9ae7c0 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs @@ -75,9 +75,10 @@ namespace YooAsset.Editor _items.Add(new ItemWrapper("Include Asset GUID", $"{buildReport.Summary.IncludeAssetGUID}")); _items.Add(new ItemWrapper("Auto Collect Shaders", $"{buildReport.Summary.AutoCollectShaders}")); _items.Add(new ItemWrapper("Ignore Rule Name", $"{buildReport.Summary.IgnoreRuleName}")); - + _items.Add(new ItemWrapper(string.Empty, string.Empty)); _items.Add(new ItemWrapper("Build Params", string.Empty)); + _items.Add(new ItemWrapper("Legacy Dependency Mode", $"{buildReport.Summary.LegacyDependency}")); _items.Add(new ItemWrapper("Clear Build Cache Files", $"{buildReport.Summary.ClearBuildCacheFiles}")); _items.Add(new ItemWrapper("Use Asset Dependency DB", $"{buildReport.Summary.UseAssetDependencyDB}")); _items.Add(new ItemWrapper("Enable Share Pack Rule", $"{buildReport.Summary.EnableSharePackRule}")); diff --git a/Assets/YooAsset/Runtime/ResourceManager/Operation/Internal/LoadBundleFileOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Operation/Internal/LoadBundleFileOperation.cs index 7d8ac92f..d52d7bd4 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Operation/Internal/LoadBundleFileOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Operation/Internal/LoadBundleFileOperation.cs @@ -153,7 +153,23 @@ namespace YooAsset if (IsDone == false) return false; - return RefCount <= 0; + if (RefCount > 0) + return false; + + #region YOOASSET_LEGACY_DEPENDENCY + // 检查引用链上的资源包是否已经全部销毁 + // 注意:互相引用的资源包无法卸载! + if (LoadBundleInfo.Bundle.ReferenceBundleIDs.Length > 0) + { + foreach (var bundleID in LoadBundleInfo.Bundle.ReferenceBundleIDs) + { + if (_resourceManager.CheckBundleDestroyed(bundleID) == false) + return false; + } + } + #endregion + + return true; } /// diff --git a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs index 53bfa6e8..8535784a 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/ResourceManager.cs @@ -298,6 +298,14 @@ namespace YooAsset ProviderDic.Remove(provider.ProviderGUID); } } + internal bool CheckBundleDestroyed(int bundleID) + { + string bundleName = _bundleQuery.GetMainBundleName(bundleID); + var bundleFileLoader = TryGetBundleFileLoader(bundleName); + if (bundleFileLoader == null) + return true; + return bundleFileLoader.IsDestroyed; + } internal bool HasAnyLoader() { return LoaderDic.Count > 0; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Interface/IBundleQuery.cs b/Assets/YooAsset/Runtime/ResourcePackage/Interface/IBundleQuery.cs index bac81f13..d0cb7013 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Interface/IBundleQuery.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Interface/IBundleQuery.cs @@ -13,6 +13,11 @@ namespace YooAsset /// BundleInfo[] GetDependBundleInfos(AssetInfo assetPath); + /// + /// 获取主资源包名称 + /// + string GetMainBundleName(int bundleID); + /// /// 获取主资源包名称 /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs index fec1db4c..62b24620 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs @@ -35,6 +35,7 @@ namespace YooAsset buffer.WriteUTF8(manifest.FileVersion); // 写入文件头信息 + buffer.WriteBool(manifest.LegacyDependency); buffer.WriteBool(manifest.EnableAddressable); buffer.WriteBool(manifest.LocationToLower); buffer.WriteBool(manifest.IncludeAssetGUID); @@ -55,6 +56,7 @@ namespace YooAsset buffer.WriteUTF8(packageAsset.AssetGUID); buffer.WriteUTF8Array(packageAsset.AssetTags); buffer.WriteInt32(packageAsset.BundleID); + buffer.WriteInt32Array(packageAsset.DependBundleIDs); } // 写入资源包列表 @@ -70,6 +72,7 @@ namespace YooAsset buffer.WriteBool(packageBundle.Encrypted); buffer.WriteUTF8Array(packageBundle.Tags); buffer.WriteInt32Array(packageBundle.DependIDs); + buffer.WriteInt32Array(packageBundle.ReferenceBundleIDs); } // 写入文件流 @@ -108,6 +111,7 @@ namespace YooAsset { // 读取文件头信息 manifest.FileVersion = fileVersion; + manifest.LegacyDependency = buffer.ReadBool(); manifest.EnableAddressable = buffer.ReadBool(); manifest.LocationToLower = buffer.ReadBool(); manifest.IncludeAssetGUID = buffer.ReadBool(); @@ -133,6 +137,7 @@ namespace YooAsset packageAsset.AssetGUID = buffer.ReadUTF8(); packageAsset.AssetTags = buffer.ReadUTF8Array(); packageAsset.BundleID = buffer.ReadInt32(); + packageAsset.DependBundleIDs = buffer.ReadInt32Array(); FillAssetCollection(manifest, packageAsset); } @@ -150,6 +155,7 @@ namespace YooAsset packageBundle.Encrypted = buffer.ReadBool(); packageBundle.Tags = buffer.ReadUTF8Array(); packageBundle.DependIDs = buffer.ReadInt32Array(); + packageBundle.ReferenceBundleIDs = buffer.ReadInt32Array(); FillBundleCollection(manifest, packageBundle); } } diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs index c28017a6..57d7a97d 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs @@ -78,6 +78,7 @@ namespace YooAsset // 读取文件头信息 Manifest = new PackageManifest(); Manifest.FileVersion = fileVersion; + Manifest.LegacyDependency = _buffer.ReadBool(); Manifest.EnableAddressable = _buffer.ReadBool(); Manifest.LocationToLower = _buffer.ReadBool(); Manifest.IncludeAssetGUID = _buffer.ReadBool(); @@ -112,6 +113,7 @@ namespace YooAsset packageAsset.AssetGUID = _buffer.ReadUTF8(); packageAsset.AssetTags = _buffer.ReadUTF8Array(); packageAsset.BundleID = _buffer.ReadInt32(); + packageAsset.DependBundleIDs = _buffer.ReadInt32Array(); ManifestTools.FillAssetCollection(Manifest, packageAsset); _packageAssetCount--; @@ -146,6 +148,7 @@ namespace YooAsset packageBundle.Encrypted = _buffer.ReadBool(); packageBundle.Tags = _buffer.ReadUTF8Array(); packageBundle.DependIDs = _buffer.ReadInt32Array(); + packageBundle.ReferenceBundleIDs = _buffer.ReadInt32Array(); ManifestTools.FillBundleCollection(Manifest, packageBundle); _packageBundleCount--; diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs index fb5d40b7..7eff1eab 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageAsset.cs @@ -31,11 +31,18 @@ namespace YooAsset /// public int BundleID; + #region YOOASSET_LEGACY_DEPENDENCY /// - /// 所属资源包名称(仅编辑器有效) + /// 依赖的资源包列表 + /// + public int[] DependBundleIDs; + #endregion + + /// + /// 临时数据对象(仅编辑器有效) /// [NonSerialized] - public string BundleNameInEditor; + public object TempDataInEditor; /// /// 是否包含Tag diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs index 61060978..4bd00a92 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageBundle.cs @@ -47,6 +47,14 @@ namespace YooAsset /// public int[] DependIDs; + #region YOOASSET_LEGACY_DEPENDENCY + /// + /// 引用该资源包的资源包列表 + /// 说明:谁引用了该资源包 + /// + public int[] ReferenceBundleIDs; + #endregion + /// /// 资源包GUID /// @@ -101,6 +109,12 @@ namespace YooAsset [NonSerialized] public readonly List IncludeMainAssets = new List(10); + /// + /// 临时数据对象(仅编辑器有效) + /// + [NonSerialized] + public object TempDataInEditor; + public PackageBundle() { diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs index cb2cbf7f..f9dfa8d7 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs @@ -17,6 +17,11 @@ namespace YooAsset /// public string FileVersion; + /// + /// 旧版依赖模式 + /// + public bool LegacyDependency; + /// /// 启用可寻址资源定位 /// @@ -155,16 +160,7 @@ namespace YooAsset { if (AssetDic.TryGetValue(assetPath, out PackageAsset packageAsset)) { - int bundleID = packageAsset.BundleID; - if (bundleID >= 0 && bundleID < BundleList.Count) - { - var packageBundle = BundleList[bundleID]; - return packageBundle; - } - else - { - throw new Exception($"Invalid bundle id : {bundleID} Asset path : {assetPath}"); - } + return GetMainPackageBundle(packageAsset.BundleID); } else { @@ -172,27 +168,58 @@ namespace YooAsset } } + /// + /// 获取主资源包 + /// 注意:传入的资源包ID一定合法有效! + /// + public PackageBundle GetMainPackageBundle(int bundleID) + { + if (bundleID >= 0 && bundleID < BundleList.Count) + { + var packageBundle = BundleList[bundleID]; + return packageBundle; + } + else + { + throw new Exception($"Invalid bundle id : {bundleID}"); + } + } + /// /// 获取资源依赖列表 /// 注意:传入的资源路径一定合法有效! /// public PackageBundle[] GetAllDependencies(string assetPath) { - var packageBundle = GetMainPackageBundle(assetPath); - List result = new List(packageBundle.DependIDs.Length); - foreach (var dependID in packageBundle.DependIDs) + // YOOASSET_LEGACY_DEPENDENCY + if (LegacyDependency) { - if (dependID >= 0 && dependID < BundleList.Count) + if (TryGetPackageAsset(assetPath, out PackageAsset packageAsset)) { - var dependBundle = BundleList[dependID]; - result.Add(dependBundle); + List result = new List(packageAsset.DependBundleIDs.Length); + foreach (var dependID in packageAsset.DependBundleIDs) + { + var dependBundle = GetMainPackageBundle(dependID); + result.Add(dependBundle); + } + return result.ToArray(); } else { - throw new Exception($"Invalid bundle id : {dependID} Asset path : {assetPath}"); + throw new Exception("Should never get here !"); } } - return result.ToArray(); + else + { + var packageBundle = GetMainPackageBundle(assetPath); + List result = new List(packageBundle.DependIDs.Length); + foreach (var dependID in packageBundle.DependIDs) + { + var dependBundle = GetMainPackageBundle(dependID); + result.Add(dependBundle); + } + return result.ToArray(); + } } /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs index 50e12845..69f1a055 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs @@ -135,6 +135,12 @@ namespace YooAsset } return result.ToArray(); } + string IBundleQuery.GetMainBundleName(int bundleID) + { + // 注意:如果清单里未找到资源包会抛出异常! + var packageBundle = ActiveManifest.GetMainPackageBundle(bundleID); + return packageBundle.BundleName; + } string IBundleQuery.GetMainBundleName(AssetInfo assetInfo) { if (assetInfo.IsInvalid) diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs index 759ab004..7debfd20 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs @@ -144,6 +144,12 @@ namespace YooAsset } return result.ToArray(); } + string IBundleQuery.GetMainBundleName(int bundleID) + { + // 注意:如果清单里未找到资源包会抛出异常! + var packageBundle = ActiveManifest.GetMainPackageBundle(bundleID); + return packageBundle.BundleName; + } string IBundleQuery.GetMainBundleName(AssetInfo assetInfo) { if (assetInfo.IsInvalid) diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs index 8e34a34b..93918d11 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs @@ -135,6 +135,12 @@ namespace YooAsset } return result.ToArray(); } + string IBundleQuery.GetMainBundleName(int bundleID) + { + // 注意:如果清单里未找到资源包会抛出异常! + var packageBundle = ActiveManifest.GetMainPackageBundle(bundleID); + return packageBundle.BundleName; + } string IBundleQuery.GetMainBundleName(AssetInfo assetInfo) { if (assetInfo.IsInvalid) diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs index f280b145..03a6c2c0 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs @@ -163,6 +163,12 @@ namespace YooAsset } return result.ToArray(); } + string IBundleQuery.GetMainBundleName(int bundleID) + { + // 注意:如果清单里未找到资源包会抛出异常! + var packageBundle = ActiveManifest.GetMainPackageBundle(bundleID); + return packageBundle.BundleName; + } string IBundleQuery.GetMainBundleName(AssetInfo assetInfo) { if (assetInfo.IsInvalid) diff --git a/Assets/YooAsset/Runtime/Settings/YooAssetSettings.cs b/Assets/YooAsset/Runtime/Settings/YooAssetSettings.cs index 52da20f9..22928753 100644 --- a/Assets/YooAsset/Runtime/Settings/YooAssetSettings.cs +++ b/Assets/YooAsset/Runtime/Settings/YooAssetSettings.cs @@ -29,7 +29,7 @@ namespace YooAsset /// /// 清单文件格式版本 /// - public const string ManifestFileVersion = "2.2.5"; + public const string ManifestFileVersion = "2.3.0"; ///