mirror of
https://github.com/tuyoogame/YooAsset.git
synced 2026-05-19 23:00:06 +00:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ed85afb29 | ||
|
|
560a395173 | ||
|
|
8bce963588 | ||
|
|
f8a3fe47e5 | ||
|
|
48356a4f9e | ||
|
|
d2a28bd801 | ||
|
|
3949abb53f | ||
|
|
06a50a049e | ||
|
|
6f049e2427 | ||
|
|
01c08a46ab | ||
|
|
31dc5b494d | ||
|
|
18e74e906e | ||
|
|
4f62b249b4 | ||
|
|
fe7f9bff08 | ||
|
|
e71077f294 | ||
|
|
eabebf3d8f | ||
|
|
4ef789520a | ||
|
|
4322f3c58c | ||
|
|
c40a796170 | ||
|
|
32841d4773 | ||
|
|
e469b32d94 | ||
|
|
c0e5315953 | ||
|
|
7b5f366533 | ||
|
|
e674d5bf97 | ||
|
|
9b0bebd981 | ||
|
|
dc46462bfa | ||
|
|
51c9943cf2 | ||
|
|
3db9b750e3 | ||
|
|
1b57a0b7df | ||
|
|
bd5ce1e6bd | ||
|
|
7eb74d4dd1 | ||
|
|
a384ca1f18 |
@@ -2,6 +2,82 @@
|
|||||||
|
|
||||||
All notable changes to this package will be documented in this file.
|
All notable changes to this package will be documented in this file.
|
||||||
|
|
||||||
|
## [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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 后备方式获取解密的资源包对象
|
||||||
|
/// 注意:当正常解密方法失败后,会触发后备加载!
|
||||||
|
/// 说明:建议通过LoadFromMemory()方法加载资源对象作为保底机制。
|
||||||
|
/// issues : https://github.com/tuyoogame/YooAsset/issues/562
|
||||||
|
/// </summary>
|
||||||
|
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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 销毁资源系统
|
||||||
|
/// </summary>
|
||||||
|
public static void Destroy();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了SBP构建管线的构建参数
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
/// <summary>
|
||||||
|
/// 从AssetBundle文件头里剥离Unity版本信息
|
||||||
|
/// </summary>
|
||||||
|
public bool StripUnityVersion = false;
|
||||||
|
```
|
||||||
|
|
||||||
|
- 新增了构建错误码:BuiltinShadersBundleNameIsNull
|
||||||
|
|
||||||
## [2.3.8] - 2025-04-17
|
## [2.3.8] - 2025-04-17
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
#if YOO_ASSET_EXPERIMENT
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
public class MacroDefine
|
public class MacroDefine
|
||||||
@@ -15,3 +16,4 @@ namespace YooAsset.Editor
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
@@ -5,6 +5,7 @@ using System.Text;
|
|||||||
using System.Xml;
|
using System.Xml;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
|
#if YOO_ASSET_EXPERIMENT
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[InitializeOnLoad]
|
[InitializeOnLoad]
|
||||||
@@ -22,13 +23,21 @@ namespace YooAsset.Editor
|
|||||||
return content;
|
return content;
|
||||||
|
|
||||||
// 将修改后的XML结构重新输出为文本
|
// 将修改后的XML结构重新输出为文本
|
||||||
var stringWriter = new StringWriter();
|
using (var memoryStream = new MemoryStream())
|
||||||
var writerSettings = new XmlWriterSettings();
|
{
|
||||||
writerSettings.Indent = true;
|
var writerSettings = new XmlWriterSettings
|
||||||
var xmlWriter = XmlWriter.Create(stringWriter, writerSettings);
|
{
|
||||||
xmlDoc.WriteTo(xmlWriter);
|
Indent = true,
|
||||||
xmlWriter.Flush();
|
Encoding = new UTF8Encoding(false), //无BOM
|
||||||
return stringWriter.ToString();
|
OmitXmlDeclaration = false
|
||||||
|
};
|
||||||
|
|
||||||
|
using (var xmlWriter = XmlWriter.Create(memoryStream, writerSettings))
|
||||||
|
{
|
||||||
|
xmlDoc.Save(xmlWriter);
|
||||||
|
}
|
||||||
|
return Encoding.UTF8.GetString(memoryStream.ToArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -94,3 +103,4 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
@@ -196,6 +196,32 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 导入单个报告对象
|
||||||
|
/// </summary>
|
||||||
|
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()
|
private void ImportSingleBtn_clicked()
|
||||||
{
|
{
|
||||||
string selectFilePath = EditorUtility.OpenFilePanel("导入报告", _lastestOpenFolder, "json");
|
string selectFilePath = EditorUtility.OpenFilePanel("导入报告", _lastestOpenFolder, "json");
|
||||||
@@ -446,15 +472,31 @@ namespace YooAsset.Editor
|
|||||||
var column = new TableColumn(header.HeaderTitle, header.HeaderTitle, columnStyle);
|
var column = new TableColumn(header.HeaderTitle, header.HeaderTitle, columnStyle);
|
||||||
column.MakeCell = () =>
|
column.MakeCell = () =>
|
||||||
{
|
{
|
||||||
var label = new Label();
|
if (header.HeaderType == EHeaderType.AssetObject)
|
||||||
label.style.marginLeft = 3f;
|
{
|
||||||
label.style.unityTextAlign = TextAnchor.MiddleLeft;
|
var objectFiled = new ObjectField();
|
||||||
return label;
|
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) =>
|
column.BindCell = (VisualElement element, ITableData data, ITableCell cell) =>
|
||||||
{
|
{
|
||||||
var infoLabel = element as Label;
|
if (header.HeaderType == EHeaderType.AssetObject)
|
||||||
infoLabel.text = (string)cell.GetDisplayObject();
|
{
|
||||||
|
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);
|
_elementTableView.AddColumn(column);
|
||||||
}
|
}
|
||||||
@@ -480,6 +522,10 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
tableData.AddAssetPathCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
|
tableData.AddAssetPathCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
|
||||||
}
|
}
|
||||||
|
else if (header.HeaderType == EHeaderType.AssetObject)
|
||||||
|
{
|
||||||
|
tableData.AddAssetObjectCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
|
||||||
|
}
|
||||||
else if (header.HeaderType == EHeaderType.StringValue)
|
else if (header.HeaderType == EHeaderType.StringValue)
|
||||||
{
|
{
|
||||||
tableData.AddStringValueCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
|
tableData.AddStringValueCell(scanInfo.HeaderTitle, scanInfo.ScanInfo);
|
||||||
|
|||||||
@@ -8,6 +8,11 @@ namespace YooAsset.Editor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
AssetPath,
|
AssetPath,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 资源对象
|
||||||
|
/// </summary>
|
||||||
|
AssetObject,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 字符串
|
/// 字符串
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -126,6 +126,12 @@ namespace YooAsset.Editor
|
|||||||
if (string.IsNullOrEmpty(guid))
|
if (string.IsNullOrEmpty(guid))
|
||||||
throw new Exception($"{HeaderTitle} value is invalid asset path : {value}");
|
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)
|
else if (HeaderType == EHeaderType.DoubleValue)
|
||||||
{
|
{
|
||||||
if (double.TryParse(value, out double doubleValue) == false)
|
if (double.TryParse(value, out double doubleValue) == false)
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
return new ScannerResult(e.Message);
|
return new ScannerResult(e.StackTrace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ namespace YooAsset.Editor
|
|||||||
if (Succeed)
|
if (Succeed)
|
||||||
{
|
{
|
||||||
var reproterWindow = AssetArtReporterWindow.OpenWindow();
|
var reproterWindow = AssetArtReporterWindow.OpenWindow();
|
||||||
reproterWindow.ImportSingleReprotFile(ReprotFilePath);
|
reproterWindow.ImportSingleReprotFile(Report);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,8 +32,9 @@ namespace YooAsset.Editor
|
|||||||
var buildParametersContext = new BuildParametersContext(buildParameters);
|
var buildParametersContext = new BuildParametersContext(buildParameters);
|
||||||
_buildContext.SetContextObject(buildParametersContext);
|
_buildContext.SetContextObject(buildParametersContext);
|
||||||
|
|
||||||
// 初始化日志
|
// 初始化日志系统
|
||||||
BuildLogger.InitLogger(enableLog);
|
string logFilePath = $"{buildParametersContext.GetPipelineOutputDirectory()}/buildInfo.log";
|
||||||
|
BuildLogger.InitLogger(enableLog, logFilePath);
|
||||||
|
|
||||||
// 执行构建流程
|
// 执行构建流程
|
||||||
BuildLogger.Log($"Begin to build package : {buildParameters.PackageName} by {buildParameters.BuildPipeline}");
|
BuildLogger.Log($"Begin to build package : {buildParameters.PackageName} by {buildParameters.BuildPipeline}");
|
||||||
@@ -50,6 +51,9 @@ namespace YooAsset.Editor
|
|||||||
BuildLogger.Error(buildResult.ErrorInfo);
|
BuildLogger.Error(buildResult.ErrorInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 关闭日志系统
|
||||||
|
BuildLogger.Shuntdown();
|
||||||
|
|
||||||
return buildResult;
|
return buildResult;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,97 +6,98 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
public static class AssetBundleBuilderSetting
|
public static class AssetBundleBuilderSetting
|
||||||
{
|
{
|
||||||
// EBuildPipeline
|
// BuildPipelineName
|
||||||
public static EBuildPipeline GetPackageBuildPipeline(string packageName)
|
public static string GetPackageBuildPipeline(string packageName)
|
||||||
{
|
{
|
||||||
string key = $"{Application.productName}_{packageName}_{nameof(EBuildPipeline)}";
|
string key = $"{Application.productName}_{packageName}_BuildPipelineName";
|
||||||
return (EBuildPipeline)EditorPrefs.GetInt(key, (int)EBuildPipeline.BuiltinBuildPipeline);
|
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)}";
|
string key = $"{Application.productName}_{packageName}_BuildPipelineName";
|
||||||
EditorPrefs.SetInt(key, (int)buildPipeline);
|
EditorPrefs.SetString(key, buildPipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ECompressOption
|
// 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)}";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(ECompressOption)}";
|
||||||
return (ECompressOption)EditorPrefs.GetInt(key, (int)ECompressOption.LZ4);
|
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)}";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(ECompressOption)}";
|
||||||
EditorPrefs.SetInt(key, (int)compressOption);
|
EditorPrefs.SetInt(key, (int)compressOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
// EFileNameStyle
|
// 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)}";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EFileNameStyle)}";
|
||||||
return (EFileNameStyle)EditorPrefs.GetInt(key, (int)EFileNameStyle.HashName);
|
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)}";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EFileNameStyle)}";
|
||||||
EditorPrefs.SetInt(key, (int)fileNameStyle);
|
EditorPrefs.SetInt(key, (int)fileNameStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
// EBuildinFileCopyOption
|
// 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)}";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildinFileCopyOption)}";
|
||||||
return (EBuildinFileCopyOption)EditorPrefs.GetInt(key, (int)EBuildinFileCopyOption.None);
|
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)}";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildinFileCopyOption)}";
|
||||||
EditorPrefs.SetInt(key, (int)buildinFileCopyOption);
|
EditorPrefs.SetInt(key, (int)buildinFileCopyOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildFileCopyParams
|
// BuildFileCopyParams
|
||||||
public static string GetPackageBuildinFileCopyParams(string packageName, EBuildPipeline buildPipeline)
|
public static string GetPackageBuildinFileCopyParams(string packageName, string buildPipeline)
|
||||||
{
|
{
|
||||||
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
|
||||||
return EditorPrefs.GetString(key, string.Empty);
|
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";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
|
||||||
EditorPrefs.SetString(key, buildinFileCopyParams);
|
EditorPrefs.SetString(key, buildinFileCopyParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncyptionClassName
|
// EncyptionClassName
|
||||||
public static string GetPackageEncyptionClassName(string packageName, EBuildPipeline buildPipeline)
|
public static string GetPackageEncyptionClassName(string packageName, string buildPipeline)
|
||||||
{
|
{
|
||||||
string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
|
||||||
return EditorPrefs.GetString(key, string.Empty);
|
return EditorPrefs.GetString(key, string.Empty);
|
||||||
}
|
}
|
||||||
public static void SetPackageEncyptionClassName(string packageName, EBuildPipeline buildPipeline, string encyptionClassName)
|
public static void SetPackageEncyptionClassName(string packageName, string buildPipeline, string encyptionClassName)
|
||||||
{
|
{
|
||||||
string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
|
||||||
EditorPrefs.SetString(key, encyptionClassName);
|
EditorPrefs.SetString(key, encyptionClassName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearBuildCache
|
// ClearBuildCache
|
||||||
public static bool GetPackageClearBuildCache(string packageName, EBuildPipeline buildPipeline)
|
public static bool GetPackageClearBuildCache(string packageName, string buildPipeline)
|
||||||
{
|
{
|
||||||
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
|
||||||
return EditorPrefs.GetInt(key, 0) > 0;
|
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";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
|
||||||
EditorPrefs.SetInt(key, clearBuildCache ? 1 : 0);
|
EditorPrefs.SetInt(key, clearBuildCache ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// UseAssetDependencyDB
|
// UseAssetDependencyDB
|
||||||
public static bool GetPackageUseAssetDependencyDB(string packageName, EBuildPipeline buildPipeline)
|
public static bool GetPackageUseAssetDependencyDB(string packageName, string buildPipeline)
|
||||||
{
|
{
|
||||||
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
|
||||||
return EditorPrefs.GetInt(key, 0) > 0;
|
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";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
|
||||||
EditorPrefs.SetInt(key, useAssetDependencyDB ? 1 : 0);
|
EditorPrefs.SetInt(key, useAssetDependencyDB ? 1 : 0);
|
||||||
|
|||||||
@@ -19,7 +19,9 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
|
|
||||||
private string _buildPackage;
|
private string _buildPackage;
|
||||||
private EBuildPipeline _buildPipeline;
|
private string _buildPipeline;
|
||||||
|
|
||||||
|
private Dictionary<string, Type> _viewClassDic = new Dictionary<string, Type>(10);
|
||||||
|
|
||||||
private Toolbar _toolbar;
|
private Toolbar _toolbar;
|
||||||
private ToolbarMenu _packageMenu;
|
private ToolbarMenu _packageMenu;
|
||||||
@@ -69,11 +71,23 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
_pipelineMenu = new ToolbarMenu();
|
_pipelineMenu = new ToolbarMenu();
|
||||||
_pipelineMenu.style.width = 200;
|
_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);
|
_toolbar.Add(_pipelineMenu);
|
||||||
|
|
||||||
|
var viewerClassTypes = EditorTools.GetAssignableTypes(typeof(BuildPipelineViewerBase));
|
||||||
|
foreach (var classType in viewerClassTypes)
|
||||||
|
{
|
||||||
|
var buildPipelineAttribute = EditorTools.GetAttribute<BuildPipelineAttribute>(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();
|
RefreshBuildPipelineView();
|
||||||
@@ -91,28 +105,18 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
_buildPipeline = AssetBundleBuilderSetting.GetPackageBuildPipeline(_buildPackage);
|
_buildPipeline = AssetBundleBuilderSetting.GetPackageBuildPipeline(_buildPackage);
|
||||||
_packageMenu.text = _buildPackage;
|
_packageMenu.text = _buildPackage;
|
||||||
_pipelineMenu.text = _buildPipeline.ToString();
|
_pipelineMenu.text = _buildPipeline;
|
||||||
|
|
||||||
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
if (_viewClassDic.TryGetValue(_buildPipeline, out Type value))
|
||||||
if (_buildPipeline == EBuildPipeline.EditorSimulateBuildPipeline)
|
|
||||||
{
|
{
|
||||||
var viewer = new EditorSimulateBuildPipelineViewer(_buildPackage, buildTarget, _container);
|
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||||
}
|
var viewer = Activator.CreateInstance(value) as BuildPipelineViewerBase;
|
||||||
else if (_buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
viewer.InitView(_buildPackage, _buildPipeline, buildTarget);
|
||||||
{
|
viewer.CreateView(_container);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException(_buildPipeline.ToString());
|
Debug.LogError($"Not found build pipeline : {_buildPipeline}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private List<string> GetBuildPackageNames()
|
private List<string> GetBuildPackageNames()
|
||||||
@@ -145,18 +149,16 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
private void PipelineMenuAction(DropdownMenuAction action)
|
private void PipelineMenuAction(DropdownMenuAction action)
|
||||||
{
|
{
|
||||||
var pipelineType = (EBuildPipeline)action.userData;
|
if (_buildPipeline != action.name)
|
||||||
if (_buildPipeline != pipelineType)
|
|
||||||
{
|
{
|
||||||
_buildPipeline = pipelineType;
|
_buildPipeline = action.name;
|
||||||
AssetBundleBuilderSetting.SetPackageBuildPipeline(_buildPackage, pipelineType);
|
AssetBundleBuilderSetting.SetPackageBuildPipeline(_buildPackage, _buildPipeline);
|
||||||
RefreshBuildPipelineView();
|
RefreshBuildPipelineView();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private DropdownMenuAction.Status PipelineMenuFun(DropdownMenuAction action)
|
private DropdownMenuAction.Status PipelineMenuFun(DropdownMenuAction action)
|
||||||
{
|
{
|
||||||
var pipelineType = (EBuildPipeline)action.userData;
|
if (_buildPipeline == action.name)
|
||||||
if (_buildPipeline == pipelineType)
|
|
||||||
return DropdownMenuAction.Status.Checked;
|
return DropdownMenuAction.Status.Checked;
|
||||||
else
|
else
|
||||||
return DropdownMenuAction.Status.Normal;
|
return DropdownMenuAction.Status.Normal;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace YooAsset.Editor
|
|||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
{
|
{
|
||||||
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
var buildParameters = buildParametersContext.Parameters;
|
var buildParameters = buildParametersContext.Parameters as ScriptableBuildParameters;
|
||||||
|
|
||||||
// 检测基础构建参数
|
// 检测基础构建参数
|
||||||
buildParametersContext.CheckBuildParameters();
|
buildParametersContext.CheckBuildParameters();
|
||||||
@@ -50,6 +50,13 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
BuildLogger.Log($"Create pipeline output directory: {pipelineOutputDirectory}");
|
BuildLogger.Log($"Create pipeline output directory: {pipelineOutputDirectory}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检测内置着色器资源包名称
|
||||||
|
if (string.IsNullOrEmpty(buildParameters.BuiltinShadersBundleName))
|
||||||
|
{
|
||||||
|
string warning = BuildLogger.GetErrorMessage(ErrorCode.BuiltinShadersBundleNameIsNull, $"Builtin shaders bundle name is null. It will cause resource redundancy !");
|
||||||
|
BuildLogger.Warning(warning);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,11 @@ namespace YooAsset.Editor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ECompressOption CompressOption = ECompressOption.Uncompressed;
|
public ECompressOption CompressOption = ECompressOption.Uncompressed;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 从AssetBundle文件头里剥离Unity版本信息
|
||||||
|
/// </summary>
|
||||||
|
public bool StripUnityVersion = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 禁止写入类型树结构(可以降低包体和内存并提高加载效率)
|
/// 禁止写入类型树结构(可以降低包体和内存并提高加载效率)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -70,6 +75,9 @@ namespace YooAsset.Editor
|
|||||||
else
|
else
|
||||||
throw new System.NotImplementedException(CompressOption.ToString());
|
throw new System.NotImplementedException(CompressOption.ToString());
|
||||||
|
|
||||||
|
if (StripUnityVersion)
|
||||||
|
buildParams.ContentBuildFlags |= UnityEditor.Build.Content.ContentBuildFlags.StripUnityVersion;
|
||||||
|
|
||||||
if (DisableWriteTypeTree)
|
if (DisableWriteTypeTree)
|
||||||
buildParams.ContentBuildFlags |= UnityEditor.Build.Content.ContentBuildFlags.DisableWriteTypeTree;
|
buildParams.ContentBuildFlags |= UnityEditor.Build.Content.ContentBuildFlags.DisableWriteTypeTree;
|
||||||
|
|
||||||
|
|||||||
@@ -2,37 +2,100 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
internal static class BuildLogger
|
internal static class BuildLogger
|
||||||
{
|
{
|
||||||
private static bool _enableLog = true;
|
private const int MAX_LOG_BUFFER_SIZE = 1024 * 1024 * 2; //2MB
|
||||||
|
|
||||||
public static void InitLogger(bool enableLog)
|
private static bool _enableLog = true;
|
||||||
|
private static string _logFilePath;
|
||||||
|
|
||||||
|
private static readonly object _lockObj = new object();
|
||||||
|
private static readonly StringBuilder _logBuilder = new StringBuilder(MAX_LOG_BUFFER_SIZE);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化日志系统
|
||||||
|
/// </summary>
|
||||||
|
public static void InitLogger(bool enableLog, string logFilePath)
|
||||||
{
|
{
|
||||||
_enableLog = enableLog;
|
_enableLog = enableLog;
|
||||||
|
_logFilePath = logFilePath;
|
||||||
|
_logBuilder.Clear();
|
||||||
|
|
||||||
|
if (_enableLog)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_logFilePath))
|
||||||
|
throw new Exception("Log file path is null or empty !");
|
||||||
|
|
||||||
|
Debug.Log($"Logger initialized at {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关闭日志系统
|
||||||
|
/// </summary>
|
||||||
|
public static void Shuntdown()
|
||||||
|
{
|
||||||
|
if (_enableLog)
|
||||||
|
{
|
||||||
|
lock (_lockObj)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(_logFilePath))
|
||||||
|
File.Delete(_logFilePath);
|
||||||
|
|
||||||
|
FileUtility.CreateFileDirectory(_logFilePath);
|
||||||
|
File.WriteAllText(_logFilePath, _logBuilder.ToString(), Encoding.UTF8);
|
||||||
|
_logBuilder.Clear();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.LogError($"Failed to write log file: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Log(string message)
|
public static void Log(string message)
|
||||||
{
|
{
|
||||||
if (_enableLog)
|
if (_enableLog)
|
||||||
{
|
{
|
||||||
|
WriteLog("INFO", message);
|
||||||
Debug.Log(message);
|
Debug.Log(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void Warning(string message)
|
public static void Warning(string message)
|
||||||
{
|
{
|
||||||
Debug.LogWarning(message);
|
if (_enableLog)
|
||||||
|
{
|
||||||
|
WriteLog("WARN", message);
|
||||||
|
Debug.LogWarning(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public static void Error(string message)
|
public static void Error(string message)
|
||||||
{
|
{
|
||||||
Debug.LogError(message);
|
if (_enableLog)
|
||||||
|
{
|
||||||
|
WriteLog("ERROR", message);
|
||||||
|
Debug.LogError(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetErrorMessage(ErrorCode code, string message)
|
public static string GetErrorMessage(ErrorCode code, string message)
|
||||||
{
|
{
|
||||||
return $"[ErrorCode{(int)code}] {message}";
|
return $"[ErrorCode{(int)code}] {message}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void WriteLog(string level, string message)
|
||||||
|
{
|
||||||
|
lock (_lockObj)
|
||||||
|
{
|
||||||
|
string logEntry = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} [{level}] {message}";
|
||||||
|
_logBuilder.AppendLine(logEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,7 @@ namespace YooAsset.Editor
|
|||||||
BuildPipelineIsNullOrEmpty = 116,
|
BuildPipelineIsNullOrEmpty = 116,
|
||||||
BuildBundleTypeIsUnknown = 117,
|
BuildBundleTypeIsUnknown = 117,
|
||||||
RecommendScriptBuildPipeline = 130,
|
RecommendScriptBuildPipeline = 130,
|
||||||
|
BuiltinShadersBundleNameIsNull = 131,
|
||||||
|
|
||||||
// TaskGetBuildMap
|
// TaskGetBuildMap
|
||||||
RemoveInvalidTags = 200,
|
RemoveInvalidTags = 200,
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
public interface IBuildPipeline
|
public interface IBuildPipeline
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 运行构建任务
|
||||||
|
/// </summary>
|
||||||
BuildResult Run(BuildParameters buildParameters, bool enableLog);
|
BuildResult Run(BuildParameters buildParameters, bool enableLog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class BuildPipelineAttribute : Attribute
|
||||||
|
{
|
||||||
|
public string PipelineName;
|
||||||
|
|
||||||
|
public BuildPipelineAttribute(string name)
|
||||||
|
{
|
||||||
|
this.PipelineName = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 90d865a5cede7ae43a5fdabdc20af0fd
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -12,190 +12,35 @@ namespace YooAsset.Editor
|
|||||||
{
|
{
|
||||||
internal abstract class BuildPipelineViewerBase
|
internal abstract class BuildPipelineViewerBase
|
||||||
{
|
{
|
||||||
private const int StyleWidth = 400;
|
protected const int StyleWidth = 400;
|
||||||
private const int LabelMinWidth = 180;
|
protected const int LabelMinWidth = 190;
|
||||||
|
|
||||||
protected readonly string PackageName;
|
protected string PackageName { private set; get; }
|
||||||
protected readonly BuildTarget BuildTarget;
|
protected string PipelineName { private set; get; }
|
||||||
protected readonly EBuildPipeline BuildPipeline;
|
protected BuildTarget BuildTarget { private set; get; }
|
||||||
protected TemplateContainer Root;
|
|
||||||
|
|
||||||
private TextField _buildOutputField;
|
/// <summary>
|
||||||
private TextField _buildVersionField;
|
/// 初始化视图
|
||||||
private PopupField<Enum> _buildModeField;
|
/// </summary>
|
||||||
private PopupField<Type> _encryptionField;
|
public void InitView(string packageName, string pipelineName, BuildTarget buildTarget)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
PackageName = packageName;
|
PackageName = packageName;
|
||||||
|
PipelineName = pipelineName;
|
||||||
BuildTarget = buildTarget;
|
BuildTarget = buildTarget;
|
||||||
BuildPipeline = buildPipeline;
|
|
||||||
|
|
||||||
CreateView(parent);
|
|
||||||
RefreshView();
|
|
||||||
}
|
|
||||||
private void CreateView(VisualElement parent)
|
|
||||||
{
|
|
||||||
// 加载布局文件
|
|
||||||
var visualAsset = UxmlLoader.LoadWindowUXML<BuildPipelineViewerBase>();
|
|
||||||
if (visualAsset == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Root = visualAsset.CloneTree();
|
|
||||||
Root.style.flexGrow = 1f;
|
|
||||||
parent.Add(Root);
|
|
||||||
|
|
||||||
// 输出目录
|
|
||||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
_buildOutputField = Root.Q<TextField>("BuildOutput");
|
|
||||||
_buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
|
|
||||||
_buildOutputField.SetEnabled(false);
|
|
||||||
|
|
||||||
// 构建版本
|
|
||||||
_buildVersionField = Root.Q<TextField>("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<Type>(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<Type>();
|
|
||||||
_encryptionField.label = "Encryption";
|
|
||||||
_encryptionField.style.width = StyleWidth;
|
|
||||||
encryptionContainer.Add(_encryptionField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 压缩方式选项
|
|
||||||
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
|
||||||
_compressionField = Root.Q<EnumField>("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<EnumField>("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<EnumField>("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<TextField>("CopyBuildinFileParam");
|
|
||||||
_copyBuildinFileTagsField.SetValueWithoutNotify(buildinFileCopyParams);
|
|
||||||
_copyBuildinFileTagsField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(PackageName, BuildPipeline, _copyBuildinFileTagsField.value);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 清理构建缓存
|
|
||||||
bool clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
|
||||||
_clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
|
||||||
_clearBuildCacheToggle.SetValueWithoutNotify(clearBuildCache);
|
|
||||||
_clearBuildCacheToggle.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSetting.SetPackageClearBuildCache(PackageName, BuildPipeline, _clearBuildCacheToggle.value);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 使用资源依赖数据库
|
|
||||||
bool useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
|
||||||
_useAssetDependencyDBToggle = Root.Q<Toggle>("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<Button>("Build");
|
|
||||||
buildButton.clicked += BuildButton_clicked;
|
|
||||||
}
|
|
||||||
private void RefreshView()
|
|
||||||
{
|
|
||||||
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
|
||||||
bool tagsFiledVisible = buildinFileCopyOption == EBuildinFileCopyOption.ClearAndCopyByTags || buildinFileCopyOption == EBuildinFileCopyOption.OnlyCopyByTags;
|
|
||||||
_copyBuildinFileTagsField.visible = tagsFiledVisible;
|
|
||||||
}
|
|
||||||
private void BuildButton_clicked()
|
|
||||||
{
|
|
||||||
if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{PackageName}]!", "Yes", "No"))
|
|
||||||
{
|
|
||||||
EditorTools.ClearUnityConsole();
|
|
||||||
EditorApplication.delayCall += ExecuteBuild;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.LogWarning("[Build] 打包已经取消");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 执行构建任务
|
/// 创建视图
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected abstract void ExecuteBuild();
|
public abstract void CreateView(VisualElement parent);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取构建版本
|
/// 获取默认版本
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected string GetPackageVersion()
|
protected virtual string GetDefaultPackageVersion()
|
||||||
{
|
{
|
||||||
return _buildVersionField.value;
|
int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
|
||||||
|
return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -203,7 +48,7 @@ namespace YooAsset.Editor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected IEncryptionServices CreateEncryptionInstance()
|
protected IEncryptionServices CreateEncryptionInstance()
|
||||||
{
|
{
|
||||||
var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, BuildPipeline);
|
var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, PipelineName);
|
||||||
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
|
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
|
||||||
var classType = encryptionClassTypes.Find(x => x.FullName.Equals(encyptionClassName));
|
var classType = encryptionClassTypes.Find(x => x.FullName.Equals(encyptionClassName));
|
||||||
if (classType != null)
|
if (classType != null)
|
||||||
@@ -212,11 +57,130 @@ namespace YooAsset.Editor
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetDefaultPackageVersion()
|
#region UI元素通用处理方法
|
||||||
|
protected void SetBuildOutputField(TextField textField)
|
||||||
{
|
{
|
||||||
int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
|
// 输出目录
|
||||||
return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes;
|
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
textField.SetValueWithoutNotify(defaultOutputRoot);
|
||||||
|
textField.SetEnabled(false);
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(textField, LabelMinWidth);
|
||||||
}
|
}
|
||||||
|
protected void SetBuildVersionField(TextField textField)
|
||||||
|
{
|
||||||
|
// 构建版本
|
||||||
|
textField.style.width = StyleWidth;
|
||||||
|
textField.SetValueWithoutNotify(GetDefaultPackageVersion());
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(textField, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected void SetCompressionField(EnumField enumField)
|
||||||
|
{
|
||||||
|
// 压缩方式选项
|
||||||
|
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, PipelineName);
|
||||||
|
enumField.Init(compressOption);
|
||||||
|
enumField.SetValueWithoutNotify(compressOption);
|
||||||
|
enumField.style.width = StyleWidth;
|
||||||
|
enumField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageCompressOption(PackageName, PipelineName, (ECompressOption)enumField.value);
|
||||||
|
});
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(enumField, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected void SetOutputNameStyleField(EnumField enumField)
|
||||||
|
{
|
||||||
|
// 输出文件名称样式
|
||||||
|
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, PipelineName);
|
||||||
|
enumField.Init(fileNameStyle);
|
||||||
|
enumField.SetValueWithoutNotify(fileNameStyle);
|
||||||
|
enumField.style.width = StyleWidth;
|
||||||
|
enumField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageFileNameStyle(PackageName, PipelineName, (EFileNameStyle)enumField.value);
|
||||||
|
});
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(enumField, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected void SetCopyBuildinFileOptionField(EnumField enumField, TextField tagField)
|
||||||
|
{
|
||||||
|
// 首包文件拷贝选项
|
||||||
|
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, PipelineName);
|
||||||
|
enumField.Init(buildinFileCopyOption);
|
||||||
|
enumField.SetValueWithoutNotify(buildinFileCopyOption);
|
||||||
|
enumField.style.width = StyleWidth;
|
||||||
|
enumField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(PackageName, PipelineName, (EBuildinFileCopyOption)enumField.value);
|
||||||
|
|
||||||
|
// 设置内置资源标签显隐
|
||||||
|
bool tagsFiledVisible = buildinFileCopyOption == EBuildinFileCopyOption.ClearAndCopyByTags || buildinFileCopyOption == EBuildinFileCopyOption.OnlyCopyByTags;
|
||||||
|
tagField.visible = tagsFiledVisible;
|
||||||
|
});
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(enumField, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected void SetCopyBuildinFileTagsField(TextField textField)
|
||||||
|
{
|
||||||
|
// 首包文件拷贝参数
|
||||||
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, PipelineName);
|
||||||
|
textField.SetValueWithoutNotify(buildinFileCopyParams);
|
||||||
|
textField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(PackageName, PipelineName, textField.value);
|
||||||
|
});
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(textField, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected void SetClearBuildCacheToggle(Toggle toggle)
|
||||||
|
{
|
||||||
|
// 清理构建缓存
|
||||||
|
bool clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, PipelineName);
|
||||||
|
toggle.SetValueWithoutNotify(clearBuildCache);
|
||||||
|
toggle.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageClearBuildCache(PackageName, PipelineName, toggle.value);
|
||||||
|
});
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(toggle, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected void SetUseAssetDependencyDBToggle(Toggle toggle)
|
||||||
|
{
|
||||||
|
// 使用资源依赖数据库
|
||||||
|
bool useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, PipelineName);
|
||||||
|
toggle.SetValueWithoutNotify(useAssetDependencyDB);
|
||||||
|
toggle.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(PackageName, PipelineName, toggle.value);
|
||||||
|
});
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(toggle, LabelMinWidth);
|
||||||
|
}
|
||||||
|
protected PopupField<Type> CreateEncryptionField(VisualElement container)
|
||||||
|
{
|
||||||
|
// 加密方法
|
||||||
|
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
|
||||||
|
if (encryptionClassTypes.Count > 0)
|
||||||
|
{
|
||||||
|
var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, PipelineName);
|
||||||
|
int defaultIndex = encryptionClassTypes.FindIndex(x => x.FullName.Equals(encyptionClassName));
|
||||||
|
if (defaultIndex < 0)
|
||||||
|
defaultIndex = 0;
|
||||||
|
var encryptionField = new PopupField<Type>(encryptionClassTypes, defaultIndex);
|
||||||
|
encryptionField.label = "Encryption";
|
||||||
|
encryptionField.style.width = StyleWidth;
|
||||||
|
encryptionField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageEncyptionClassName(PackageName, PipelineName, encryptionField.value.FullName);
|
||||||
|
});
|
||||||
|
container.Add(encryptionField);
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(encryptionField, LabelMinWidth);
|
||||||
|
return encryptionField;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var encryptionField = new PopupField<Type>();
|
||||||
|
encryptionField.label = "Encryption";
|
||||||
|
encryptionField.style.width = StyleWidth;
|
||||||
|
container.Add(encryptionField);
|
||||||
|
UIElementsTools.SetElementLabelMinWidth(encryptionField, LabelMinWidth);
|
||||||
|
return encryptionField;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 5280dfac6a481ee429c769ba5688c9d2
|
guid: e2e1fae9b05cc554e9ebfee01f2b9333
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
#if UNITY_2019_4_OR_NEWER
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[BuildPipelineAttribute(nameof(EBuildPipeline.BuiltinBuildPipeline))]
|
||||||
|
internal class BuiltinBuildPipelineViewer : BuildPipelineViewerBase
|
||||||
|
{
|
||||||
|
protected TemplateContainer Root;
|
||||||
|
protected TextField _buildOutputField;
|
||||||
|
protected TextField _buildVersionField;
|
||||||
|
protected PopupField<Type> _encryptionField;
|
||||||
|
protected EnumField _compressionField;
|
||||||
|
protected EnumField _outputNameStyleField;
|
||||||
|
protected EnumField _copyBuildinFileOptionField;
|
||||||
|
protected TextField _copyBuildinFileTagsField;
|
||||||
|
protected Toggle _clearBuildCacheToggle;
|
||||||
|
protected Toggle _useAssetDependencyDBToggle;
|
||||||
|
|
||||||
|
public override void CreateView(VisualElement parent)
|
||||||
|
{
|
||||||
|
// 加载布局文件
|
||||||
|
var visualAsset = UxmlLoader.LoadWindowUXML<BuiltinBuildPipelineViewer>();
|
||||||
|
if (visualAsset == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Root = visualAsset.CloneTree();
|
||||||
|
Root.style.flexGrow = 1f;
|
||||||
|
parent.Add(Root);
|
||||||
|
|
||||||
|
// 输出目录
|
||||||
|
_buildOutputField = Root.Q<TextField>("BuildOutput");
|
||||||
|
SetBuildOutputField(_buildOutputField);
|
||||||
|
|
||||||
|
// 构建版本
|
||||||
|
_buildVersionField = Root.Q<TextField>("BuildVersion");
|
||||||
|
SetBuildVersionField(_buildVersionField);
|
||||||
|
|
||||||
|
// 加密方法
|
||||||
|
var encryptionContainer = Root.Q("EncryptionContainer");
|
||||||
|
_encryptionField = CreateEncryptionField(encryptionContainer);
|
||||||
|
|
||||||
|
// 压缩方式选项
|
||||||
|
_compressionField = Root.Q<EnumField>("Compression");
|
||||||
|
SetCompressionField(_compressionField);
|
||||||
|
|
||||||
|
// 输出文件名称样式
|
||||||
|
_outputNameStyleField = Root.Q<EnumField>("FileNameStyle");
|
||||||
|
SetOutputNameStyleField(_outputNameStyleField);
|
||||||
|
|
||||||
|
// 首包文件拷贝参数
|
||||||
|
_copyBuildinFileTagsField = Root.Q<TextField>("CopyBuildinFileParam");
|
||||||
|
SetCopyBuildinFileTagsField(_copyBuildinFileTagsField);
|
||||||
|
|
||||||
|
// 首包文件拷贝选项
|
||||||
|
_copyBuildinFileOptionField = Root.Q<EnumField>("CopyBuildinFileOption");
|
||||||
|
SetCopyBuildinFileOptionField(_copyBuildinFileOptionField, _copyBuildinFileTagsField);
|
||||||
|
|
||||||
|
// 清理构建缓存
|
||||||
|
_clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
||||||
|
SetClearBuildCacheToggle(_clearBuildCacheToggle);
|
||||||
|
|
||||||
|
// 使用资源依赖数据库
|
||||||
|
_useAssetDependencyDBToggle = Root.Q<Toggle>("UseAssetDependency");
|
||||||
|
SetUseAssetDependencyDBToggle(_useAssetDependencyDBToggle);
|
||||||
|
|
||||||
|
// 构建按钮
|
||||||
|
var buildButton = Root.Q<Button>("Build");
|
||||||
|
buildButton.clicked += BuildButton_clicked;
|
||||||
|
}
|
||||||
|
private void BuildButton_clicked()
|
||||||
|
{
|
||||||
|
if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{PackageName}]!", "Yes", "No"))
|
||||||
|
{
|
||||||
|
EditorTools.ClearUnityConsole();
|
||||||
|
EditorApplication.delayCall += ExecuteBuild;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[Build] 打包已经取消");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行构建
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void ExecuteBuild()
|
||||||
|
{
|
||||||
|
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, PipelineName);
|
||||||
|
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, PipelineName);
|
||||||
|
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, PipelineName);
|
||||||
|
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, PipelineName);
|
||||||
|
|
||||||
|
BuiltinBuildParameters buildParameters = new BuiltinBuildParameters();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = PipelineName.ToString();
|
||||||
|
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
|
||||||
|
buildParameters.BuildTarget = BuildTarget;
|
||||||
|
buildParameters.PackageName = PackageName;
|
||||||
|
buildParameters.PackageVersion = _buildVersionField.value;
|
||||||
|
buildParameters.EnableSharePackRule = true;
|
||||||
|
buildParameters.VerifyBuildingResult = true;
|
||||||
|
buildParameters.FileNameStyle = fileNameStyle;
|
||||||
|
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
||||||
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
|
buildParameters.CompressOption = compressOption;
|
||||||
|
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
||||||
|
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
|
BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, true);
|
||||||
|
if (buildResult.Success)
|
||||||
|
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 86d0df373d425b449a3bbc42b4b2e5bb
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
#if UNITY_2019_4_OR_NEWER
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEditor;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEditor.UIElements;
|
|
||||||
using UnityEngine.UIElements;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
|
||||||
{
|
|
||||||
internal class BuiltinBuildPipelineViewer : BuildPipelineViewerBase
|
|
||||||
{
|
|
||||||
public BuiltinBuildPipelineViewer(string packageName, BuildTarget buildTarget, VisualElement parent)
|
|
||||||
: base(packageName, EBuildPipeline.BuiltinBuildPipeline, buildTarget, parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 执行构建
|
|
||||||
/// </summary>
|
|
||||||
protected override void ExecuteBuild()
|
|
||||||
{
|
|
||||||
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
|
||||||
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
|
||||||
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
|
||||||
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
|
||||||
|
|
||||||
BuiltinBuildParameters buildParameters = new BuiltinBuildParameters();
|
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
|
||||||
buildParameters.BuildPipeline = BuildPipeline.ToString();
|
|
||||||
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
|
|
||||||
buildParameters.BuildTarget = BuildTarget;
|
|
||||||
buildParameters.PackageName = PackageName;
|
|
||||||
buildParameters.PackageVersion = GetPackageVersion();
|
|
||||||
buildParameters.EnableSharePackRule = true;
|
|
||||||
buildParameters.VerifyBuildingResult = true;
|
|
||||||
buildParameters.FileNameStyle = fileNameStyle;
|
|
||||||
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
|
||||||
buildParameters.CompressOption = compressOption;
|
|
||||||
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
|
||||||
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
|
||||||
|
|
||||||
BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline();
|
|
||||||
var buildResult = pipeline.Run(buildParameters, true);
|
|
||||||
if (buildResult.Success)
|
|
||||||
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 33b6cb215b1d7bb4888cb3455b500399
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
#if UNITY_2019_4_OR_NEWER
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[BuildPipelineAttribute(nameof(EBuildPipeline.EditorSimulateBuildPipeline))]
|
||||||
|
internal class EditorSimulateBuildPipelineViewer : BuildPipelineViewerBase
|
||||||
|
{
|
||||||
|
protected TemplateContainer Root;
|
||||||
|
protected TextField _buildOutputField;
|
||||||
|
protected TextField _buildVersionField;
|
||||||
|
|
||||||
|
public override void CreateView(VisualElement parent)
|
||||||
|
{
|
||||||
|
// 加载布局文件
|
||||||
|
var visualAsset = UxmlLoader.LoadWindowUXML<EditorSimulateBuildPipelineViewer>();
|
||||||
|
if (visualAsset == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Root = visualAsset.CloneTree();
|
||||||
|
Root.style.flexGrow = 1f;
|
||||||
|
parent.Add(Root);
|
||||||
|
|
||||||
|
// 输出目录
|
||||||
|
_buildOutputField = Root.Q<TextField>("BuildOutput");
|
||||||
|
SetBuildOutputField(_buildOutputField);
|
||||||
|
|
||||||
|
// 构建版本
|
||||||
|
_buildVersionField = Root.Q<TextField>("BuildVersion");
|
||||||
|
SetBuildVersionField(_buildVersionField);
|
||||||
|
|
||||||
|
// 构建按钮
|
||||||
|
var buildButton = Root.Q<Button>("Build");
|
||||||
|
buildButton.clicked += BuildButton_clicked;
|
||||||
|
}
|
||||||
|
private void BuildButton_clicked()
|
||||||
|
{
|
||||||
|
if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{PackageName}]!", "Yes", "No"))
|
||||||
|
{
|
||||||
|
EditorTools.ClearUnityConsole();
|
||||||
|
EditorApplication.delayCall += ExecuteBuild;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[Build] 打包已经取消");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行构建
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void ExecuteBuild()
|
||||||
|
{
|
||||||
|
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, PipelineName);
|
||||||
|
|
||||||
|
EditorSimulateBuildParameters buildParameters = new EditorSimulateBuildParameters();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = PipelineName.ToString();
|
||||||
|
buildParameters.BuildBundleType = (int)EBuildBundleType.VirtualBundle;
|
||||||
|
buildParameters.BuildTarget = BuildTarget;
|
||||||
|
buildParameters.PackageName = PackageName;
|
||||||
|
buildParameters.PackageVersion = _buildVersionField.value;
|
||||||
|
buildParameters.VerifyBuildingResult = true;
|
||||||
|
buildParameters.FileNameStyle = fileNameStyle;
|
||||||
|
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
||||||
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
|
EditorSimulateBuildPipeline pipeline = new EditorSimulateBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, true);
|
||||||
|
if (buildResult.Success)
|
||||||
|
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True">
|
||||||
|
<ui:VisualElement name="BuildContainer">
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Build Version" name="BuildVersion" />
|
||||||
|
<ui:VisualElement name="ExtensionContainer" />
|
||||||
|
<ui:Button text="Click Build" display-tooltip-when-elided="true" name="Build" style="height: 50px; background-color: rgb(40, 106, 42); margin-top: 10px;" />
|
||||||
|
</ui:VisualElement>
|
||||||
|
</ui:UXML>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 90cc4546b2b8afe4e8c864c132a999a9
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
#if UNITY_2019_4_OR_NEWER
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEditor;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEditor.UIElements;
|
|
||||||
using UnityEngine.UIElements;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
|
||||||
{
|
|
||||||
internal class EditorSimulateBuildPipelineViewer : BuildPipelineViewerBase
|
|
||||||
{
|
|
||||||
public EditorSimulateBuildPipelineViewer(string packageName, BuildTarget buildTarget, VisualElement parent)
|
|
||||||
: base(packageName, EBuildPipeline.RawFileBuildPipeline, buildTarget, parent)
|
|
||||||
{
|
|
||||||
var compressionField = Root.Q<EnumField>("Compression");
|
|
||||||
UIElementsTools.SetElementVisible(compressionField, false);
|
|
||||||
|
|
||||||
var encryptionContainer = Root.Q<VisualElement>("EncryptionContainer");
|
|
||||||
UIElementsTools.SetElementVisible(encryptionContainer, false);
|
|
||||||
|
|
||||||
var fileNameStyleField = Root.Q<EnumField>("FileNameStyle");
|
|
||||||
UIElementsTools.SetElementVisible(fileNameStyleField, false);
|
|
||||||
|
|
||||||
var copyBuildinFileOptionField = Root.Q<EnumField>("CopyBuildinFileOption");
|
|
||||||
UIElementsTools.SetElementVisible(copyBuildinFileOptionField, false);
|
|
||||||
|
|
||||||
var copyBuildinFileParamField = Root.Q<TextField>("CopyBuildinFileParam");
|
|
||||||
UIElementsTools.SetElementVisible(copyBuildinFileParamField, false);
|
|
||||||
|
|
||||||
var clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
|
||||||
UIElementsTools.SetElementVisible(clearBuildCacheToggle, false);
|
|
||||||
|
|
||||||
var useAssetDependencyToggle = Root.Q<Toggle>("UseAssetDependency");
|
|
||||||
UIElementsTools.SetElementVisible(useAssetDependencyToggle, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 执行构建
|
|
||||||
/// </summary>
|
|
||||||
protected override void ExecuteBuild()
|
|
||||||
{
|
|
||||||
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
|
||||||
|
|
||||||
EditorSimulateBuildParameters buildParameters = new EditorSimulateBuildParameters();
|
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
|
||||||
buildParameters.BuildPipeline = BuildPipeline.ToString();
|
|
||||||
buildParameters.BuildBundleType = (int)EBuildBundleType.VirtualBundle;
|
|
||||||
buildParameters.BuildTarget = BuildTarget;
|
|
||||||
buildParameters.PackageName = PackageName;
|
|
||||||
buildParameters.PackageVersion = GetPackageVersion();
|
|
||||||
buildParameters.VerifyBuildingResult = true;
|
|
||||||
buildParameters.FileNameStyle = fileNameStyle;
|
|
||||||
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
|
||||||
|
|
||||||
EditorSimulateBuildPipeline pipeline = new EditorSimulateBuildPipeline();
|
|
||||||
var buildResult = pipeline.Run(buildParameters, true);
|
|
||||||
if (buildResult.Success)
|
|
||||||
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 56adb3acd233fe5468af213a4c41de6a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
#if UNITY_2019_4_OR_NEWER
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[BuildPipelineAttribute(nameof(EBuildPipeline.RawFileBuildPipeline))]
|
||||||
|
internal class RawfileBuildpipelineViewer : BuildPipelineViewerBase
|
||||||
|
{
|
||||||
|
protected TemplateContainer Root;
|
||||||
|
protected TextField _buildOutputField;
|
||||||
|
protected TextField _buildVersionField;
|
||||||
|
protected PopupField<Type> _encryptionField;
|
||||||
|
protected EnumField _outputNameStyleField;
|
||||||
|
protected EnumField _copyBuildinFileOptionField;
|
||||||
|
protected TextField _copyBuildinFileTagsField;
|
||||||
|
protected Toggle _clearBuildCacheToggle;
|
||||||
|
protected Toggle _useAssetDependencyDBToggle;
|
||||||
|
|
||||||
|
public override void CreateView(VisualElement parent)
|
||||||
|
{
|
||||||
|
// 加载布局文件
|
||||||
|
var visualAsset = UxmlLoader.LoadWindowUXML<RawfileBuildpipelineViewer>();
|
||||||
|
if (visualAsset == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Root = visualAsset.CloneTree();
|
||||||
|
Root.style.flexGrow = 1f;
|
||||||
|
parent.Add(Root);
|
||||||
|
|
||||||
|
// 输出目录
|
||||||
|
_buildOutputField = Root.Q<TextField>("BuildOutput");
|
||||||
|
SetBuildOutputField(_buildOutputField);
|
||||||
|
|
||||||
|
// 构建版本
|
||||||
|
_buildVersionField = Root.Q<TextField>("BuildVersion");
|
||||||
|
SetBuildVersionField(_buildVersionField);
|
||||||
|
|
||||||
|
// 加密方法
|
||||||
|
var encryptionContainer = Root.Q("EncryptionContainer");
|
||||||
|
_encryptionField = CreateEncryptionField(encryptionContainer);
|
||||||
|
|
||||||
|
// 输出文件名称样式
|
||||||
|
_outputNameStyleField = Root.Q<EnumField>("FileNameStyle");
|
||||||
|
SetOutputNameStyleField(_outputNameStyleField);
|
||||||
|
|
||||||
|
// 首包文件拷贝参数
|
||||||
|
_copyBuildinFileTagsField = Root.Q<TextField>("CopyBuildinFileParam");
|
||||||
|
SetCopyBuildinFileTagsField(_copyBuildinFileTagsField);
|
||||||
|
|
||||||
|
// 首包文件拷贝选项
|
||||||
|
_copyBuildinFileOptionField = Root.Q<EnumField>("CopyBuildinFileOption");
|
||||||
|
SetCopyBuildinFileOptionField(_copyBuildinFileOptionField, _copyBuildinFileTagsField);
|
||||||
|
|
||||||
|
// 清理构建缓存
|
||||||
|
_clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
||||||
|
SetClearBuildCacheToggle(_clearBuildCacheToggle);
|
||||||
|
|
||||||
|
// 使用资源依赖数据库
|
||||||
|
_useAssetDependencyDBToggle = Root.Q<Toggle>("UseAssetDependency");
|
||||||
|
SetUseAssetDependencyDBToggle(_useAssetDependencyDBToggle);
|
||||||
|
|
||||||
|
// 构建按钮
|
||||||
|
var buildButton = Root.Q<Button>("Build");
|
||||||
|
buildButton.clicked += BuildButton_clicked;
|
||||||
|
}
|
||||||
|
private void BuildButton_clicked()
|
||||||
|
{
|
||||||
|
if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{PackageName}]!", "Yes", "No"))
|
||||||
|
{
|
||||||
|
EditorTools.ClearUnityConsole();
|
||||||
|
EditorApplication.delayCall += ExecuteBuild;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[Build] 打包已经取消");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行构建
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void ExecuteBuild()
|
||||||
|
{
|
||||||
|
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, PipelineName);
|
||||||
|
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, PipelineName);
|
||||||
|
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, PipelineName);
|
||||||
|
|
||||||
|
RawFileBuildParameters buildParameters = new RawFileBuildParameters();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = PipelineName.ToString();
|
||||||
|
buildParameters.BuildBundleType = (int)EBuildBundleType.RawBundle;
|
||||||
|
buildParameters.BuildTarget = BuildTarget;
|
||||||
|
buildParameters.PackageName = PackageName;
|
||||||
|
buildParameters.PackageVersion = _buildVersionField.value;
|
||||||
|
buildParameters.VerifyBuildingResult = true;
|
||||||
|
buildParameters.FileNameStyle = fileNameStyle;
|
||||||
|
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
||||||
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
|
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
||||||
|
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
|
RawFileBuildPipeline pipeline = new RawFileBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, true);
|
||||||
|
if (buildResult.Success)
|
||||||
|
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True">
|
||||||
|
<ui:VisualElement name="BuildContainer">
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Build Version" name="BuildVersion" />
|
||||||
|
<ui:Toggle label="Clear Build Cache" name="ClearBuildCache" />
|
||||||
|
<ui:Toggle label="Use Asset Depend DB" name="UseAssetDependency" />
|
||||||
|
<ui:VisualElement name="EncryptionContainer" style="height: 24px;" />
|
||||||
|
<uie:EnumField label="File Name Style" value="Center" name="FileNameStyle" />
|
||||||
|
<uie:EnumField label="Copy Buildin File Option" value="Center" name="CopyBuildinFileOption" />
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Copy Buildin File Param" name="CopyBuildinFileParam" />
|
||||||
|
<ui:VisualElement name="ExtensionContainer" />
|
||||||
|
<ui:Button text="Click Build" display-tooltip-when-elided="true" name="Build" style="height: 50px; background-color: rgb(40, 106, 42); margin-top: 10px;" />
|
||||||
|
</ui:VisualElement>
|
||||||
|
</ui:UXML>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8ed3387ab250c814e9797164c9a4b89a
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#if UNITY_2019_4_OR_NEWER
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEditor;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEditor.UIElements;
|
|
||||||
using UnityEngine.UIElements;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
|
||||||
{
|
|
||||||
internal class RawfileBuildpipelineViewer : BuildPipelineViewerBase
|
|
||||||
{
|
|
||||||
public RawfileBuildpipelineViewer(string packageName, BuildTarget buildTarget, VisualElement parent)
|
|
||||||
: base(packageName, EBuildPipeline.RawFileBuildPipeline, buildTarget, parent)
|
|
||||||
{
|
|
||||||
var compressionField = Root.Q<EnumField>("Compression");
|
|
||||||
UIElementsTools.SetElementVisible(compressionField, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 执行构建
|
|
||||||
/// </summary>
|
|
||||||
protected override void ExecuteBuild()
|
|
||||||
{
|
|
||||||
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
|
||||||
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
|
||||||
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
|
||||||
|
|
||||||
RawFileBuildParameters buildParameters = new RawFileBuildParameters();
|
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
|
||||||
buildParameters.BuildPipeline = BuildPipeline.ToString();
|
|
||||||
buildParameters.BuildBundleType = (int)EBuildBundleType.RawBundle;
|
|
||||||
buildParameters.BuildTarget = BuildTarget;
|
|
||||||
buildParameters.PackageName = PackageName;
|
|
||||||
buildParameters.PackageVersion = GetPackageVersion();
|
|
||||||
buildParameters.VerifyBuildingResult = true;
|
|
||||||
buildParameters.FileNameStyle = fileNameStyle;
|
|
||||||
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
|
||||||
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
|
||||||
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
|
||||||
|
|
||||||
RawFileBuildPipeline pipeline = new RawFileBuildPipeline();
|
|
||||||
var buildResult = pipeline.Run(buildParameters, true);
|
|
||||||
if (buildResult.Success)
|
|
||||||
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: be39d027dec0b2f41ab1dba7effb1a9c
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
#if UNITY_2019_4_OR_NEWER
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[BuildPipelineAttribute(nameof(EBuildPipeline.ScriptableBuildPipeline))]
|
||||||
|
internal class ScriptableBuildPipelineViewer : BuildPipelineViewerBase
|
||||||
|
{
|
||||||
|
protected TemplateContainer Root;
|
||||||
|
protected TextField _buildOutputField;
|
||||||
|
protected TextField _buildVersionField;
|
||||||
|
protected PopupField<Type> _encryptionField;
|
||||||
|
protected EnumField _compressionField;
|
||||||
|
protected EnumField _outputNameStyleField;
|
||||||
|
protected EnumField _copyBuildinFileOptionField;
|
||||||
|
protected TextField _copyBuildinFileTagsField;
|
||||||
|
protected Toggle _clearBuildCacheToggle;
|
||||||
|
protected Toggle _useAssetDependencyDBToggle;
|
||||||
|
|
||||||
|
public override void CreateView(VisualElement parent)
|
||||||
|
{
|
||||||
|
// 加载布局文件
|
||||||
|
var visualAsset = UxmlLoader.LoadWindowUXML<ScriptableBuildPipelineViewer>();
|
||||||
|
if (visualAsset == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Root = visualAsset.CloneTree();
|
||||||
|
Root.style.flexGrow = 1f;
|
||||||
|
parent.Add(Root);
|
||||||
|
|
||||||
|
// 输出目录
|
||||||
|
_buildOutputField = Root.Q<TextField>("BuildOutput");
|
||||||
|
SetBuildOutputField(_buildOutputField);
|
||||||
|
|
||||||
|
// 构建版本
|
||||||
|
_buildVersionField = Root.Q<TextField>("BuildVersion");
|
||||||
|
SetBuildVersionField(_buildVersionField);
|
||||||
|
|
||||||
|
// 加密方法
|
||||||
|
var encryptionContainer = Root.Q("EncryptionContainer");
|
||||||
|
_encryptionField = CreateEncryptionField(encryptionContainer);
|
||||||
|
|
||||||
|
// 压缩方式选项
|
||||||
|
_compressionField = Root.Q<EnumField>("Compression");
|
||||||
|
SetCompressionField(_compressionField);
|
||||||
|
|
||||||
|
// 输出文件名称样式
|
||||||
|
_outputNameStyleField = Root.Q<EnumField>("FileNameStyle");
|
||||||
|
SetOutputNameStyleField(_outputNameStyleField);
|
||||||
|
|
||||||
|
// 首包文件拷贝参数
|
||||||
|
_copyBuildinFileTagsField = Root.Q<TextField>("CopyBuildinFileParam");
|
||||||
|
SetCopyBuildinFileTagsField(_copyBuildinFileTagsField);
|
||||||
|
|
||||||
|
// 首包文件拷贝选项
|
||||||
|
_copyBuildinFileOptionField = Root.Q<EnumField>("CopyBuildinFileOption");
|
||||||
|
SetCopyBuildinFileOptionField(_copyBuildinFileOptionField, _copyBuildinFileTagsField);
|
||||||
|
|
||||||
|
// 清理构建缓存
|
||||||
|
_clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
||||||
|
SetClearBuildCacheToggle(_clearBuildCacheToggle);
|
||||||
|
|
||||||
|
// 使用资源依赖数据库
|
||||||
|
_useAssetDependencyDBToggle = Root.Q<Toggle>("UseAssetDependency");
|
||||||
|
SetUseAssetDependencyDBToggle(_useAssetDependencyDBToggle);
|
||||||
|
|
||||||
|
// 构建按钮
|
||||||
|
var buildButton = Root.Q<Button>("Build");
|
||||||
|
buildButton.clicked += BuildButton_clicked;
|
||||||
|
}
|
||||||
|
private void BuildButton_clicked()
|
||||||
|
{
|
||||||
|
if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{PackageName}]!", "Yes", "No"))
|
||||||
|
{
|
||||||
|
EditorTools.ClearUnityConsole();
|
||||||
|
EditorApplication.delayCall += ExecuteBuild;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning("[Build] 打包已经取消");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行构建
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void ExecuteBuild()
|
||||||
|
{
|
||||||
|
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, PipelineName);
|
||||||
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, PipelineName);
|
||||||
|
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, PipelineName);
|
||||||
|
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, PipelineName);
|
||||||
|
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, PipelineName);
|
||||||
|
var builtinShaderBundleName = GetBuiltinShaderBundleName();
|
||||||
|
|
||||||
|
ScriptableBuildParameters buildParameters = new ScriptableBuildParameters();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = PipelineName.ToString();
|
||||||
|
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
|
||||||
|
buildParameters.BuildTarget = BuildTarget;
|
||||||
|
buildParameters.PackageName = PackageName;
|
||||||
|
buildParameters.PackageVersion = _buildVersionField.value;
|
||||||
|
buildParameters.EnableSharePackRule = true;
|
||||||
|
buildParameters.VerifyBuildingResult = true;
|
||||||
|
buildParameters.FileNameStyle = fileNameStyle;
|
||||||
|
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
||||||
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
|
buildParameters.CompressOption = compressOption;
|
||||||
|
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
||||||
|
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
|
buildParameters.BuiltinShadersBundleName = builtinShaderBundleName;
|
||||||
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
|
ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, true);
|
||||||
|
if (buildResult.Success)
|
||||||
|
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 内置着色器资源包名称
|
||||||
|
/// 注意:和自动收集的着色器资源包名保持一致!
|
||||||
|
/// </summary>
|
||||||
|
protected string GetBuiltinShaderBundleName()
|
||||||
|
{
|
||||||
|
var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName;
|
||||||
|
var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
|
||||||
|
return packRuleResult.GetBundleName(PackageName, uniqueBundleName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True">
|
||||||
|
<ui:VisualElement name="BuildContainer">
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Build Version" name="BuildVersion" />
|
||||||
|
<ui:Toggle label="Clear Build Cache" name="ClearBuildCache" />
|
||||||
|
<ui:Toggle label="Use Asset Depend DB" name="UseAssetDependency" />
|
||||||
|
<ui:VisualElement name="EncryptionContainer" style="height: 24px;" />
|
||||||
|
<uie:EnumField label="Compression" value="Center" name="Compression" />
|
||||||
|
<uie:EnumField label="File Name Style" value="Center" name="FileNameStyle" />
|
||||||
|
<uie:EnumField label="Copy Buildin File Option" value="Center" name="CopyBuildinFileOption" />
|
||||||
|
<ui:TextField picking-mode="Ignore" label="Copy Buildin File Param" name="CopyBuildinFileParam" />
|
||||||
|
<ui:VisualElement name="ExtensionContainer" />
|
||||||
|
<ui:Button text="Click Build" display-tooltip-when-elided="true" name="Build" style="height: 50px; background-color: rgb(40, 106, 42); margin-top: 10px;" />
|
||||||
|
</ui:VisualElement>
|
||||||
|
</ui:UXML>
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
#if UNITY_2019_4_OR_NEWER
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEditor;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEditor.UIElements;
|
|
||||||
using UnityEngine.UIElements;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
|
||||||
{
|
|
||||||
internal class ScriptableBuildPipelineViewer : BuildPipelineViewerBase
|
|
||||||
{
|
|
||||||
public ScriptableBuildPipelineViewer(string packageName, BuildTarget buildTarget, VisualElement parent)
|
|
||||||
: base(packageName, EBuildPipeline.ScriptableBuildPipeline, buildTarget, parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 执行构建
|
|
||||||
/// </summary>
|
|
||||||
protected override void ExecuteBuild()
|
|
||||||
{
|
|
||||||
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
|
||||||
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
|
||||||
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
|
||||||
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
|
||||||
var builtinShaderBundleName = GetBuiltinShaderBundleName();
|
|
||||||
|
|
||||||
ScriptableBuildParameters buildParameters = new ScriptableBuildParameters();
|
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
|
||||||
buildParameters.BuildPipeline = BuildPipeline.ToString();
|
|
||||||
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
|
|
||||||
buildParameters.BuildTarget = BuildTarget;
|
|
||||||
buildParameters.PackageName = PackageName;
|
|
||||||
buildParameters.PackageVersion = GetPackageVersion();
|
|
||||||
buildParameters.EnableSharePackRule = true;
|
|
||||||
buildParameters.VerifyBuildingResult = true;
|
|
||||||
buildParameters.FileNameStyle = fileNameStyle;
|
|
||||||
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
|
||||||
buildParameters.CompressOption = compressOption;
|
|
||||||
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
|
||||||
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
|
||||||
buildParameters.BuiltinShadersBundleName = builtinShaderBundleName;
|
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
|
||||||
|
|
||||||
ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline();
|
|
||||||
var buildResult = pipeline.Run(buildParameters, true);
|
|
||||||
if (buildResult.Success)
|
|
||||||
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 内置着色器资源包名称
|
|
||||||
/// 注意:和自动收集的着色器资源包名保持一致!
|
|
||||||
/// </summary>
|
|
||||||
private string GetBuiltinShaderBundleName()
|
|
||||||
{
|
|
||||||
var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName;
|
|
||||||
var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
|
|
||||||
return packRuleResult.GetBundleName(PackageName, uniqueBundleName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -259,10 +259,13 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
private List<string> GetAssetTags(AssetBundleCollectorGroup group)
|
private List<string> GetAssetTags(AssetBundleCollectorGroup group)
|
||||||
{
|
{
|
||||||
List<string> tags = EditorTools.StringToStringList(group.AssetTags, ';');
|
List<string> result = EditorTools.StringToStringList(AssetTags, ';');
|
||||||
List<string> temper = EditorTools.StringToStringList(AssetTags, ';');
|
if (CollectorType == ECollectorType.MainAssetCollector)
|
||||||
tags.AddRange(temper);
|
{
|
||||||
return tags;
|
List<string> temps = EditorTools.StringToStringList(group.AssetTags, ';');
|
||||||
|
result.AddRange(temps);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
private List<AssetInfo> GetAllDependencies(CollectCommand command, string mainAssetPath)
|
private List<AssetInfo> GetAllDependencies(CollectCommand command, string mainAssetPath)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
private static string GetRuleDisplayName(string name, Type type)
|
private static string GetRuleDisplayName(string name, Type type)
|
||||||
{
|
{
|
||||||
var attribute = DisplayNameAttributeHelper.GetAttribute<DisplayNameAttribute>(type);
|
var attribute = EditorTools.GetAttribute<DisplayNameAttribute>(type);
|
||||||
if (attribute != null && string.IsNullOrEmpty(attribute.DisplayName) == false)
|
if (attribute != null && string.IsNullOrEmpty(attribute.DisplayName) == false)
|
||||||
return attribute.DisplayName;
|
return attribute.DisplayName;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -70,7 +70,11 @@ namespace YooAsset.Editor
|
|||||||
foreach (var cacheInfoPair in _database)
|
foreach (var cacheInfoPair in _database)
|
||||||
{
|
{
|
||||||
var assetPath = cacheInfoPair.Key;
|
var assetPath = cacheInfoPair.Key;
|
||||||
|
#if UNITY_2021_3_OR_NEWER
|
||||||
|
var assetGUID = AssetDatabase.AssetPathToGUID(assetPath, AssetPathToGUIDOptions.OnlyExistingAssets);
|
||||||
|
#else
|
||||||
var assetGUID = AssetDatabase.AssetPathToGUID(assetPath);
|
var assetGUID = AssetDatabase.AssetPathToGUID(assetPath);
|
||||||
|
#endif
|
||||||
if (string.IsNullOrEmpty(assetGUID))
|
if (string.IsNullOrEmpty(assetGUID))
|
||||||
{
|
{
|
||||||
removeList.Add(assetPath);
|
removeList.Add(assetPath);
|
||||||
@@ -183,16 +187,30 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
|
|
||||||
var result = new HashSet<string> { assetPath };
|
var result = new HashSet<string> { assetPath };
|
||||||
CollectDependencies(assetPath, result, recursive);
|
CollectDependencies(assetPath, assetPath, result, recursive);
|
||||||
|
|
||||||
// 注意:AssetDatabase.GetDependencies保持一致,将主资源添加到依赖列表最前面
|
// 注意:AssetDatabase.GetDependencies保持一致,将主资源添加到依赖列表最前面
|
||||||
return result.ToArray();
|
return result.ToArray();
|
||||||
}
|
}
|
||||||
private void CollectDependencies(string assetPath, HashSet<string> result, bool recursive)
|
private void CollectDependencies(string parent, string assetPath, HashSet<string> result, bool recursive)
|
||||||
{
|
{
|
||||||
if (_database.TryGetValue(assetPath, out var cacheInfo) == false)
|
if (_database.TryGetValue(assetPath, out var cacheInfo) == false)
|
||||||
{
|
{
|
||||||
throw new Exception($"Fatal : can not found cache info : {assetPath}");
|
// 说明:检测是否为丢失引用的资产
|
||||||
|
#if UNITY_2021_3_OR_NEWER
|
||||||
|
var assetGUID = AssetDatabase.AssetPathToGUID(assetPath, AssetPathToGUIDOptions.OnlyExistingAssets);
|
||||||
|
#else
|
||||||
|
var assetGUID = AssetDatabase.AssetPathToGUID(assetPath);
|
||||||
|
#endif
|
||||||
|
if (string.IsNullOrEmpty(assetGUID))
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"{parent} found missing asset : {assetPath}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception($"Fatal : can not found cache info : {assetPath}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var dependGUID in cacheInfo.DependGUIDs)
|
foreach (var dependGUID in cacheInfo.DependGUIDs)
|
||||||
@@ -213,7 +231,7 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
// 递归收集依赖
|
// 递归收集依赖
|
||||||
if (recursive)
|
if (recursive)
|
||||||
CollectDependencies(dependAssetPath, result, recursive);
|
CollectDependencies(assetPath, dependAssetPath, result, recursive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
@@ -15,22 +14,4 @@ namespace YooAsset.Editor
|
|||||||
this.DisplayName = name;
|
this.DisplayName = name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DisplayNameAttributeHelper
|
|
||||||
{
|
|
||||||
internal static T GetAttribute<T>(Type type) where T : Attribute
|
|
||||||
{
|
|
||||||
return (T)type.GetCustomAttribute(typeof(T), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static T GetAttribute<T>(MethodInfo methodInfo) where T : Attribute
|
|
||||||
{
|
|
||||||
return (T)methodInfo.GetCustomAttribute(typeof(T), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static T GetAttribute<T>(FieldInfo field) where T : Attribute
|
|
||||||
{
|
|
||||||
return (T)field.GetCustomAttribute(typeof(T), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -296,6 +296,7 @@ namespace YooAsset.Editor
|
|||||||
string filePath = $"{resultPath}/{nameof(DebugReport)}_{_currentReport.FrameCount}.json";
|
string filePath = $"{resultPath}/{nameof(DebugReport)}_{_currentReport.FrameCount}.json";
|
||||||
string fileContent = JsonUtility.ToJson(_currentReport, true);
|
string fileContent = JsonUtility.ToJson(_currentReport, true);
|
||||||
FileUtility.WriteAllText(filePath, fileContent);
|
FileUtility.WriteAllText(filePath, fileContent);
|
||||||
|
Debug.Log($"Debug report file saved : {filePath}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void OnSearchKeyWordChange(ChangeEvent<string> e)
|
private void OnSearchKeyWordChange(ChangeEvent<string> e)
|
||||||
|
|||||||
@@ -129,6 +129,23 @@ namespace YooAsset.Editor
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Attribute
|
||||||
|
public static T GetAttribute<T>(Type type) where T : Attribute
|
||||||
|
{
|
||||||
|
return (T)type.GetCustomAttribute(typeof(T), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T GetAttribute<T>(MethodInfo methodInfo) where T : Attribute
|
||||||
|
{
|
||||||
|
return (T)methodInfo.GetCustomAttribute(typeof(T), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T GetAttribute<T>(FieldInfo field) where T : Attribute
|
||||||
|
{
|
||||||
|
return (T)field.GetCustomAttribute(typeof(T), false);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region PackageManager
|
#region PackageManager
|
||||||
public static string GetPackageManagerYooVersion()
|
public static string GetPackageManagerYooVersion()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#if UNITY_2019_4_OR_NEWER
|
||||||
|
using UnityEditor;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class AssetObjectCell : ITableCell, IComparable
|
||||||
|
{
|
||||||
|
public string SearchTag { private set; get; }
|
||||||
|
public object CellValue { set; get; }
|
||||||
|
public string StringValue
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (string)CellValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssetObjectCell(string searchTag, string assetPath)
|
||||||
|
{
|
||||||
|
SearchTag = searchTag;
|
||||||
|
CellValue = assetPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object GetDisplayObject()
|
||||||
|
{
|
||||||
|
return AssetDatabase.LoadMainAssetAtPath(StringValue);
|
||||||
|
}
|
||||||
|
public int CompareTo(object other)
|
||||||
|
{
|
||||||
|
if (other is AssetObjectCell cell)
|
||||||
|
{
|
||||||
|
return this.StringValue.CompareTo(cell.StringValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 39db4a569a0f69443a7675e19c99c389
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -31,9 +31,14 @@ namespace YooAsset.Editor
|
|||||||
var cell = new ButtonCell(searchTag);
|
var cell = new ButtonCell(searchTag);
|
||||||
Cells.Add(cell);
|
Cells.Add(cell);
|
||||||
}
|
}
|
||||||
public void AddAssetPathCell(string searchTag, string path)
|
public void AddAssetPathCell(string searchTag, string assetPath)
|
||||||
{
|
{
|
||||||
var cell = new AssetPathCell(searchTag, path);
|
var cell = new AssetPathCell(searchTag, assetPath);
|
||||||
|
Cells.Add(cell);
|
||||||
|
}
|
||||||
|
public void AddAssetObjectCell(string searchTag, string assetPath)
|
||||||
|
{
|
||||||
|
var cell = new AssetObjectCell(searchTag, assetPath);
|
||||||
Cells.Add(cell);
|
Cells.Add(cell);
|
||||||
}
|
}
|
||||||
public void AddStringValueCell(string searchTag, string value)
|
public void AddStringValueCell(string searchTag, string value)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
[assembly: InternalsVisibleTo("YooAsset.Test.Editor")]
|
[assembly: InternalsVisibleTo("YooAsset.Test.Editor")]
|
||||||
|
|
||||||
// 外部友元
|
// 外部友元
|
||||||
|
[assembly: InternalsVisibleTo("YooAsset.MiniGame")]
|
||||||
[assembly: InternalsVisibleTo("YooAsset.RuntimeExtension")]
|
[assembly: InternalsVisibleTo("YooAsset.RuntimeExtension")]
|
||||||
[assembly: InternalsVisibleTo("YooAsset.EditorExtension")]
|
[assembly: InternalsVisibleTo("YooAsset.EditorExtension")]
|
||||||
[assembly: InternalsVisibleTo("Assembly-CSharp-Editor")]
|
[assembly: InternalsVisibleTo("Assembly-CSharp-Editor")]
|
||||||
@@ -69,6 +69,8 @@ namespace YooAsset
|
|||||||
url = new System.Uri(path).ToString();
|
url = new System.Uri(path).ToString();
|
||||||
#elif UNITY_STANDALONE || UNITY_WSA
|
#elif UNITY_STANDALONE || UNITY_WSA
|
||||||
url = StringUtility.Format("file:///{0}", path);
|
url = StringUtility.Format("file:///{0}", path);
|
||||||
|
#elif UNITY_TVOS
|
||||||
|
url = StringUtility.Format("file:///{0}", path);
|
||||||
#else
|
#else
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -559,6 +559,21 @@ namespace YooAsset
|
|||||||
};
|
};
|
||||||
return DecryptionServices.LoadAssetBundleAsync(fileInfo);
|
return DecryptionServices.LoadAssetBundleAsync(fileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载加密资源文件
|
||||||
|
/// </summary>
|
||||||
|
public DecryptResult LoadEncryptedAssetBundleFallback(PackageBundle bundle)
|
||||||
|
{
|
||||||
|
string filePath = GetCacheBundleFileLoadPath(bundle);
|
||||||
|
var fileInfo = new DecryptFileInfo()
|
||||||
|
{
|
||||||
|
BundleName = bundle.BundleName,
|
||||||
|
FileLoadCRC = bundle.UnityCRC,
|
||||||
|
FileLoadPath = filePath,
|
||||||
|
};
|
||||||
|
return DecryptionServices.LoadAssetBundleFallback(fileInfo);
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -164,11 +164,23 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_bundle.Encrypted)
|
if (_bundle.Encrypted)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
var decryptResult = _fileSystem.LoadEncryptedAssetBundleFallback(_bundle);
|
||||||
Status = EOperationStatus.Failed;
|
_assetBundle = decryptResult.Result;
|
||||||
Error = $"Failed to load encrypted asset bundle file : {_bundle.BundleName}";
|
if (_assetBundle != null)
|
||||||
YooLogger.Error(Error);
|
{
|
||||||
return;
|
_steps = ESteps.Done;
|
||||||
|
Result = new AssetBundleResult(_fileSystem, _bundle, _assetBundle, _managedStream);
|
||||||
|
Status = EOperationStatus.Succeed;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Failed to load encrypted asset bundle file : {_bundle.BundleName}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注意:在安卓移动平台,华为和三星真机上有极小概率加载资源包失败。
|
// 注意:在安卓移动平台,华为和三星真机上有极小概率加载资源包失败。
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_disableUnityWebCache)
|
if (_disableUnityWebCache)
|
||||||
{
|
{
|
||||||
var downloadhandler = new DownloadHandlerAssetBundle(_requestURL, 0);
|
var downloadhandler = new DownloadHandlerAssetBundle(_requestURL, Bundle.UnityCRC);
|
||||||
#if UNITY_2020_3_OR_NEWER
|
#if UNITY_2020_3_OR_NEWER
|
||||||
downloadhandler.autoLoadAssetBundle = false;
|
downloadhandler.autoLoadAssetBundle = false;
|
||||||
#endif
|
#endif
|
||||||
@@ -132,9 +132,8 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
// 注意:优先从浏览器缓存里获取文件
|
// 注意:优先从浏览器缓存里获取文件
|
||||||
// The file hash defining the version of the asset bundle.
|
// The file hash defining the version of the asset bundle.
|
||||||
uint unityCRC = Bundle.UnityCRC;
|
|
||||||
Hash128 fileHash = Hash128.Parse(Bundle.FileHash);
|
Hash128 fileHash = Hash128.Parse(Bundle.FileHash);
|
||||||
var downloadhandler = new DownloadHandlerAssetBundle(_requestURL, fileHash, unityCRC);
|
var downloadhandler = new DownloadHandlerAssetBundle(_requestURL, fileHash, Bundle.UnityCRC);
|
||||||
#if UNITY_2020_3_OR_NEWER
|
#if UNITY_2020_3_OR_NEWER
|
||||||
downloadhandler.autoLoadAssetBundle = false;
|
downloadhandler.autoLoadAssetBundle = false;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -51,6 +51,14 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
DecryptResult LoadAssetBundleAsync(DecryptFileInfo fileInfo);
|
DecryptResult LoadAssetBundleAsync(DecryptFileInfo fileInfo);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 后备方式获取解密的资源包对象
|
||||||
|
/// 注意:当正常解密方法失败后,会触发后备加载!
|
||||||
|
/// 说明:建议通过LoadFromMemory()方法加载资源对象作为保底机制。
|
||||||
|
/// issues : https://github.com/tuyoogame/YooAsset/issues/562
|
||||||
|
/// </summary>
|
||||||
|
DecryptResult LoadAssetBundleFallback(DecryptFileInfo fileInfo);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取解密的字节数据
|
/// 获取解密的字节数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -34,6 +34,20 @@ namespace YooAsset
|
|||||||
return str.Remove(index); //"assets/config/test.unity3d" --> "assets/config/test"
|
return str.Remove(index); //"assets/config/test.unity3d" --> "assets/config/test"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL地址是否包含双斜杠
|
||||||
|
/// 注意:只检查协议之后的部分
|
||||||
|
/// </summary>
|
||||||
|
public static bool HasDoubleSlashes(string url)
|
||||||
|
{
|
||||||
|
if (url == null)
|
||||||
|
throw new ArgumentNullException();
|
||||||
|
|
||||||
|
int protocolIndex = url.IndexOf("://");
|
||||||
|
string partToCheck = protocolIndex == -1 ? url : url.Substring(protocolIndex + 3);
|
||||||
|
return partToCheck.Contains("//") || partToCheck.Contains(@"\\");
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 合并路径
|
/// 合并路径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -63,6 +63,29 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 销毁资源系统
|
||||||
|
/// </summary>
|
||||||
|
public static void Destroy()
|
||||||
|
{
|
||||||
|
if (_isInitialize)
|
||||||
|
{
|
||||||
|
_isInitialize = false;
|
||||||
|
|
||||||
|
if (_driver != null)
|
||||||
|
GameObject.Destroy(_driver);
|
||||||
|
|
||||||
|
// 终止并清空所有包裹的异步操作
|
||||||
|
ClearAllPackageOperation();
|
||||||
|
|
||||||
|
// 卸载所有AssetBundle
|
||||||
|
AssetBundle.UnloadAllAssetBundles(true);
|
||||||
|
|
||||||
|
// 清空资源包裹列表
|
||||||
|
_packages.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 更新资源系统
|
/// 更新资源系统
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -75,11 +98,10 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用程序退出处理
|
/// 终止并清空所有包裹的异步操作
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static void OnApplicationQuit()
|
internal static void ClearAllPackageOperation()
|
||||||
{
|
{
|
||||||
// 说明:在编辑器下确保播放被停止时IO类操作被终止。
|
|
||||||
foreach (var package in _packages)
|
foreach (var package in _packages)
|
||||||
{
|
{
|
||||||
OperationSystem.ClearPackageOperation(package.PackageName);
|
OperationSystem.ClearPackageOperation(package.PackageName);
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ namespace YooAsset
|
|||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
void OnApplicationQuit()
|
void OnApplicationQuit()
|
||||||
{
|
{
|
||||||
YooAssets.OnApplicationQuit();
|
// 说明:在编辑器下确保播放被停止时IO类操作被终止。
|
||||||
|
YooAssets.ClearAllPackageOperation();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR && UNITY_2021_3_OR_NEWER
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
@@ -6,6 +6,11 @@ using UnityEngine.U2D;
|
|||||||
|
|
||||||
public static class UIPanelSettings
|
public static class UIPanelSettings
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 是否开启面板监测
|
||||||
|
/// </summary>
|
||||||
|
public static bool EnablePanelMonitor = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 面板文件夹GUID
|
/// 面板文件夹GUID
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -60,6 +65,9 @@ public class UIPanelMonitor : UnityEditor.Editor
|
|||||||
|
|
||||||
static void OnPrefabSaving(GameObject go)
|
static void OnPrefabSaving(GameObject go)
|
||||||
{
|
{
|
||||||
|
if (UIPanelSettings.EnablePanelMonitor == false)
|
||||||
|
return;
|
||||||
|
|
||||||
UnityEditor.SceneManagement.PrefabStage stage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
|
UnityEditor.SceneManagement.PrefabStage stage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
|
||||||
if (stage != null)
|
if (stage != null)
|
||||||
{
|
{
|
||||||
@@ -78,7 +86,7 @@ public class UIPanelMonitor : UnityEditor.Editor
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 刷新面板清单
|
/// 刷新面板清单
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void RefreshPanelManifest(PanelManifest manifest)
|
private static void RefreshPanelManifest(PanelManifest manifest)
|
||||||
{
|
{
|
||||||
manifest.ReferencesAtlas.Clear();
|
manifest.ReferencesAtlas.Clear();
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,7 @@
|
|||||||
"name": "YooAsset.RuntimeExtension",
|
"name": "YooAsset.RuntimeExtension",
|
||||||
"rootNamespace": "",
|
"rootNamespace": "",
|
||||||
"references": [
|
"references": [
|
||||||
"GUID:e34a5702dd353724aa315fb8011f08c3",
|
"GUID:e34a5702dd353724aa315fb8011f08c3"
|
||||||
"GUID:5efd170ecd8084500bed5692932fe14e",
|
|
||||||
"GUID:bb21d6197862c4c3e863390dec9859a7"
|
|
||||||
],
|
],
|
||||||
"includePlatforms": [],
|
"includePlatforms": [],
|
||||||
"excludePlatforms": [],
|
"excludePlatforms": [],
|
||||||
|
|||||||
8
Assets/YooAsset/Samples~/Mini Game.meta
Normal file
8
Assets/YooAsset/Samples~/Mini Game.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2bbcb90032364234abe49c81b95714e1
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Assets/YooAsset/Samples~/Mini Game/Runtime.meta
Normal file
8
Assets/YooAsset/Samples~/Mini Game/Runtime.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b127fedb48547954b9c54084b6a32a65
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -11,14 +11,16 @@ internal class TTFSRequestPackageVersionOperation : FSRequestPackageVersionOpera
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly TiktokFileSystem _fileSystem;
|
private readonly TiktokFileSystem _fileSystem;
|
||||||
|
private readonly bool _appendTimeTicks;
|
||||||
private readonly int _timeout;
|
private readonly int _timeout;
|
||||||
private RequestTiktokPackageVersionOperation _requestPackageVersionOp;
|
private RequestTiktokPackageVersionOperation _requestPackageVersionOp;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
|
||||||
internal TTFSRequestPackageVersionOperation(TiktokFileSystem fileSystem, int timeout)
|
internal TTFSRequestPackageVersionOperation(TiktokFileSystem fileSystem, bool appendTimeTicks, int timeout)
|
||||||
{
|
{
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
|
_appendTimeTicks = appendTimeTicks;
|
||||||
_timeout = timeout;
|
_timeout = timeout;
|
||||||
}
|
}
|
||||||
internal override void InternalStart()
|
internal override void InternalStart()
|
||||||
@@ -34,7 +36,7 @@ internal class TTFSRequestPackageVersionOperation : FSRequestPackageVersionOpera
|
|||||||
{
|
{
|
||||||
if (_requestPackageVersionOp == null)
|
if (_requestPackageVersionOp == null)
|
||||||
{
|
{
|
||||||
_requestPackageVersionOp = new RequestTiktokPackageVersionOperation(_fileSystem, _timeout);
|
_requestPackageVersionOp = new RequestTiktokPackageVersionOperation(_fileSystem, _appendTimeTicks, _timeout);
|
||||||
_requestPackageVersionOp.StartOperation();
|
_requestPackageVersionOp.StartOperation();
|
||||||
AddChildOperation(_requestPackageVersionOp);
|
AddChildOperation(_requestPackageVersionOp);
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ internal class RequestTiktokPackageVersionOperation : AsyncOperationBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly TiktokFileSystem _fileSystem;
|
private readonly TiktokFileSystem _fileSystem;
|
||||||
|
private readonly bool _appendTimeTicks;
|
||||||
private readonly int _timeout;
|
private readonly int _timeout;
|
||||||
private UnityWebTextRequestOperation _webTextRequestOp;
|
private UnityWebTextRequestOperation _webTextRequestOp;
|
||||||
private int _requestCount = 0;
|
private int _requestCount = 0;
|
||||||
@@ -22,9 +23,10 @@ internal class RequestTiktokPackageVersionOperation : AsyncOperationBase
|
|||||||
public string PackageVersion { private set; get; }
|
public string PackageVersion { private set; get; }
|
||||||
|
|
||||||
|
|
||||||
public RequestTiktokPackageVersionOperation(TiktokFileSystem fileSystem, int timeout)
|
public RequestTiktokPackageVersionOperation(TiktokFileSystem fileSystem, bool appendTimeTicks, int timeout)
|
||||||
{
|
{
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
|
_appendTimeTicks = appendTimeTicks;
|
||||||
_timeout = timeout;
|
_timeout = timeout;
|
||||||
}
|
}
|
||||||
internal override void InternalStart()
|
internal override void InternalStart()
|
||||||
@@ -80,11 +82,19 @@ internal class RequestTiktokPackageVersionOperation : AsyncOperationBase
|
|||||||
|
|
||||||
private string GetRequestURL(string fileName)
|
private string GetRequestURL(string fileName)
|
||||||
{
|
{
|
||||||
|
string url;
|
||||||
|
|
||||||
// 轮流返回请求地址
|
// 轮流返回请求地址
|
||||||
if (_requestCount % 2 == 0)
|
if (_requestCount % 2 == 0)
|
||||||
return _fileSystem.RemoteServices.GetRemoteMainURL(fileName);
|
url = _fileSystem.RemoteServices.GetRemoteMainURL(fileName);
|
||||||
else
|
else
|
||||||
return _fileSystem.RemoteServices.GetRemoteFallbackURL(fileName);
|
url = _fileSystem.RemoteServices.GetRemoteFallbackURL(fileName);
|
||||||
|
|
||||||
|
// 在URL末尾添加时间戳
|
||||||
|
if (_appendTimeTicks)
|
||||||
|
return $"{url}?{System.DateTime.UtcNow.Ticks}";
|
||||||
|
else
|
||||||
|
return url;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -10,7 +10,7 @@ public static class TiktokFileSystemCreater
|
|||||||
{
|
{
|
||||||
public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteServices remoteServices)
|
public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteServices remoteServices)
|
||||||
{
|
{
|
||||||
string fileSystemClass = $"{nameof(TiktokFileSystem)},YooAsset.RuntimeExtension";
|
string fileSystemClass = $"{nameof(TiktokFileSystem)},YooAsset.MiniGame";
|
||||||
var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot);
|
var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot);
|
||||||
fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices);
|
fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices);
|
||||||
return fileSystemParams;
|
return fileSystemParams;
|
||||||
@@ -18,7 +18,7 @@ public static class TiktokFileSystemCreater
|
|||||||
|
|
||||||
public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteServices remoteServices, IWebDecryptionServices decryptionServices)
|
public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteServices remoteServices, IWebDecryptionServices decryptionServices)
|
||||||
{
|
{
|
||||||
string fileSystemClass = $"{nameof(TiktokFileSystem)},YooAsset.RuntimeExtension";
|
string fileSystemClass = $"{nameof(TiktokFileSystem)},YooAsset.MiniGame";
|
||||||
var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot);
|
var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot);
|
||||||
fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices);
|
fileSystemParams.AddParameter(FileSystemParametersDefine.REMOTE_SERVICES, remoteServices);
|
||||||
fileSystemParams.AddParameter(FileSystemParametersDefine.DECRYPTION_SERVICES, decryptionServices);
|
fileSystemParams.AddParameter(FileSystemParametersDefine.DECRYPTION_SERVICES, decryptionServices);
|
||||||
@@ -121,7 +121,7 @@ internal class TiktokFileSystem : IFileSystem
|
|||||||
}
|
}
|
||||||
public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(bool appendTimeTicks, int timeout)
|
public virtual FSRequestPackageVersionOperation RequestPackageVersionAsync(bool appendTimeTicks, int timeout)
|
||||||
{
|
{
|
||||||
var operation = new TTFSRequestPackageVersionOperation(this, timeout);
|
var operation = new TTFSRequestPackageVersionOperation(this, appendTimeTicks, timeout);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public virtual FSClearCacheFilesOperation ClearCacheFilesAsync(PackageManifest manifest, ClearCacheFilesOptions options)
|
public virtual FSClearCacheFilesOperation ClearCacheFilesAsync(PackageManifest manifest, ClearCacheFilesOptions options)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user