From 014b17f5cb84fbc024fe4b86acc172c067da94bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= Date: Thu, 9 Oct 2025 16:14:31 +0800 Subject: [PATCH] feat #643 --- .../AssetBundleBuilder/BuildBundleInfo.cs | 26 ++++++++++++- .../AssetBundleBuilder/BuildMapContext.cs | 4 +- .../BaseTasks/TaskCreateManifest.cs | 12 ++++-- .../BaseTasks/TaskCreateReport.cs | 2 + .../BuildTasks/TaskBuilding_BBP.cs | 3 +- .../BuildTasks/TaskCreateManifest_BBP.cs | 5 ++- .../BuiltinBuildParameters.cs | 6 +++ .../BuildTasks/TaskCreateManifest_ESBP.cs | 2 +- .../BuildTasks/TaskCreateManifest_RFBP.cs | 2 +- .../BuildTasks/TaskBuilding_SBP.cs | 3 +- .../BuildTasks/TaskCreateManifest_SBP.cs | 5 ++- .../ScriptableBuildParameters.cs | 6 +++ .../AssetBundleReporter/ReportSummary.cs | 1 + .../VisualViewers/ReporterSummaryViewer.cs | 1 + .../Runtime/ResourcePackage/ManifestDefine.cs | 9 ++++- .../Runtime/ResourcePackage/ManifestTools.cs | 35 +---------------- .../Internal/DeserializeManifestOperation.cs | 36 +++++++++++++++--- .../Runtime/ResourcePackage/PackageDetail.cs | 5 +++ .../ResourcePackage/PackageManifest.cs | 38 +++++++++++++++++++ .../YooAsset/Runtime/Utility/BufferReader.cs | 9 +++++ 20 files changed, 156 insertions(+), 54 deletions(-) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs index fee3181c..3d04bcb1 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildBundleInfo.cs @@ -106,7 +106,27 @@ namespace YooAsset.Editor /// public string[] GetAllPackAssetPaths() { - return AllPackAssets.Select(t => t.AssetInfo.AssetPath).ToArray(); + List results = new List(AllPackAssets.Count); + for (int i = 0; i < AllPackAssets.Count; i++) + { + var packAsset = AllPackAssets[i]; + results.Add(packAsset.AssetInfo.AssetPath); + } + return results.ToArray(); + } + + /// + /// 获取构建的资源可寻址列表 + /// + public string[] GetAllPackAssetAddress() + { + List results = new List(AllPackAssets.Count); + for (int i = 0; i < AllPackAssets.Count; i++) + { + var packAsset = AllPackAssets[i]; + results.Add(packAsset.Address); + } + return results.ToArray(); } /// @@ -153,13 +173,15 @@ namespace YooAsset.Editor /// /// 创建AssetBundleBuild类 /// - public UnityEditor.AssetBundleBuild CreatePipelineBuild() + public UnityEditor.AssetBundleBuild CreatePipelineBuild(bool replaceAssetPathWithAddress) { // 注意:我们不再支持AssetBundle的变种机制 AssetBundleBuild build = new AssetBundleBuild(); build.assetBundleName = BundleName; build.assetBundleVariant = string.Empty; build.assetNames = GetAllPackAssetPaths(); + if (replaceAssetPathWithAddress) + build.addressableNames = GetAllPackAssetAddress(); return build; } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs index b2b1455c..d33e05c0 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs @@ -96,12 +96,12 @@ namespace YooAsset.Editor /// /// 获取构建管线里需要的数据 /// - public UnityEditor.AssetBundleBuild[] GetPipelineBuilds() + public UnityEditor.AssetBundleBuild[] GetPipelineBuilds(bool replaceAssetPathWithAddres) { List builds = new List(_bundleInfoDic.Count); foreach (var bundleInfo in _bundleInfoDic.Values) { - builds.Add(bundleInfo.CreatePipelineBuild()); + builds.Add(bundleInfo.CreatePipelineBuild(replaceAssetPathWithAddres)); } return builds.ToArray(); } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs index 5ea564a8..af912fd6 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs @@ -19,7 +19,7 @@ namespace YooAsset.Editor /// /// 创建补丁清单文件到输出目录 /// - protected void CreateManifestFile(bool processBundleDepends, bool processBundleTags, BuildContext context) + protected void CreateManifestFile(bool processBundleDepends, bool processBundleTags, bool replaceAssetPathWithAddress, BuildContext context) { var buildMapContext = context.GetContextObject(); var buildParametersContext = context.GetContextObject(); @@ -36,6 +36,7 @@ namespace YooAsset.Editor manifest.SupportExtensionless = buildMapContext.Command.SupportExtensionless; manifest.LocationToLower = buildMapContext.Command.LocationToLower; manifest.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID; + manifest.ReplaceAssetPathWithAddress = replaceAssetPathWithAddress; manifest.OutputNameStyle = (int)buildParameters.FileNameStyle; manifest.BuildBundleType = buildParameters.BuildBundleType; manifest.BuildPipeline = buildParameters.BuildPipeline; @@ -58,7 +59,13 @@ namespace YooAsset.Editor // 4. 处理内置资源包 if (processBundleDepends) + { + // 注意:初始化资源清单建立引用关系 + manifest.Initialize(); + ProcessBuiltinBundleDependency(context, manifest); + } + // 创建资源清单文本文件 { @@ -302,9 +309,6 @@ namespace YooAsset.Editor #region YOOASSET_LEGACY_DEPENDENCY private void ProcessBuiltinBundleDependency(BuildContext context, PackageManifest manifest) { - // 注意:初始化资源清单建立引用关系 - ManifestTools.InitManifest(manifest); - // 注意:如果是可编程构建管线,需要补充内置资源包 // 注意:该步骤依赖前面的操作! var buildResultContext = context.TryGetContextObject(); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs index ac906845..21ed09d1 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs @@ -54,6 +54,7 @@ namespace YooAsset.Editor buildReport.Summary.CompressOption = builtinBuildParameters.CompressOption; buildReport.Summary.DisableWriteTypeTree = builtinBuildParameters.DisableWriteTypeTree; buildReport.Summary.IgnoreTypeTreeChanges = builtinBuildParameters.IgnoreTypeTreeChanges; + buildReport.Summary.ReplaceAssetPathWithAddress = builtinBuildParameters.ReplaceAssetPathWithAddress; } else if (buildParameters is ScriptableBuildParameters) { @@ -61,6 +62,7 @@ namespace YooAsset.Editor buildReport.Summary.CompressOption = scriptableBuildParameters.CompressOption; buildReport.Summary.DisableWriteTypeTree = scriptableBuildParameters.DisableWriteTypeTree; buildReport.Summary.IgnoreTypeTreeChanges = scriptableBuildParameters.IgnoreTypeTreeChanges; + buildReport.Summary.ReplaceAssetPathWithAddress = scriptableBuildParameters.ReplaceAssetPathWithAddress; buildReport.Summary.WriteLinkXML = scriptableBuildParameters.WriteLinkXML; buildReport.Summary.CacheServerHost = scriptableBuildParameters.CacheServerHost; buildReport.Summary.CacheServerPort = scriptableBuildParameters.CacheServerPort; diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskBuilding_BBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskBuilding_BBP.cs index 83709a9e..721a8da7 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskBuilding_BBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskBuilding_BBP.cs @@ -23,7 +23,8 @@ namespace YooAsset.Editor // 开始构建 string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory(); BuildAssetBundleOptions buildOptions = builtinBuildParameters.GetBundleBuildOptions(); - AssetBundleManifest unityManifest = BuildPipeline.BuildAssetBundles(pipelineOutputDirectory, buildMapContext.GetPipelineBuilds(), buildOptions, buildParametersContext.Parameters.BuildTarget); + var bundleBuilds = buildMapContext.GetPipelineBuilds(builtinBuildParameters.ReplaceAssetPathWithAddress); + AssetBundleManifest unityManifest = BuildPipeline.BuildAssetBundles(pipelineOutputDirectory, bundleBuilds, buildOptions, buildParametersContext.Parameters.BuildTarget); if (unityManifest == null) { string message = BuildLogger.GetErrorMessage(ErrorCode.UnityEngineBuildFailed, "UnityEngine build failed !"); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCreateManifest_BBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCreateManifest_BBP.cs index ea5f468c..d3736e6f 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCreateManifest_BBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuildTasks/TaskCreateManifest_BBP.cs @@ -11,7 +11,10 @@ namespace YooAsset.Editor void IBuildTask.Run(BuildContext context) { - CreateManifestFile(true, true, context); + var buildParametersContext = context.GetContextObject(); + var builtinBuildParameters = buildParametersContext.Parameters as BuiltinBuildParameters; + bool replaceAssetPathWithAddress = builtinBuildParameters.ReplaceAssetPathWithAddress; + CreateManifestFile(true, true, replaceAssetPathWithAddress, context); } protected override string[] GetBundleDepends(BuildContext context, string bundleName) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuiltinBuildParameters.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuiltinBuildParameters.cs index 4a4ce6c2..f4ebad67 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuiltinBuildParameters.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BuiltinBuildPipeline/BuiltinBuildParameters.cs @@ -27,6 +27,12 @@ namespace YooAsset.Editor /// public bool IgnoreTypeTreeChanges = true; + /// + /// 使用可寻址地址代替资源路径 + /// 说明:开启此项可以节省运行时清单占用的内存! + /// + public bool ReplaceAssetPathWithAddress = false; + /// /// 获取内置构建管线的构建选项 diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/EditorSimulateBuildPipeline/BuildTasks/TaskCreateManifest_ESBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/EditorSimulateBuildPipeline/BuildTasks/TaskCreateManifest_ESBP.cs index 2ce98213..e75d3e89 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/EditorSimulateBuildPipeline/BuildTasks/TaskCreateManifest_ESBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/EditorSimulateBuildPipeline/BuildTasks/TaskCreateManifest_ESBP.cs @@ -7,7 +7,7 @@ namespace YooAsset.Editor { void IBuildTask.Run(BuildContext context) { - CreateManifestFile(false, false, context); + CreateManifestFile(false, false, false, context); } protected override string[] GetBundleDepends(BuildContext context, string bundleName) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCreateManifest_RFBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCreateManifest_RFBP.cs index e34dbe90..7379e106 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCreateManifest_RFBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/RawFileBuildPipeline/BuildTasks/TaskCreateManifest_RFBP.cs @@ -9,7 +9,7 @@ namespace YooAsset.Editor { void IBuildTask.Run(BuildContext context) { - CreateManifestFile(false, true, context); + CreateManifestFile(false, true, false, context); } protected override string[] GetBundleDepends(BuildContext context, string bundleName) 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 78ea9475..e77ea8e4 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskBuilding_SBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskBuilding_SBP.cs @@ -24,7 +24,8 @@ namespace YooAsset.Editor var scriptableBuildParameters = buildParametersContext.Parameters as ScriptableBuildParameters; // 构建内容 - var buildContent = new BundleBuildContent(buildMapContext.GetPipelineBuilds()); + var bundleBuilds = buildMapContext.GetPipelineBuilds(scriptableBuildParameters.ReplaceAssetPathWithAddress); + var buildContent = new BundleBuildContent(bundleBuilds); // 开始构建 IBundleBuildResults buildResults; diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCreateManifest_SBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCreateManifest_SBP.cs index 9c3b9837..053d3cf6 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCreateManifest_SBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/BuildTasks/TaskCreateManifest_SBP.cs @@ -13,7 +13,10 @@ namespace YooAsset.Editor void IBuildTask.Run(BuildContext context) { - CreateManifestFile(true, true, context); + var buildParametersContext = context.GetContextObject(); + var scriptableBuildParameters = buildParametersContext.Parameters as ScriptableBuildParameters; + bool replaceAssetPathWithAddress = scriptableBuildParameters.ReplaceAssetPathWithAddress; + CreateManifestFile(true, true, replaceAssetPathWithAddress, context); } protected override string[] GetBundleDepends(BuildContext context, string bundleName) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/ScriptableBuildParameters.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/ScriptableBuildParameters.cs index e827c644..69acb4d6 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/ScriptableBuildParameters.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/ScriptableBuildPipeline/ScriptableBuildParameters.cs @@ -29,6 +29,12 @@ namespace YooAsset.Editor /// public bool IgnoreTypeTreeChanges = true; + /// + /// 使用可寻址地址代替资源路径 + /// 说明:开启此项可以节省运行时清单占用的内存! + /// + public bool ReplaceAssetPathWithAddress = false; + /// /// 自动建立资源对象对图集的依赖关系 /// diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs index d4163368..858793dd 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/ReportSummary.cs @@ -81,6 +81,7 @@ namespace YooAsset.Editor public ECompressOption CompressOption; public bool DisableWriteTypeTree; public bool IgnoreTypeTreeChanges; + public bool ReplaceAssetPathWithAddress; public bool WriteLinkXML = true; public string CacheServerHost; public int CacheServerPort; diff --git a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs index c2a1cb95..0167e17c 100644 --- a/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs +++ b/Assets/YooAsset/Editor/AssetBundleReporter/VisualViewers/ReporterSummaryViewer.cs @@ -74,6 +74,7 @@ namespace YooAsset.Editor BindListViewItem("CompressOption", $"{buildReport.Summary.CompressOption}"); BindListViewItem("DisableWriteTypeTree", $"{buildReport.Summary.DisableWriteTypeTree}"); BindListViewItem("IgnoreTypeTreeChanges", $"{buildReport.Summary.IgnoreTypeTreeChanges}"); + BindListViewItem("ReplaceAssetPathWithAddress", $"{buildReport.Summary.ReplaceAssetPathWithAddress}"); BindListViewItem(string.Empty, string.Empty); BindListViewHeader("Build Results"); diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestDefine.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestDefine.cs index 9cbe829a..91a9e93f 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestDefine.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestDefine.cs @@ -16,6 +16,13 @@ namespace YooAsset /// /// 文件格式版本 /// - public const string FileVersion = "2025.8.28"; + public const string FileVersion = "2025.9.30"; + public const string VERSION_2025_8_28 = "2025.8.28"; + public const string VERSION_2025_9_30 = "2025.9.30"; + + /// + /// 版本兼容 + /// + public const bool BackwardCompatible = true; } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs index b388d95d..f27792e8 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs @@ -62,6 +62,7 @@ namespace YooAsset buffer.WriteBool(manifest.SupportExtensionless); buffer.WriteBool(manifest.LocationToLower); buffer.WriteBool(manifest.IncludeAssetGUID); + buffer.WriteBool(manifest.ReplaceAssetPathWithAddress); buffer.WriteInt32(manifest.OutputNameStyle); buffer.WriteInt32(manifest.BuildBundleType); buffer.WriteUTF8(manifest.BuildPipeline); @@ -129,7 +130,7 @@ namespace YooAsset } // 初始化资源清单 - InitManifest(manifest); + manifest.Initialize(); return manifest; } @@ -144,38 +145,6 @@ namespace YooAsset return operation.Manifest; } - /// - /// 初始化资源清单 - /// - public static void InitManifest(PackageManifest manifest) - { - // 填充资源包内包含的主资源列表 - foreach (var packageAsset in manifest.AssetList) - { - int bundleID = packageAsset.BundleID; - if (bundleID >= 0 && bundleID < manifest.BundleList.Count) - { - var packageBundle = manifest.BundleList[bundleID]; - packageBundle.IncludeMainAssets.Add(packageAsset); - } - else - { - throw new Exception($"Invalid bundle id : {bundleID} Asset path : {packageAsset.AssetPath}"); - } - } - - // 填充资源包引用关系 - for (int index = 0; index < manifest.BundleList.Count; index++) - { - var sourceBundle = manifest.BundleList[index]; - foreach (int dependIndex in sourceBundle.DependBundleIDs) - { - var dependBundle = manifest.BundleList[dependIndex]; - dependBundle.AddReferenceBundleID(index); - } - } - } - /// /// 获取资源文件的后缀名 /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs index 66ac23a6..238b9ce6 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/DeserializeManifestOperation.cs @@ -84,7 +84,10 @@ namespace YooAsset // 读取文件版本 string fileVersion = _buffer.ReadUTF8(); - if (fileVersion != ManifestDefine.FileVersion) + Version fileVer = new Version(fileVersion); + Version ver2025_8_28 = new Version(ManifestDefine.VERSION_2025_8_28); + Version ver2025_9_30 = new Version(ManifestDefine.VERSION_2025_9_30); + if (fileVer < ver2025_8_28) { _steps = ESteps.Done; Status = EOperationStatus.Failed; @@ -99,6 +102,10 @@ namespace YooAsset Manifest.SupportExtensionless = _buffer.ReadBool(); Manifest.LocationToLower = _buffer.ReadBool(); Manifest.IncludeAssetGUID = _buffer.ReadBool(); + if (fileVer >= ver2025_9_30) + Manifest.ReplaceAssetPathWithAddress = _buffer.ReadBool(); + else + Manifest.ReplaceAssetPathWithAddress = false; Manifest.OutputNameStyle = _buffer.ReadInt32(); Manifest.BuildBundleType = _buffer.ReadInt32(); Manifest.BuildPipeline = _buffer.ReadUTF8(); @@ -109,6 +116,8 @@ namespace YooAsset // 检测配置 if (Manifest.EnableAddressable && Manifest.LocationToLower) throw new System.Exception("Addressable not support location to lower !"); + if (Manifest.EnableAddressable == false && Manifest.ReplaceAssetPathWithAddress) + throw new System.Exception("Replace asset path with address need enable Addressable !"); _steps = ESteps.PrepareAssetList; } @@ -122,16 +131,31 @@ namespace YooAsset } if (_steps == ESteps.DeserializeAssetList) { + bool replaceAssetPath = false; + if (UnityEngine.Application.isPlaying) + { + if (Manifest.EnableAddressable && Manifest.ReplaceAssetPathWithAddress) + replaceAssetPath = true; + } + while (_packageAssetCount > 0) { var packageAsset = new PackageAsset(); packageAsset.Address = _buffer.ReadUTF8(); - packageAsset.AssetPath = _buffer.ReadUTF8(); + if (replaceAssetPath) + { + packageAsset.AssetPath = packageAsset.Address; + _buffer.SkipUTF8(); //跳过解析AssetPath + } + else + { + packageAsset.AssetPath = _buffer.ReadUTF8(); + } packageAsset.AssetGUID = _buffer.ReadUTF8(); packageAsset.AssetTags = _buffer.ReadUTF8Array(); packageAsset.BundleID = _buffer.ReadInt32(); packageAsset.DependBundleIDs = _buffer.ReadInt32Array(); - FillAssetCollection(Manifest, packageAsset); + FillAssetCollection(Manifest, packageAsset, replaceAssetPath); _packageAssetCount--; Progress = 1f - _packageAssetCount / _progressTotalValue; @@ -181,7 +205,7 @@ namespace YooAsset if (_steps == ESteps.InitManifest) { - ManifestTools.InitManifest(Manifest); + Manifest.Initialize(); _steps = ESteps.Done; Status = EOperationStatus.Succeed; } @@ -228,7 +252,7 @@ namespace YooAsset else manifest.AssetPathMapping2 = new Dictionary(); } - private void FillAssetCollection(PackageManifest manifest, PackageAsset packageAsset) + private void FillAssetCollection(PackageManifest manifest, PackageAsset packageAsset, bool replaceAssetPath) { // 添加到列表集合 manifest.AssetList.Add(packageAsset); @@ -274,7 +298,7 @@ namespace YooAsset } // 添加可寻址地址 - if (manifest.EnableAddressable) + if (manifest.EnableAddressable && replaceAssetPath == false) { string location = packageAsset.Address; if (string.IsNullOrEmpty(location) == false) diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs index c88fdf14..3c1e0585 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageDetail.cs @@ -28,6 +28,11 @@ namespace YooAsset /// public bool IncludeAssetGUID; + /// + /// 使用可寻址地址代替资源路径 + /// + public bool ReplaceAssetPathWithAddress; + /// /// 文件名称样式 /// diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs index 0e567fcd..ac00400c 100644 --- a/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs +++ b/Assets/YooAsset/Runtime/ResourcePackage/PackageManifest.cs @@ -36,6 +36,11 @@ namespace YooAsset /// public bool IncludeAssetGUID; + /// + /// 使用可寻址地址代替资源路径 + /// + public bool ReplaceAssetPathWithAddress; + /// /// 文件名称样式 /// @@ -113,6 +118,38 @@ namespace YooAsset public Dictionary BundleDic3; + /// + /// 初始化资源清单 + /// + public void Initialize() + { + // 填充资源包内包含的主资源列表 + foreach (var packageAsset in AssetList) + { + int bundleID = packageAsset.BundleID; + if (bundleID >= 0 && bundleID < BundleList.Count) + { + var packageBundle = BundleList[bundleID]; + packageBundle.IncludeMainAssets.Add(packageAsset); + } + else + { + throw new Exception($"Invalid bundle id : {bundleID} Asset path : {packageAsset.AssetPath}"); + } + } + + // 填充资源包引用关系 + for (int index = 0; index < BundleList.Count; index++) + { + var sourceBundle = BundleList[index]; + foreach (int dependIndex in sourceBundle.DependBundleIDs) + { + var dependBundle = BundleList[dependIndex]; + dependBundle.AddReferenceBundleID(index); + } + } + } + /// /// 获取包裹的详细信息 /// @@ -124,6 +161,7 @@ namespace YooAsset details.SupportExtensionless = SupportExtensionless; details.LocationToLower = LocationToLower; details.IncludeAssetGUID = IncludeAssetGUID; + details.ReplaceAssetPathWithAddress = ReplaceAssetPathWithAddress; details.OutputNameStyle = OutputNameStyle; details.BuildBundleType = BuildBundleType; details.BuildPipeline = BuildPipeline; diff --git a/Assets/YooAsset/Runtime/Utility/BufferReader.cs b/Assets/YooAsset/Runtime/Utility/BufferReader.cs index 3a54c58c..2221a1b4 100644 --- a/Assets/YooAsset/Runtime/Utility/BufferReader.cs +++ b/Assets/YooAsset/Runtime/Utility/BufferReader.cs @@ -120,6 +120,15 @@ namespace YooAsset return (ulong)ReadInt64(); } + public void SkipUTF8() + { + ushort count = ReadUInt16(); + if (count == 0) + return; + + CheckReaderIndex(count); + _index += count; + } public string ReadUTF8() { ushort count = ReadUInt16();