diff --git a/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs b/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs
index ca0c9a64..fa0979a9 100644
--- a/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs
+++ b/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs
@@ -253,7 +253,7 @@ namespace TEngine
///
private static IEncryptionServices CreateEncryptionInstance(string packageName, EBuildPipeline buildPipeline)
{
- var encryptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(packageName, buildPipeline);
+ var encryptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionServicesClassName(packageName, buildPipeline.ToString());
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
var classType = encryptionClassTypes.Find(x => x.FullName != null && x.FullName.Equals(encryptionClassName));
if (classType != null)
diff --git a/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/ResourceModule.Services.cs b/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/ResourceModule.Services.cs
index d2353799..252859df 100644
--- a/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/ResourceModule.Services.cs
+++ b/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/ResourceModule.Services.cs
@@ -86,6 +86,14 @@ namespace TEngine
return decryptResult;
}
+ ///
+ /// 后备方式获取解密的资源包对象
+ ///
+ DecryptResult IDecryptionServices.LoadAssetBundleFallback(DecryptFileInfo fileInfo)
+ {
+ return new DecryptResult();
+ }
+
///
/// 获取解密的字节数据
///
@@ -157,6 +165,14 @@ namespace TEngine
AssetBundle.LoadFromFileAsync(fileInfo.FileLoadPath, 0, GetFileOffset());
return decryptResult;
}
+
+ ///
+ /// 后备方式获取解密的资源包对象
+ ///
+ DecryptResult IDecryptionServices.LoadAssetBundleFallback(DecryptFileInfo fileInfo)
+ {
+ return new DecryptResult();
+ }
///
/// 获取解密的字节数据
diff --git a/UnityProject/Packages/YooAsset/CHANGELOG.md b/UnityProject/Packages/YooAsset/CHANGELOG.md
index f788c6d1..4540ee18 100644
--- a/UnityProject/Packages/YooAsset/CHANGELOG.md
+++ b/UnityProject/Packages/YooAsset/CHANGELOG.md
@@ -2,6 +2,141 @@
All notable changes to this package will be documented in this file.
+## [2.3.12] - 2025-07-01
+
+### Improvements
+
+- 优化了同步接口导致的资源拷贝和资源验证性能开销高的现象。
+- 微信小游戏和抖音小游戏支持资源清单加密。
+
+### Fixed
+
+- (#579) 修复了2.3.10版本资源包构建页面里CopyBuildinFileParam无法编辑问题。
+- (#572) 修复了资源收集页面指定收集的预制体名称变动的问题。
+- (#582) 修复了非递归收集依赖时,依赖列表中才包含主资源的问题。
+
+### Added
+
+- 新增初始化参数:WebGLForceSyncLoadAsset
+
+ ```csharp
+ public abstract class InitializeParameters
+ {
+ ///
+ /// WebGL平台强制同步加载资源对象
+ /// Add commentMore actions
+ public bool WebGLForceSyncLoadAsset = false;
+ }
+ ```
+
+- (#576) 新增了资源清单服务类:IManifestServices
+
+ ```csharp
+ ///
+ /// 资源清单文件处理服务接口
+ ///
+ public interface IManifestServices
+ {
+ ///
+ /// 处理资源清单(压缩和加密)
+ ///
+ byte[] ProcessManifest(byte[] fileData);
+
+ ///
+ /// 还原资源清单(解压和解密)
+ ///
+ byte[] RestoreManifest(byte[] fileData);
+ }
+ ```
+
+- (#585) 新增了本地文件拷贝服务类:ICopyLocalFileServices
+
+ ```csharp
+ ///
+ /// 本地文件拷贝服务类
+ ///
+ public interface ICopyLocalFileServices
+ {
+ void CopyFile(LocalFileInfo sourceFileInfo, string destFilePath);
+ }
+ ```
+
+## [2.3.10] - 2025-06-17
+
+### Improvements
+
+- 小游戏扩展库已经独立,可以单独导入到项目工程。
+- 编辑器里的TableView视图新增了AssetObjectCell类。
+- (#552) 微信小游戏文件系统类,增加了URL合法性的初始化检测机制。
+- (#566) 重构了资源构建页面,方便扩展自定义界面。
+- (#573) 完善了AssetDependencyDB的输出日志,可以正确输出丢失的引用资产信息。
+
+### Fixed
+
+- 修复太空战机DEMO在退出运行模式时的报错。
+- (#551) 修复了Unity2019, Unity2020的代码兼容性报错。
+- (#569) 修复了TVOS平台的兼容问题。
+- (#564) 修复了TiktokFileSystem文件系统里appendTimeTicks无效的问题。
+
+### Added
+
+- (#562) 新增了解密方法。
+
+ ```csharp
+ public interface IDecryptionServices
+ {
+ ///
+ /// 后备方式获取解密的资源包对象
+ /// 注意:当正常解密方法失败后,会触发后备加载!
+ /// 说明:建议通过LoadFromMemory()方法加载资源对象作为保底机制。
+ /// issues : https://github.com/tuyoogame/YooAsset/issues/562
+ ///
+ DecryptResult LoadAssetBundleFallback(DecryptFileInfo fileInfo);
+ }
+ ```
+
+
+
+## [2.3.9] - 2025-05-13
+
+### Improvements
+
+- 增加了YOO_ASSET_EXPERIMENT宏,用于控制实验性代码的开关。
+- 构建管线目前会输出构建日志到输出目录下,方便查看引擎在构建时主动清空的控制台日志。
+- 优化了收集器tag传染扩散逻辑,避免Group里配置了Tag导致的无意义的警告信息。
+- 扩展工程内PanelMonitor代码默认关闭状态。
+
+### Fixed
+
+- (#528) 修复了AssetDependencyDatabase在查询引擎资源对象是否存在的时效问题。
+
+### Added
+
+- (#542) 新增了资源管理系统销毁方法。
+
+ 该方法会销毁所有的资源包裹和异步操作任务,以及卸载所有AssetBundle对象!
+
+ ```csharp
+ public class YooAssets
+ {
+ ///
+ /// 销毁资源系统
+ ///
+ public static void Destroy();
+ }
+ ```
+
+- 新增了SBP构建管线的构建参数
+
+ ```csharp
+ ///
+ /// 从AssetBundle文件头里剥离Unity版本信息
+ ///
+ public bool StripUnityVersion = false;
+ ```
+
+- 新增了构建错误码:BuiltinShadersBundleNameIsNull
+
## [2.3.8] - 2025-04-17
### Improvements
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/AssetArtReporterWindow.cs b/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/AssetArtReporterWindow.cs
index e246c7ca..610fd4e9 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/AssetArtReporterWindow.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/AssetArtReporterWindow.cs
@@ -196,6 +196,32 @@ namespace YooAsset.Editor
}
}
+ ///
+ /// 导入单个报告对象
+ ///
+ public void ImportSingleReprotFile(ScanReport report)
+ {
+ _reportCombiner = new ScanReportCombiner();
+
+ try
+ {
+ _reportCombiner.Combine(report);
+
+ // 刷新页面
+ RefreshToolbar();
+ FillTableView();
+ RebuildView();
+ }
+ catch (System.Exception e)
+ {
+ _reportCombiner = null;
+ _titleLabel.text = "导入报告失败!";
+ _descLabel.text = e.Message;
+ UnityEngine.Debug.LogError(e.StackTrace);
+ }
+ }
+
+
private void ImportSingleBtn_clicked()
{
string selectFilePath = EditorUtility.OpenFilePanel("导入报告", _lastestOpenFolder, "json");
@@ -446,15 +472,31 @@ namespace YooAsset.Editor
var column = new TableColumn(header.HeaderTitle, header.HeaderTitle, columnStyle);
column.MakeCell = () =>
{
- var label = new Label();
- label.style.marginLeft = 3f;
- label.style.unityTextAlign = TextAnchor.MiddleLeft;
- return label;
+ if (header.HeaderType == EHeaderType.AssetObject)
+ {
+ var objectFiled = new ObjectField();
+ return objectFiled;
+ }
+ else
+ {
+ var label = new Label();
+ label.style.marginLeft = 3f;
+ label.style.unityTextAlign = TextAnchor.MiddleLeft;
+ return label;
+ }
};
column.BindCell = (VisualElement element, ITableData data, ITableCell cell) =>
{
- var infoLabel = element as Label;
- infoLabel.text = (string)cell.GetDisplayObject();
+ if (header.HeaderType == EHeaderType.AssetObject)
+ {
+ var objectFiled = element as ObjectField;
+ objectFiled.value = (UnityEngine.Object)cell.GetDisplayObject();
+ }
+ else
+ {
+ var infoLabel = element as Label;
+ infoLabel.text = (string)cell.GetDisplayObject();
+ }
};
_elementTableView.AddColumn(column);
}
@@ -480,6 +522,10 @@ namespace YooAsset.Editor
{
tableData.AddAssetPathCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
}
+ else if (header.HeaderType == EHeaderType.AssetObject)
+ {
+ tableData.AddAssetObjectCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
+ }
else if (header.HeaderType == EHeaderType.StringValue)
{
tableData.AddStringValueCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/EHeaderType.cs b/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/EHeaderType.cs
index 3e3ee17f..009c7189 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/EHeaderType.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/EHeaderType.cs
@@ -8,6 +8,11 @@ namespace YooAsset.Editor
///
AssetPath,
+ ///
+ /// 资源对象
+ ///
+ AssetObject,
+
///
/// 字符串
///
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/ReportHeader.cs b/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/ReportHeader.cs
index ca194dde..2109e101 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/ReportHeader.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetArtReporter/ReportHeader.cs
@@ -126,6 +126,12 @@ namespace YooAsset.Editor
if (string.IsNullOrEmpty(guid))
throw new Exception($"{HeaderTitle} value is invalid asset path : {value}");
}
+ else if (HeaderType == EHeaderType.AssetObject)
+ {
+ string guid = AssetDatabase.AssetPathToGUID(value);
+ if (string.IsNullOrEmpty(guid))
+ throw new Exception($"{HeaderTitle} value is invalid asset object : {value}");
+ }
else if (HeaderType == EHeaderType.DoubleValue)
{
if (double.TryParse(value, out double doubleValue) == false)
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/AssetArtScannerSetting.cs b/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/AssetArtScannerSetting.cs
index f82c10ef..dd54aa6c 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/AssetArtScannerSetting.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/AssetArtScannerSetting.cs
@@ -46,7 +46,7 @@ namespace YooAsset.Editor
}
catch (Exception e)
{
- return new ScannerResult(e.Message);
+ return new ScannerResult(e.StackTrace);
}
}
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/ScannerResult.cs b/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/ScannerResult.cs
index 0e4a9c34..94b71fd4 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/ScannerResult.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetArtScanner/ScannerResult.cs
@@ -52,7 +52,7 @@ namespace YooAsset.Editor
if (Succeed)
{
var reproterWindow = AssetArtReporterWindow.OpenWindow();
- reproterWindow.ImportSingleReprotFile(ReprotFilePath);
+ reproterWindow.ImportSingleReprotFile(Report);
}
}
}
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs
index 48fb8f04..4f1948b1 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderSetting.cs
@@ -6,97 +6,110 @@ namespace YooAsset.Editor
{
public static class AssetBundleBuilderSetting
{
- // EBuildPipeline
- public static EBuildPipeline GetPackageBuildPipeline(string packageName)
+ // BuildPipelineName
+ public static string GetPackageBuildPipeline(string packageName)
{
- string key = $"{Application.productName}_{packageName}_{nameof(EBuildPipeline)}";
- return (EBuildPipeline)EditorPrefs.GetInt(key, (int)EBuildPipeline.BuiltinBuildPipeline);
+ string key = $"{Application.productName}_{packageName}_BuildPipelineName";
+ string defaultValue = EBuildPipeline.ScriptableBuildPipeline.ToString();
+ return EditorPrefs.GetString(key, defaultValue);
}
- public static void SetPackageBuildPipeline(string packageName, EBuildPipeline buildPipeline)
+ public static void SetPackageBuildPipeline(string packageName, string buildPipeline)
{
- string key = $"{Application.productName}_{packageName}_{nameof(EBuildPipeline)}";
- EditorPrefs.SetInt(key, (int)buildPipeline);
+ string key = $"{Application.productName}_{packageName}_BuildPipelineName";
+ EditorPrefs.SetString(key, buildPipeline);
}
// ECompressOption
- public static ECompressOption GetPackageCompressOption(string packageName, EBuildPipeline buildPipeline)
+ public static ECompressOption GetPackageCompressOption(string packageName, string buildPipeline)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(ECompressOption)}";
return (ECompressOption)EditorPrefs.GetInt(key, (int)ECompressOption.LZ4);
}
- public static void SetPackageCompressOption(string packageName, EBuildPipeline buildPipeline, ECompressOption compressOption)
+ public static void SetPackageCompressOption(string packageName, string buildPipeline, ECompressOption compressOption)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(ECompressOption)}";
EditorPrefs.SetInt(key, (int)compressOption);
}
// EFileNameStyle
- public static EFileNameStyle GetPackageFileNameStyle(string packageName, EBuildPipeline buildPipeline)
+ public static EFileNameStyle GetPackageFileNameStyle(string packageName, string buildPipeline)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EFileNameStyle)}";
return (EFileNameStyle)EditorPrefs.GetInt(key, (int)EFileNameStyle.HashName);
}
- public static void SetPackageFileNameStyle(string packageName, EBuildPipeline buildPipeline, EFileNameStyle fileNameStyle)
+ public static void SetPackageFileNameStyle(string packageName, string buildPipeline, EFileNameStyle fileNameStyle)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EFileNameStyle)}";
EditorPrefs.SetInt(key, (int)fileNameStyle);
}
// EBuildinFileCopyOption
- public static EBuildinFileCopyOption GetPackageBuildinFileCopyOption(string packageName, EBuildPipeline buildPipeline)
+ public static EBuildinFileCopyOption GetPackageBuildinFileCopyOption(string packageName, string buildPipeline)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildinFileCopyOption)}";
return (EBuildinFileCopyOption)EditorPrefs.GetInt(key, (int)EBuildinFileCopyOption.None);
}
- public static void SetPackageBuildinFileCopyOption(string packageName, EBuildPipeline buildPipeline, EBuildinFileCopyOption buildinFileCopyOption)
+ public static void SetPackageBuildinFileCopyOption(string packageName, string buildPipeline, EBuildinFileCopyOption buildinFileCopyOption)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildinFileCopyOption)}";
EditorPrefs.SetInt(key, (int)buildinFileCopyOption);
}
// BuildFileCopyParams
- public static string GetPackageBuildinFileCopyParams(string packageName, EBuildPipeline buildPipeline)
+ public static string GetPackageBuildinFileCopyParams(string packageName, string buildPipeline)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
return EditorPrefs.GetString(key, string.Empty);
}
- public static void SetPackageBuildinFileCopyParams(string packageName, EBuildPipeline buildPipeline, string buildinFileCopyParams)
+ public static void SetPackageBuildinFileCopyParams(string packageName, string buildPipeline, string buildinFileCopyParams)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
EditorPrefs.SetString(key, buildinFileCopyParams);
}
- // EncyptionClassName
- public static string GetPackageEncyptionClassName(string packageName, EBuildPipeline buildPipeline)
+ // EncyptionServicesClassName
+ public static string GetPackageEncyptionServicesClassName(string packageName, string buildPipeline)
{
- string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
- return EditorPrefs.GetString(key, string.Empty);
+ string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionServicesClassName";
+ return EditorPrefs.GetString(key, $"{typeof(EncryptionNone).FullName}");
}
- public static void SetPackageEncyptionClassName(string packageName, EBuildPipeline buildPipeline, string encyptionClassName)
+ public static void SetPackageEncyptionServicesClassName(string packageName, string buildPipeline, string encyptionClassName)
{
- string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
+ string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionServicesClassName";
+ EditorPrefs.SetString(key, encyptionClassName);
+ }
+
+ // ManifestServicesClassName
+ public static string GetPackageManifestServicesClassName(string packageName, string buildPipeline)
+ {
+ string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestServicesClassName";
+ return EditorPrefs.GetString(key, $"{typeof(ManifestNone).FullName}");
+ }
+ public static void SetPackageManifestServicesClassName(string packageName, string buildPipeline, string encyptionClassName)
+ {
+ string key = $"{Application.productName}_{packageName}_{buildPipeline}_ManifestServicesClassName";
EditorPrefs.SetString(key, encyptionClassName);
}
// ClearBuildCache
- public static bool GetPackageClearBuildCache(string packageName, EBuildPipeline buildPipeline)
+ public static bool GetPackageClearBuildCache(string packageName, string buildPipeline)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
return EditorPrefs.GetInt(key, 0) > 0;
}
- public static void SetPackageClearBuildCache(string packageName, EBuildPipeline buildPipeline, bool clearBuildCache)
+ public static void SetPackageClearBuildCache(string packageName, string buildPipeline, bool clearBuildCache)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
EditorPrefs.SetInt(key, clearBuildCache ? 1 : 0);
}
// UseAssetDependencyDB
- public static bool GetPackageUseAssetDependencyDB(string packageName, EBuildPipeline buildPipeline)
+ public static bool GetPackageUseAssetDependencyDB(string packageName, string buildPipeline)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
return EditorPrefs.GetInt(key, 0) > 0;
}
- public static void SetPackageUseAssetDependencyDB(string packageName, EBuildPipeline buildPipeline, bool useAssetDependencyDB)
+ public static void SetPackageUseAssetDependencyDB(string packageName, string buildPipeline, bool useAssetDependencyDB)
{
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
EditorPrefs.SetInt(key, useAssetDependencyDB ? 1 : 0);
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs
index c97246c5..04cf64be 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/AssetBundleBuilderWindow.cs
@@ -19,7 +19,9 @@ namespace YooAsset.Editor
}
private string _buildPackage;
- private EBuildPipeline _buildPipeline;
+ private string _buildPipeline;
+
+ private Dictionary _viewClassDic = new Dictionary(10);
private Toolbar _toolbar;
private ToolbarMenu _packageMenu;
@@ -69,11 +71,23 @@ namespace YooAsset.Editor
{
_pipelineMenu = new ToolbarMenu();
_pipelineMenu.style.width = 200;
- _pipelineMenu.menu.AppendAction(EBuildPipeline.EditorSimulateBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.EditorSimulateBuildPipeline);
- _pipelineMenu.menu.AppendAction(EBuildPipeline.BuiltinBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.BuiltinBuildPipeline);
- _pipelineMenu.menu.AppendAction(EBuildPipeline.ScriptableBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.ScriptableBuildPipeline);
- _pipelineMenu.menu.AppendAction(EBuildPipeline.RawFileBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.RawFileBuildPipeline);
_toolbar.Add(_pipelineMenu);
+
+ var viewerClassTypes = EditorTools.GetAssignableTypes(typeof(BuildPipelineViewerBase));
+ foreach (var classType in viewerClassTypes)
+ {
+ var buildPipelineAttribute = EditorTools.GetAttribute(classType);
+ string pipelineName = buildPipelineAttribute.PipelineName;
+ if (_viewClassDic.ContainsKey(pipelineName))
+ {
+ Debug.LogWarning($"The pipeline has already exist : {pipelineName}");
+ }
+ else
+ {
+ _viewClassDic.Add(pipelineName, classType);
+ _pipelineMenu.menu.AppendAction(pipelineName, PipelineMenuAction, PipelineMenuFun);
+ }
+ }
}
RefreshBuildPipelineView();
@@ -91,28 +105,18 @@ namespace YooAsset.Editor
_buildPipeline = AssetBundleBuilderSetting.GetPackageBuildPipeline(_buildPackage);
_packageMenu.text = _buildPackage;
- _pipelineMenu.text = _buildPipeline.ToString();
+ _pipelineMenu.text = _buildPipeline;
- var buildTarget = EditorUserBuildSettings.activeBuildTarget;
- if (_buildPipeline == EBuildPipeline.EditorSimulateBuildPipeline)
+ if (_viewClassDic.TryGetValue(_buildPipeline, out Type value))
{
- var viewer = new EditorSimulateBuildPipelineViewer(_buildPackage, buildTarget, _container);
- }
- else if (_buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
- {
- var viewer = new BuiltinBuildPipelineViewer(_buildPackage, buildTarget, _container);
- }
- else if (_buildPipeline == EBuildPipeline.ScriptableBuildPipeline)
- {
- var viewer = new ScriptableBuildPipelineViewer(_buildPackage, buildTarget, _container);
- }
- else if (_buildPipeline == EBuildPipeline.RawFileBuildPipeline)
- {
- var viewer = new RawfileBuildpipelineViewer(_buildPackage, buildTarget, _container);
+ var buildTarget = EditorUserBuildSettings.activeBuildTarget;
+ var viewer = Activator.CreateInstance(value) as BuildPipelineViewerBase;
+ viewer.InitView(_buildPackage, _buildPipeline, buildTarget);
+ viewer.CreateView(_container);
}
else
{
- throw new System.NotImplementedException(_buildPipeline.ToString());
+ Debug.LogError($"Not found build pipeline : {_buildPipeline}");
}
}
private List GetBuildPackageNames()
@@ -145,18 +149,16 @@ namespace YooAsset.Editor
private void PipelineMenuAction(DropdownMenuAction action)
{
- var pipelineType = (EBuildPipeline)action.userData;
- if (_buildPipeline != pipelineType)
+ if (_buildPipeline != action.name)
{
- _buildPipeline = pipelineType;
- AssetBundleBuilderSetting.SetPackageBuildPipeline(_buildPackage, pipelineType);
+ _buildPipeline = action.name;
+ AssetBundleBuilderSetting.SetPackageBuildPipeline(_buildPackage, _buildPipeline);
RefreshBuildPipelineView();
}
}
private DropdownMenuAction.Status PipelineMenuFun(DropdownMenuAction action)
{
- var pipelineType = (EBuildPipeline)action.userData;
- if (_buildPipeline == pipelineType)
+ if (_buildPipeline == action.name)
return DropdownMenuAction.Status.Checked;
else
return DropdownMenuAction.Status.Normal;
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs
index e701dabe..58938c4f 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildParameters.cs
@@ -98,6 +98,11 @@ namespace YooAsset.Editor
///
public IEncryptionServices EncryptionServices;
+ ///
+ /// 资源清单服务类
+ ///
+ public IManifestServices ManifestServices;
+
private string _pipelineOutputDirectory = string.Empty;
private string _packageOutputDirectory = string.Empty;
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs
index 67dabdde..03b8af32 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateCatalog.cs
@@ -14,7 +14,8 @@ namespace YooAsset.Editor
{
string buildinRootDirectory = buildParametersContext.GetBuildinRootDirectory();
string buildPackageName = buildParametersContext.Parameters.PackageName;
- DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(buildPackageName, buildinRootDirectory);
+ var manifestServices = buildParametersContext.Parameters.ManifestServices;
+ DefaultBuildinFileSystemBuild.CreateBuildinCatalogFile(manifestServices, buildPackageName, buildinRootDirectory);
// 刷新目录
AssetDatabase.Refresh();
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs
index a23dd021..5d5c6e62 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs
@@ -58,7 +58,7 @@ namespace YooAsset.Editor
if (processBundleDepends)
ProcessBuiltinBundleDependency(context, manifest);
- // 创建补丁清单文本文件
+ // 创建资源清单文本文件
{
string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion);
string filePath = $"{packageOutputDirectory}/{fileName}";
@@ -66,18 +66,18 @@ namespace YooAsset.Editor
BuildLogger.Log($"Create package manifest file: {filePath}");
}
- // 创建补丁清单二进制文件
+ // 创建资源清单二进制文件
string packageHash;
string packagePath;
{
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
packagePath = $"{packageOutputDirectory}/{fileName}";
- ManifestTools.SerializeToBinary(packagePath, manifest);
+ ManifestTools.SerializeToBinary(packagePath, manifest, buildParameters.ManifestServices);
packageHash = HashUtility.FileCRC32(packagePath);
BuildLogger.Log($"Create package manifest file: {packagePath}");
}
- // 创建补丁清单哈希文件
+ // 创建资源清单哈希文件
{
string fileName = YooAssetSettingsData.GetPackageHashFileName(buildParameters.PackageName, buildParameters.PackageVersion);
string filePath = $"{packageOutputDirectory}/{fileName}";
@@ -85,7 +85,7 @@ namespace YooAsset.Editor
BuildLogger.Log($"Create package manifest hash file: {filePath}");
}
- // 创建补丁清单版本文件
+ // 创建资源清单版本文件
{
string fileName = YooAssetSettingsData.GetPackageVersionFileName(buildParameters.PackageName);
string filePath = $"{packageOutputDirectory}/{fileName}";
@@ -97,7 +97,7 @@ namespace YooAsset.Editor
{
ManifestContext manifestContext = new ManifestContext();
byte[] bytesData = FileUtility.ReadAllBytes(packagePath);
- manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData);
+ manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData, buildParameters.ManifestServices);
context.SetContextObject(manifestContext);
}
}
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs
index 3a358bf5..79bf4f5d 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateReport.cs
@@ -43,7 +43,8 @@ namespace YooAsset.Editor
buildReport.Summary.EnableSharePackRule = buildParameters.EnableSharePackRule;
buildReport.Summary.SingleReferencedPackAlone = buildParameters.SingleReferencedPackAlone;
buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle;
- buildReport.Summary.EncryptionClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName;
+ buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName;
+ buildReport.Summary.ManifestServicesClassName = buildParameters.ManifestServices == null ? "null" : buildParameters.ManifestServices.GetType().FullName;
if (buildParameters is BuiltinBuildParameters)
{
var builtinBuildParameters = buildParameters as BuiltinBuildParameters;
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs
similarity index 100%
rename from UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs
rename to UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs.meta
similarity index 100%
rename from UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryption.cs.meta
rename to UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultEncryptionServices.cs.meta
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs
new file mode 100644
index 00000000..62ebc1ea
--- /dev/null
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs
@@ -0,0 +1,15 @@
+
+namespace YooAsset.Editor
+{
+ public class ManifestNone : IManifestServices
+ {
+ public byte[] ProcessManifest(byte[] fileData)
+ {
+ return fileData;
+ }
+ public byte[] RestoreManifest(byte[] fileData)
+ {
+ return fileData;
+ }
+ }
+}
\ No newline at end of file
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta
new file mode 100644
index 00000000..73371bc0
--- /dev/null
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/DefaultManifestServices.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 446513b0ea9f5d445ade0cfb09c5073b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/IBuildPipeline.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/IBuildPipeline.cs
index 97b7f11e..5c82546f 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/IBuildPipeline.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/IBuildPipeline.cs
@@ -1,8 +1,13 @@
-
+using UnityEditor;
+using UnityEngine;
+
namespace YooAsset.Editor
{
public interface IBuildPipeline
{
+ ///
+ /// 运行构建任务
+ ///
BuildResult Run(BuildParameters buildParameters, bool enableLog);
}
}
\ No newline at end of file
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineAttribute.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineAttribute.cs
new file mode 100644
index 00000000..24316977
--- /dev/null
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineAttribute.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace YooAsset.Editor
+{
+ public class BuildPipelineAttribute : Attribute
+ {
+ public string PipelineName;
+
+ public BuildPipelineAttribute(string name)
+ {
+ this.PipelineName = name;
+ }
+ }
+}
\ No newline at end of file
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineAttribute.cs.meta b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineAttribute.cs.meta
new file mode 100644
index 00000000..4f4c6ae2
--- /dev/null
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineAttribute.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 90d865a5cede7ae43a5fdabdc20af0fd
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs
index a25205d6..dce8b86b 100644
--- a/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs
+++ b/UnityProject/Packages/YooAsset/Editor/AssetBundleBuilder/VisualViewers/BuildPipelineViewerBase.cs
@@ -12,211 +12,224 @@ namespace YooAsset.Editor
{
internal abstract class BuildPipelineViewerBase
{
- private const int StyleWidth = 400;
- private const int LabelMinWidth = 180;
+ protected const int StyleWidth = 400;
+ protected const int LabelMinWidth = 190;
- protected readonly string PackageName;
- protected readonly BuildTarget BuildTarget;
- protected readonly EBuildPipeline BuildPipeline;
- protected TemplateContainer Root;
+ protected string PackageName { private set; get; }
+ protected string PipelineName { private set; get; }
+ protected BuildTarget BuildTarget { private set; get; }
- private TextField _buildOutputField;
- private TextField _buildVersionField;
- private PopupField _buildModeField;
- private PopupField _encryptionField;
- private EnumField _compressionField;
- private EnumField _outputNameStyleField;
- private EnumField _copyBuildinFileOptionField;
- private TextField _copyBuildinFileTagsField;
- private Toggle _clearBuildCacheToggle;
- private Toggle _useAssetDependencyDBToggle;
-
- public BuildPipelineViewerBase(string packageName, EBuildPipeline buildPipeline, BuildTarget buildTarget, VisualElement parent)
+ ///
+ /// 初始化视图
+ ///
+ public void InitView(string packageName, string pipelineName, BuildTarget buildTarget)
{
PackageName = packageName;
+ PipelineName = pipelineName;
BuildTarget = buildTarget;
- BuildPipeline = buildPipeline;
-
- CreateView(parent);
- RefreshView();
- }
- private void CreateView(VisualElement parent)
- {
- // 加载布局文件
- var visualAsset = UxmlLoader.LoadWindowUXML();
- if (visualAsset == null)
- return;
-
- Root = visualAsset.CloneTree();
- Root.style.flexGrow = 1f;
- parent.Add(Root);
-
- // 输出目录
- string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
- _buildOutputField = Root.Q("BuildOutput");
- _buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
- _buildOutputField.SetEnabled(false);
-
- // 构建版本
- _buildVersionField = Root.Q("BuildVersion");
- _buildVersionField.style.width = StyleWidth;
- _buildVersionField.SetValueWithoutNotify(GetDefaultPackageVersion());
-
- // 加密方法
- {
- var encryptionContainer = Root.Q("EncryptionContainer");
- var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
- if (encryptionClassTypes.Count > 0)
- {
- var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, BuildPipeline);
- int defaultIndex = encryptionClassTypes.FindIndex(x => x.FullName.Equals(encyptionClassName));
- if (defaultIndex < 0)
- defaultIndex = 0;
- _encryptionField = new PopupField(encryptionClassTypes, defaultIndex);
- _encryptionField.label = "Encryption";
- _encryptionField.style.width = StyleWidth;
- _encryptionField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageEncyptionClassName(PackageName, BuildPipeline, _encryptionField.value.FullName);
- });
- encryptionContainer.Add(_encryptionField);
- }
- else
- {
- _encryptionField = new PopupField();
- _encryptionField.label = "Encryption";
- _encryptionField.style.width = StyleWidth;
- encryptionContainer.Add(_encryptionField);
- }
- }
-
- // 压缩方式选项
- var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
- _compressionField = Root.Q("Compression");
- _compressionField.Init(compressOption);
- _compressionField.SetValueWithoutNotify(compressOption);
- _compressionField.style.width = StyleWidth;
- _compressionField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageCompressOption(PackageName, BuildPipeline, (ECompressOption)_compressionField.value);
- });
-
- // 输出文件名称样式
- var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline);
- _outputNameStyleField = Root.Q("FileNameStyle");
- _outputNameStyleField.Init(fileNameStyle);
- _outputNameStyleField.SetValueWithoutNotify(fileNameStyle);
- _outputNameStyleField.style.width = StyleWidth;
- _outputNameStyleField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageFileNameStyle(PackageName, BuildPipeline, (EFileNameStyle)_outputNameStyleField.value);
- });
-
- // 首包文件拷贝选项
- var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
- _copyBuildinFileOptionField = Root.Q("CopyBuildinFileOption");
- _copyBuildinFileOptionField.Init(buildinFileCopyOption);
- _copyBuildinFileOptionField.SetValueWithoutNotify(buildinFileCopyOption);
- _copyBuildinFileOptionField.style.width = StyleWidth;
- _copyBuildinFileOptionField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(PackageName, BuildPipeline, (EBuildinFileCopyOption)_copyBuildinFileOptionField.value);
- RefreshView();
- });
-
- // 首包文件拷贝参数
- var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
- _copyBuildinFileTagsField = Root.Q("CopyBuildinFileParam");
- _copyBuildinFileTagsField.SetValueWithoutNotify(buildinFileCopyParams);
- _copyBuildinFileTagsField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(PackageName, BuildPipeline, _copyBuildinFileTagsField.value);
- });
-
- // 清理构建缓存
- bool clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
- _clearBuildCacheToggle = Root.Q("ClearBuildCache");
- _clearBuildCacheToggle.SetValueWithoutNotify(clearBuildCache);
- _clearBuildCacheToggle.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageClearBuildCache(PackageName, BuildPipeline, _clearBuildCacheToggle.value);
- });
-
- // 使用资源依赖数据库
- bool useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
- _useAssetDependencyDBToggle = Root.Q("UseAssetDependency");
- _useAssetDependencyDBToggle.SetValueWithoutNotify(useAssetDependencyDB);
- _useAssetDependencyDBToggle.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(PackageName, BuildPipeline, _useAssetDependencyDBToggle.value);
- });
-
- // 对齐文本间距
- UIElementsTools.SetElementLabelMinWidth(_buildOutputField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_buildVersionField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_compressionField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_encryptionField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_outputNameStyleField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_copyBuildinFileOptionField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_copyBuildinFileTagsField, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_clearBuildCacheToggle, LabelMinWidth);
- UIElementsTools.SetElementLabelMinWidth(_useAssetDependencyDBToggle, LabelMinWidth);
-
- // 构建按钮
- var buildButton = Root.Q