mirror of https://github.com/tuyoogame/YooAsset
update yooasset2.0
parent
880b6d429d
commit
01cf9ccd54
|
@ -15,7 +15,7 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建资源包
|
/// 构建资源包
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public BuildResult Run(BuildParameters buildParameters, List<IBuildTask> buildPipeline)
|
public BuildResult Run(BuildParameters buildParameters, List<IBuildTask> buildPipeline, bool enableLog)
|
||||||
{
|
{
|
||||||
// 检测构建参数是否为空
|
// 检测构建参数是否为空
|
||||||
if (buildParameters == null)
|
if (buildParameters == null)
|
||||||
|
@ -33,9 +33,10 @@ namespace YooAsset.Editor
|
||||||
_buildContext.SetContextObject(buildParametersContext);
|
_buildContext.SetContextObject(buildParametersContext);
|
||||||
|
|
||||||
// 初始化日志
|
// 初始化日志
|
||||||
BuildLogger.InitLogger(buildParameters.EnableLog);
|
BuildLogger.InitLogger(enableLog);
|
||||||
|
|
||||||
// 执行构建流程
|
// 执行构建流程
|
||||||
|
Debug.Log($"Begin to build package : {buildParameters.PackageName} by {buildParameters.BuildPipeline}");
|
||||||
var buildResult = BuildRunner.Run(buildPipeline, _buildContext);
|
var buildResult = BuildRunner.Run(buildPipeline, _buildContext);
|
||||||
if (buildResult.Success)
|
if (buildResult.Success)
|
||||||
{
|
{
|
||||||
|
@ -51,62 +52,5 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
return buildResult;
|
return buildResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 构建资源包
|
|
||||||
/// </summary>
|
|
||||||
public BuildResult Run(BuildParameters buildParameters)
|
|
||||||
{
|
|
||||||
var buildPipeline = GetDefaultBuildPipeline(buildParameters.BuildPipeline);
|
|
||||||
return Run(buildParameters, buildPipeline);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取默认的构建流程
|
|
||||||
/// </summary>
|
|
||||||
private List<IBuildTask> GetDefaultBuildPipeline(EBuildPipeline buildPipeline)
|
|
||||||
{
|
|
||||||
// 获取任务节点的属性集合
|
|
||||||
if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
|
||||||
{
|
|
||||||
List<IBuildTask> pipeline = new List<IBuildTask>
|
|
||||||
{
|
|
||||||
new TaskPrepare(), //前期准备工作
|
|
||||||
new TaskGetBuildMap(), //获取构建列表
|
|
||||||
new TaskBuilding(), //开始执行构建
|
|
||||||
new TaskCopyRawFile(), //拷贝原生文件
|
|
||||||
new TaskVerifyBuildResult(), //验证构建结果
|
|
||||||
new TaskEncryption(), //加密资源文件
|
|
||||||
new TaskUpdateBundleInfo(), //更新资源包信息
|
|
||||||
new TaskCreateManifest(), //创建清单文件
|
|
||||||
new TaskCreateReport(), //创建报告文件
|
|
||||||
new TaskCreatePackage(), //制作包裹
|
|
||||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
|
||||||
};
|
|
||||||
return pipeline;
|
|
||||||
}
|
|
||||||
else if (buildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
|
||||||
{
|
|
||||||
List<IBuildTask> pipeline = new List<IBuildTask>
|
|
||||||
{
|
|
||||||
new TaskPrepare(), //前期准备工作
|
|
||||||
new TaskGetBuildMap(), //获取构建列表
|
|
||||||
new TaskBuilding_SBP(), //开始执行构建
|
|
||||||
new TaskCopyRawFile(), //拷贝原生文件
|
|
||||||
new TaskVerifyBuildResult_SBP(), //验证构建结果
|
|
||||||
new TaskEncryption(), //加密资源文件
|
|
||||||
new TaskUpdateBundleInfo(), //更新补丁信息
|
|
||||||
new TaskCreateManifest(), //创建清单文件
|
|
||||||
new TaskCreateReport(), //创建报告文件
|
|
||||||
new TaskCreatePackage(), //制作补丁包
|
|
||||||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
|
||||||
};
|
|
||||||
return pipeline;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -20,7 +20,7 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取流文件夹路径
|
/// 获取流文件夹路径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetDefaultStreamingAssetsRoot()
|
public static string GetStreamingAssetsRoot()
|
||||||
{
|
{
|
||||||
return $"{Application.dataPath}/StreamingAssets/{YooAssetSettings.DefaultYooFolderName}/";
|
return $"{Application.dataPath}/StreamingAssets/{YooAssetSettings.DefaultYooFolderName}/";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,93 @@
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[CreateAssetMenu(fileName = "AssetBundleBuilderSetting", menuName = "YooAsset/Create AssetBundle Builder Settings")]
|
public static class AssetBundleBuilderSetting
|
||||||
public class AssetBundleBuilderSetting : ScriptableObject
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
// EBuildPipeline
|
||||||
/// 构建管线
|
public static EBuildPipeline GetPackageBuildPipeline(string packageName)
|
||||||
/// </summary>
|
{
|
||||||
public EBuildPipeline BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
|
string key = $"{Application.productName}_{packageName}_{nameof(EBuildPipeline)}";
|
||||||
|
return (EBuildPipeline)EditorPrefs.GetInt(key, (int)EBuildPipeline.BuiltinBuildPipeline);
|
||||||
|
}
|
||||||
|
public static void SetPackageBuildPipeline(string packageName, EBuildPipeline buildPipeline)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{nameof(EBuildPipeline)}";
|
||||||
|
EditorPrefs.SetInt(key, (int)buildPipeline);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
// EBuildMode
|
||||||
/// 构建模式
|
public static EBuildMode GetPackageBuildMode(string packageName, EBuildPipeline buildPipeline)
|
||||||
/// </summary>
|
{
|
||||||
public EBuildMode BuildMode = EBuildMode.ForceRebuild;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildMode)}";
|
||||||
|
return (EBuildMode)EditorPrefs.GetInt(key, (int)EBuildMode.ForceRebuild);
|
||||||
|
}
|
||||||
|
public static void SetPackageBuildMode(string packageName, EBuildPipeline buildPipeline, EBuildMode buildMode)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildMode)}";
|
||||||
|
EditorPrefs.SetInt(key, (int)buildMode);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
// ECompressOption
|
||||||
/// 构建的包裹名称
|
public static ECompressOption GetPackageCompressOption(string packageName, EBuildPipeline buildPipeline)
|
||||||
/// </summary>
|
{
|
||||||
public string BuildPackage = string.Empty;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(ECompressOption)}";
|
||||||
|
return (ECompressOption)EditorPrefs.GetInt(key, (int)ECompressOption.LZ4);
|
||||||
|
}
|
||||||
|
public static void SetPackageCompressOption(string packageName, EBuildPipeline buildPipeline, ECompressOption compressOption)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(ECompressOption)}";
|
||||||
|
EditorPrefs.SetInt(key, (int)compressOption);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
// EFileNameStyle
|
||||||
/// 压缩方式
|
public static EFileNameStyle GetPackageFileNameStyle(string packageName, EBuildPipeline buildPipeline)
|
||||||
/// </summary>
|
{
|
||||||
public ECompressOption CompressOption = ECompressOption.LZ4;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EFileNameStyle)}";
|
||||||
|
return (EFileNameStyle)EditorPrefs.GetInt(key, (int)EFileNameStyle.HashName);
|
||||||
|
}
|
||||||
|
public static void SetPackageFileNameStyle(string packageName, EBuildPipeline buildPipeline, EFileNameStyle fileNameStyle)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EFileNameStyle)}";
|
||||||
|
EditorPrefs.SetInt(key, (int)fileNameStyle);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
// EBuildinFileCopyOption
|
||||||
/// 输出文件名称样式
|
public static EBuildinFileCopyOption GetPackageBuildinFileCopyOption(string packageName, EBuildPipeline buildPipeline)
|
||||||
/// </summary>
|
{
|
||||||
public EOutputNameStyle OutputNameStyle = EOutputNameStyle.HashName;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildinFileCopyOption)}";
|
||||||
|
return (EBuildinFileCopyOption)EditorPrefs.GetInt(key, (int)EBuildinFileCopyOption.None);
|
||||||
|
}
|
||||||
|
public static void SetPackageBuildinFileCopyOption(string packageName, EBuildPipeline buildPipeline, EBuildinFileCopyOption buildinFileCopyOption)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_{nameof(EBuildinFileCopyOption)}";
|
||||||
|
EditorPrefs.SetInt(key, (int)buildinFileCopyOption);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
// BuildFileCopyParams
|
||||||
/// 首包资源文件的拷贝方式
|
public static string GetPackageBuildinFileCopyParams(string packageName, EBuildPipeline buildPipeline)
|
||||||
/// </summary>
|
{
|
||||||
public ECopyBuildinFileOption CopyBuildinFileOption = ECopyBuildinFileOption.None;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
|
||||||
|
return EditorPrefs.GetString(key, string.Empty);
|
||||||
|
}
|
||||||
|
public static void SetPackageBuildinFileCopyParams(string packageName, EBuildPipeline buildPipeline, string buildinFileCopyParams)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_BuildFileCopyParams";
|
||||||
|
EditorPrefs.SetString(key, buildinFileCopyParams);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
// EncyptionClassName
|
||||||
/// 首包资源文件的标签集合
|
public static string GetPackageEncyptionClassName(string packageName, EBuildPipeline buildPipeline)
|
||||||
/// </summary>
|
{
|
||||||
public string CopyBuildinFileTags = string.Empty;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
|
||||||
|
return EditorPrefs.GetString(key, string.Empty);
|
||||||
/// <summary>
|
}
|
||||||
/// 加密类名称
|
public static void SetPackageEncyptionClassName(string packageName, EBuildPipeline buildPipeline, string encyptionClassName)
|
||||||
/// </summary>
|
{
|
||||||
public string EncyptionClassName = string.Empty;
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_EncyptionClassName";
|
||||||
|
EditorPrefs.SetString(key, encyptionClassName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,49 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEditor;
|
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
|
||||||
{
|
|
||||||
public class AssetBundleBuilderSettingData
|
|
||||||
{
|
|
||||||
private static AssetBundleBuilderSetting _setting = null;
|
|
||||||
public static AssetBundleBuilderSetting Setting
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (_setting == null)
|
|
||||||
LoadSettingData();
|
|
||||||
return _setting;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 配置数据是否被修改
|
|
||||||
/// </summary>
|
|
||||||
public static bool IsDirty { set; get; } = false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 加载配置文件
|
|
||||||
/// </summary>
|
|
||||||
private static void LoadSettingData()
|
|
||||||
{
|
|
||||||
_setting = SettingLoader.LoadSettingData<AssetBundleBuilderSetting>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 存储文件
|
|
||||||
/// </summary>
|
|
||||||
public static void SaveFile()
|
|
||||||
{
|
|
||||||
if (Setting != null)
|
|
||||||
{
|
|
||||||
IsDirty = false;
|
|
||||||
EditorUtility.SetDirty(Setting);
|
|
||||||
AssetDatabase.SaveAssets();
|
|
||||||
Debug.Log($"{nameof(AssetBundleBuilderSetting)}.asset is saved!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -18,22 +18,14 @@ namespace YooAsset.Editor
|
||||||
window.minSize = new Vector2(800, 600);
|
window.minSize = new Vector2(800, 600);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BuildTarget _buildTarget;
|
private string _buildPackage;
|
||||||
private List<Type> _encryptionServicesClassTypes;
|
private EBuildPipeline _buildPipeline;
|
||||||
private List<string> _encryptionServicesClassNames;
|
|
||||||
private List<string> _buildPackageNames;
|
private Toolbar _toolbar;
|
||||||
|
private ToolbarMenu _packageMenu;
|
||||||
|
private ToolbarMenu _pipelineMenu;
|
||||||
|
private VisualElement _container;
|
||||||
|
|
||||||
private Button _saveButton;
|
|
||||||
private TextField _buildOutputField;
|
|
||||||
private EnumField _buildPipelineField;
|
|
||||||
private EnumField _buildModeField;
|
|
||||||
private TextField _buildVersionField;
|
|
||||||
private PopupField<string> _buildPackageField;
|
|
||||||
private PopupField<string> _encryptionField;
|
|
||||||
private EnumField _compressionField;
|
|
||||||
private EnumField _outputNameStyleField;
|
|
||||||
private EnumField _copyBuildinFileOptionField;
|
|
||||||
private TextField _copyBuildinFileTagsField;
|
|
||||||
|
|
||||||
public void CreateGUI()
|
public void CreateGUI()
|
||||||
{
|
{
|
||||||
|
@ -47,276 +39,76 @@ namespace YooAsset.Editor
|
||||||
return;
|
return;
|
||||||
|
|
||||||
visualAsset.CloneTree(root);
|
visualAsset.CloneTree(root);
|
||||||
|
_toolbar = root.Q<Toolbar>("Toolbar");
|
||||||
|
_container = root.Q("Container");
|
||||||
|
|
||||||
// 配置保存按钮
|
// 检测构建包裹
|
||||||
_saveButton = root.Q<Button>("SaveButton");
|
var packageNames = GetBuildPackageNames();
|
||||||
_saveButton.clicked += SaveBtn_clicked;
|
if (packageNames.Count == 0)
|
||||||
|
|
||||||
// 构建平台
|
|
||||||
_buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
|
||||||
|
|
||||||
// 包裹名称列表
|
|
||||||
_buildPackageNames = GetBuildPackageNames();
|
|
||||||
|
|
||||||
// 加密服务类
|
|
||||||
_encryptionServicesClassTypes = GetEncryptionServicesClassTypes();
|
|
||||||
_encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.Name).ToList();
|
|
||||||
|
|
||||||
// 输出目录
|
|
||||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
_buildOutputField = root.Q<TextField>("BuildOutput");
|
|
||||||
_buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
|
|
||||||
_buildOutputField.SetEnabled(false);
|
|
||||||
|
|
||||||
// 构建管线
|
|
||||||
_buildPipelineField = root.Q<EnumField>("BuildPipeline");
|
|
||||||
_buildPipelineField.Init(AssetBundleBuilderSettingData.Setting.BuildPipeline);
|
|
||||||
_buildPipelineField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildPipeline);
|
|
||||||
_buildPipelineField.style.width = 350;
|
|
||||||
_buildPipelineField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
{
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
var label = new Label();
|
||||||
AssetBundleBuilderSettingData.Setting.BuildPipeline = (EBuildPipeline)_buildPipelineField.value;
|
label.text = "没有发现可构建的资源包";
|
||||||
RefreshWindow();
|
label.style.width = 100;
|
||||||
});
|
_toolbar.Add(label);
|
||||||
|
return;
|
||||||
// 构建模式
|
}
|
||||||
_buildModeField = root.Q<EnumField>("BuildMode");
|
|
||||||
_buildModeField.Init(AssetBundleBuilderSettingData.Setting.BuildMode);
|
|
||||||
_buildModeField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildMode);
|
|
||||||
_buildModeField.style.width = 350;
|
|
||||||
_buildModeField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.BuildMode = (EBuildMode)_buildModeField.value;
|
|
||||||
RefreshWindow();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 构建版本
|
|
||||||
_buildVersionField = root.Q<TextField>("BuildVersion");
|
|
||||||
_buildVersionField.SetValueWithoutNotify(GetBuildPackageVersion());
|
|
||||||
|
|
||||||
// 构建包裹
|
// 构建包裹
|
||||||
var buildPackageContainer = root.Q("BuildPackageContainer");
|
|
||||||
if (_buildPackageNames.Count > 0)
|
|
||||||
{
|
{
|
||||||
int defaultIndex = GetDefaultPackageIndex(AssetBundleBuilderSettingData.Setting.BuildPackage);
|
_buildPackage = packageNames[0];
|
||||||
_buildPackageField = new PopupField<string>(_buildPackageNames, defaultIndex);
|
_packageMenu = new ToolbarMenu();
|
||||||
_buildPackageField.label = "Build Package";
|
_packageMenu.style.width = 200;
|
||||||
_buildPackageField.style.width = 350;
|
foreach (var packageName in packageNames)
|
||||||
_buildPackageField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
{
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
_packageMenu.menu.AppendAction(packageName, PackageMenuAction, PackageMenuFun, packageName);
|
||||||
AssetBundleBuilderSettingData.Setting.BuildPackage = _buildPackageField.value;
|
}
|
||||||
});
|
_toolbar.Add(_packageMenu);
|
||||||
buildPackageContainer.Add(_buildPackageField);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_buildPackageField = new PopupField<string>();
|
|
||||||
_buildPackageField.label = "Build Package";
|
|
||||||
_buildPackageField.style.width = 350;
|
|
||||||
buildPackageContainer.Add(_buildPackageField);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加密方法
|
// 构建管线
|
||||||
var encryptionContainer = root.Q("EncryptionContainer");
|
|
||||||
if (_encryptionServicesClassNames.Count > 0)
|
|
||||||
{
|
{
|
||||||
int defaultIndex = GetDefaultEncryptionIndex(AssetBundleBuilderSettingData.Setting.EncyptionClassName);
|
_pipelineMenu = new ToolbarMenu();
|
||||||
_encryptionField = new PopupField<string>(_encryptionServicesClassNames, defaultIndex);
|
_pipelineMenu.style.width = 200;
|
||||||
_encryptionField.label = "Encryption";
|
_pipelineMenu.menu.AppendAction(EBuildPipeline.BuiltinBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.BuiltinBuildPipeline);
|
||||||
_encryptionField.style.width = 350;
|
_pipelineMenu.menu.AppendAction(EBuildPipeline.ScriptableBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.ScriptableBuildPipeline);
|
||||||
_encryptionField.RegisterValueChangedCallback(evt =>
|
_pipelineMenu.menu.AppendAction(EBuildPipeline.RawFileBuildPipeline.ToString(), PipelineMenuAction, PipelineMenuFun, EBuildPipeline.RawFileBuildPipeline);
|
||||||
{
|
_toolbar.Add(_pipelineMenu);
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.EncyptionClassName = _encryptionField.value;
|
|
||||||
});
|
|
||||||
encryptionContainer.Add(_encryptionField);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_encryptionField = new PopupField<string>();
|
|
||||||
_encryptionField.label = "Encryption";
|
|
||||||
_encryptionField.style.width = 350;
|
|
||||||
encryptionContainer.Add(_encryptionField);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 压缩方式选项
|
RefreshBuildPipelineView();
|
||||||
_compressionField = root.Q<EnumField>("Compression");
|
|
||||||
_compressionField.Init(AssetBundleBuilderSettingData.Setting.CompressOption);
|
|
||||||
_compressionField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CompressOption);
|
|
||||||
_compressionField.style.width = 350;
|
|
||||||
_compressionField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.CompressOption = (ECompressOption)_compressionField.value;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 输出文件名称样式
|
|
||||||
_outputNameStyleField = root.Q<EnumField>("OutputNameStyle");
|
|
||||||
_outputNameStyleField.Init(AssetBundleBuilderSettingData.Setting.OutputNameStyle);
|
|
||||||
_outputNameStyleField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.OutputNameStyle);
|
|
||||||
_outputNameStyleField.style.width = 350;
|
|
||||||
_outputNameStyleField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.OutputNameStyle = (EOutputNameStyle)_outputNameStyleField.value;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 首包文件拷贝选项
|
|
||||||
_copyBuildinFileOptionField = root.Q<EnumField>("CopyBuildinFileOption");
|
|
||||||
_copyBuildinFileOptionField.Init(AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption);
|
|
||||||
_copyBuildinFileOptionField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption);
|
|
||||||
_copyBuildinFileOptionField.style.width = 350;
|
|
||||||
_copyBuildinFileOptionField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption = (ECopyBuildinFileOption)_copyBuildinFileOptionField.value;
|
|
||||||
RefreshWindow();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 首包文件的资源标签
|
|
||||||
_copyBuildinFileTagsField = root.Q<TextField>("CopyBuildinFileTags");
|
|
||||||
_copyBuildinFileTagsField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags);
|
|
||||||
_copyBuildinFileTagsField.RegisterValueChangedCallback(evt =>
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags = _copyBuildinFileTagsField.value;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 构建按钮
|
|
||||||
var buildButton = root.Q<Button>("Build");
|
|
||||||
buildButton.clicked += BuildButton_clicked; ;
|
|
||||||
|
|
||||||
RefreshWindow();
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.LogError(e.ToString());
|
Debug.LogError(e.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void OnDestroy()
|
|
||||||
|
private void RefreshBuildPipelineView()
|
||||||
{
|
{
|
||||||
if (AssetBundleBuilderSettingData.IsDirty)
|
// 清空扩展区域
|
||||||
AssetBundleBuilderSettingData.SaveFile();
|
_container.Clear();
|
||||||
}
|
|
||||||
public void Update()
|
_buildPipeline = AssetBundleBuilderSetting.GetPackageBuildPipeline(_buildPackage);
|
||||||
{
|
_packageMenu.text = _buildPackage;
|
||||||
if (_saveButton != null)
|
_pipelineMenu.text = _buildPipeline.ToString();
|
||||||
|
|
||||||
|
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||||
|
if (_buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
||||||
{
|
{
|
||||||
if (AssetBundleBuilderSettingData.IsDirty)
|
var viewer = new BuiltinBuildPipelineViewer(_buildPackage, buildTarget, _container);
|
||||||
{
|
|
||||||
if (_saveButton.enabledSelf == false)
|
|
||||||
_saveButton.SetEnabled(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (_saveButton.enabledSelf)
|
|
||||||
_saveButton.SetEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
else if (_buildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
||||||
|
|
||||||
private void RefreshWindow()
|
|
||||||
{
|
|
||||||
var buildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
|
|
||||||
var buildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
|
|
||||||
var copyOption = AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption;
|
|
||||||
bool enableElement = buildMode == EBuildMode.ForceRebuild;
|
|
||||||
bool tagsFiledVisible = copyOption == ECopyBuildinFileOption.ClearAndCopyByTags || copyOption == ECopyBuildinFileOption.OnlyCopyByTags;
|
|
||||||
|
|
||||||
if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
|
||||||
{
|
{
|
||||||
_compressionField.SetEnabled(enableElement);
|
var viewer = new ScriptableBuildPipelineViewer(_buildPackage, buildTarget, _container);
|
||||||
_outputNameStyleField.SetEnabled(enableElement);
|
}
|
||||||
_copyBuildinFileOptionField.SetEnabled(enableElement);
|
else if (_buildPipeline == EBuildPipeline.RawFileBuildPipeline)
|
||||||
_copyBuildinFileTagsField.SetEnabled(enableElement);
|
{
|
||||||
|
var viewer = new RawfileBuildpipelineViewer(_buildPackage, buildTarget, _container);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_compressionField.SetEnabled(true);
|
throw new System.NotImplementedException(_buildPipeline.ToString());
|
||||||
_outputNameStyleField.SetEnabled(true);
|
|
||||||
_copyBuildinFileOptionField.SetEnabled(true);
|
|
||||||
_copyBuildinFileTagsField.SetEnabled(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_copyBuildinFileTagsField.visible = tagsFiledVisible;
|
|
||||||
}
|
|
||||||
private void SaveBtn_clicked()
|
|
||||||
{
|
|
||||||
AssetBundleBuilderSettingData.SaveFile();
|
|
||||||
}
|
|
||||||
private void BuildButton_clicked()
|
|
||||||
{
|
|
||||||
var buildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
|
|
||||||
if (EditorUtility.DisplayDialog("提示", $"通过构建模式【{buildMode}】来构建!", "Yes", "No"))
|
|
||||||
{
|
|
||||||
EditorTools.ClearUnityConsole();
|
|
||||||
EditorApplication.delayCall += ExecuteBuild;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.LogWarning("[Build] 打包已经取消");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 执行构建
|
|
||||||
/// </summary>
|
|
||||||
private void ExecuteBuild()
|
|
||||||
{
|
|
||||||
BuildParameters buildParameters = new BuildParameters();
|
|
||||||
buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
buildParameters.BuildTarget = _buildTarget;
|
|
||||||
buildParameters.BuildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
|
|
||||||
buildParameters.BuildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
|
|
||||||
buildParameters.PackageName = AssetBundleBuilderSettingData.Setting.BuildPackage;
|
|
||||||
buildParameters.PackageVersion = _buildVersionField.value;
|
|
||||||
buildParameters.VerifyBuildingResult = true;
|
|
||||||
buildParameters.SharedPackRule = new ZeroRedundancySharedPackRule();
|
|
||||||
buildParameters.EncryptionServices = CreateEncryptionServicesInstance();
|
|
||||||
buildParameters.CompressOption = AssetBundleBuilderSettingData.Setting.CompressOption;
|
|
||||||
buildParameters.OutputNameStyle = AssetBundleBuilderSettingData.Setting.OutputNameStyle;
|
|
||||||
buildParameters.CopyBuildinFileOption = AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption;
|
|
||||||
buildParameters.CopyBuildinFileTags = AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags;
|
|
||||||
|
|
||||||
if (AssetBundleBuilderSettingData.Setting.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
|
||||||
{
|
|
||||||
buildParameters.SBPParameters = new BuildParameters.SBPBuildParameters();
|
|
||||||
buildParameters.SBPParameters.WriteLinkXML = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var builder = new AssetBundleBuilder();
|
|
||||||
var buildResult = builder.Run(buildParameters);
|
|
||||||
if (buildResult.Success)
|
|
||||||
{
|
|
||||||
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建版本相关
|
|
||||||
private string GetBuildPackageVersion()
|
|
||||||
{
|
|
||||||
int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
|
|
||||||
return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建包裹相关
|
|
||||||
private int GetDefaultPackageIndex(string packageName)
|
|
||||||
{
|
|
||||||
for (int index = 0; index < _buildPackageNames.Count; index++)
|
|
||||||
{
|
|
||||||
if (_buildPackageNames[index] == packageName)
|
|
||||||
{
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
|
||||||
AssetBundleBuilderSettingData.Setting.BuildPackage = _buildPackageNames[0];
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
private List<string> GetBuildPackageNames()
|
private List<string> GetBuildPackageNames()
|
||||||
{
|
{
|
||||||
|
@ -328,31 +120,41 @@ namespace YooAsset.Editor
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加密类相关
|
private void PackageMenuAction(DropdownMenuAction action)
|
||||||
private int GetDefaultEncryptionIndex(string className)
|
|
||||||
{
|
{
|
||||||
for (int index = 0; index < _encryptionServicesClassNames.Count; index++)
|
var packageName = (string)action.userData;
|
||||||
|
if (_buildPackage != packageName)
|
||||||
{
|
{
|
||||||
if (_encryptionServicesClassNames[index] == className)
|
_buildPackage = packageName;
|
||||||
{
|
RefreshBuildPipelineView();
|
||||||
return index;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
private DropdownMenuAction.Status PackageMenuFun(DropdownMenuAction action)
|
||||||
|
{
|
||||||
|
var packageName = (string)action.userData;
|
||||||
|
if (_buildPackage == packageName)
|
||||||
|
return DropdownMenuAction.Status.Checked;
|
||||||
|
else
|
||||||
|
return DropdownMenuAction.Status.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
AssetBundleBuilderSettingData.IsDirty = true;
|
private void PipelineMenuAction(DropdownMenuAction action)
|
||||||
AssetBundleBuilderSettingData.Setting.EncyptionClassName = _encryptionServicesClassNames[0];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
private List<Type> GetEncryptionServicesClassTypes()
|
|
||||||
{
|
{
|
||||||
return EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
|
var pipelineType = (EBuildPipeline)action.userData;
|
||||||
|
if (_buildPipeline != pipelineType)
|
||||||
|
{
|
||||||
|
_buildPipeline = pipelineType;
|
||||||
|
AssetBundleBuilderSetting.SetPackageBuildPipeline(_buildPackage, pipelineType);
|
||||||
|
RefreshBuildPipelineView();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private IEncryptionServices CreateEncryptionServicesInstance()
|
private DropdownMenuAction.Status PipelineMenuFun(DropdownMenuAction action)
|
||||||
{
|
{
|
||||||
if (_encryptionField.index < 0)
|
var pipelineType = (EBuildPipeline)action.userData;
|
||||||
return null;
|
if (_buildPipeline == pipelineType)
|
||||||
var classType = _encryptionServicesClassTypes[_encryptionField.index];
|
return DropdownMenuAction.Status.Checked;
|
||||||
return (IEncryptionServices)Activator.CreateInstance(classType);
|
else
|
||||||
|
return DropdownMenuAction.Status.Normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,4 @@
|
||||||
<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: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">
|
||||||
<uie:Toolbar name="Toolbar" style="display: flex; flex-direction: row-reverse;">
|
<uie:Toolbar name="Toolbar" style="display: flex; flex-direction: row;" />
|
||||||
<ui:Button text="Save" display-tooltip-when-elided="true" name="SaveButton" style="background-color: rgb(56, 147, 58);" />
|
<ui:VisualElement name="Container" />
|
||||||
</uie:Toolbar>
|
|
||||||
<ui:VisualElement name="BuildContainer">
|
|
||||||
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
|
|
||||||
<uie:EnumField label="Build Pipeline" name="BuildPipeline" />
|
|
||||||
<uie:EnumField label="Build Mode" name="BuildMode" />
|
|
||||||
<ui:TextField picking-mode="Ignore" label="Build Version" name="BuildVersion" style="width: 350px;" />
|
|
||||||
<ui:VisualElement name="BuildPackageContainer" style="height: 24px;" />
|
|
||||||
<ui:VisualElement name="EncryptionContainer" style="height: 24px;" />
|
|
||||||
<uie:EnumField label="Compression" value="Center" name="Compression" />
|
|
||||||
<uie:EnumField label="Output Name Style" value="Center" name="OutputNameStyle" />
|
|
||||||
<uie:EnumField label="Copy Buildin File Option" value="Center" name="CopyBuildinFileOption" />
|
|
||||||
<ui:TextField picking-mode="Ignore" label="Copy Buildin File Tags" name="CopyBuildinFileTags" />
|
|
||||||
<ui:Button text="构建" display-tooltip-when-elided="true" name="Build" style="height: 50px; background-color: rgb(40, 106, 42); margin-top: 10px;" />
|
|
||||||
</ui:VisualElement>
|
|
||||||
</ui:UXML>
|
</ui:UXML>
|
||||||
|
|
|
@ -8,29 +8,92 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 模拟构建
|
/// 模拟构建
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string SimulateBuild(string packageName)
|
public static string SimulateBuild(string buildPipelineName, string packageName)
|
||||||
{
|
{
|
||||||
Debug.Log($"Begin to create simulate package : {packageName}");
|
if (buildPipelineName == EBuildPipeline.BuiltinBuildPipeline.ToString())
|
||||||
BuildParameters buildParameters = new BuildParameters();
|
|
||||||
buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
|
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
|
||||||
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
|
||||||
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
|
||||||
buildParameters.PackageName = packageName;
|
|
||||||
buildParameters.PackageVersion = "Simulate";
|
|
||||||
buildParameters.EnableLog = false;
|
|
||||||
|
|
||||||
AssetBundleBuilder builder = new AssetBundleBuilder();
|
|
||||||
var buildResult = builder.Run(buildParameters);
|
|
||||||
if (buildResult.Success)
|
|
||||||
{
|
{
|
||||||
string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
BuiltinBuildParameters buildParameters = new BuiltinBuildParameters();
|
||||||
string manifestFilePath = $"{buildResult.OutputPackageDirectory}/{manifestFileName}";
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
return manifestFilePath;
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = buildPipelineName;
|
||||||
|
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||||
|
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
||||||
|
buildParameters.PackageName = packageName;
|
||||||
|
buildParameters.PackageVersion = "Simulate";
|
||||||
|
buildParameters.FileNameStyle = EFileNameStyle.HashName;
|
||||||
|
buildParameters.BuildinFileCopyOption = EBuildinFileCopyOption.None;
|
||||||
|
buildParameters.BuildinFileCopyParams = string.Empty;
|
||||||
|
|
||||||
|
BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, false);
|
||||||
|
if (buildResult.Success)
|
||||||
|
{
|
||||||
|
string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||||
|
string manifestFilePath = $"{buildResult.OutputPackageDirectory}/{manifestFileName}";
|
||||||
|
return manifestFilePath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (buildPipelineName == EBuildPipeline.ScriptableBuildPipeline.ToString())
|
||||||
|
{
|
||||||
|
ScriptableBuildParameters buildParameters = new ScriptableBuildParameters();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = buildPipelineName;
|
||||||
|
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||||
|
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
||||||
|
buildParameters.PackageName = packageName;
|
||||||
|
buildParameters.PackageVersion = "Simulate";
|
||||||
|
buildParameters.FileNameStyle = EFileNameStyle.HashName;
|
||||||
|
buildParameters.BuildinFileCopyOption = EBuildinFileCopyOption.None;
|
||||||
|
buildParameters.BuildinFileCopyParams = string.Empty;
|
||||||
|
|
||||||
|
ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, true);
|
||||||
|
if (buildResult.Success)
|
||||||
|
{
|
||||||
|
string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||||
|
string manifestFilePath = $"{buildResult.OutputPackageDirectory}/{manifestFileName}";
|
||||||
|
return manifestFilePath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (buildPipelineName == EBuildPipeline.RawFileBuildPipeline.ToString())
|
||||||
|
{
|
||||||
|
RawFileBuildParameters buildParameters = new RawFileBuildParameters();
|
||||||
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
|
||||||
|
buildParameters.BuildPipeline = buildPipelineName;
|
||||||
|
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||||
|
buildParameters.BuildMode = EBuildMode.SimulateBuild;
|
||||||
|
buildParameters.PackageName = packageName;
|
||||||
|
buildParameters.PackageVersion = "Simulate";
|
||||||
|
buildParameters.FileNameStyle = EFileNameStyle.HashName;
|
||||||
|
buildParameters.BuildinFileCopyOption = EBuildinFileCopyOption.None;
|
||||||
|
buildParameters.BuildinFileCopyParams = string.Empty;
|
||||||
|
|
||||||
|
RawFileBuildPipeline pipeline = new RawFileBuildPipeline();
|
||||||
|
var buildResult = pipeline.Run(buildParameters, true);
|
||||||
|
if (buildResult.Success)
|
||||||
|
{
|
||||||
|
string manifestFileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||||
|
string manifestFilePath = $"{buildResult.OutputPackageDirectory}/{manifestFileName}";
|
||||||
|
return manifestFilePath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return null;
|
throw new System.NotImplementedException(buildPipelineName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,9 @@ namespace YooAsset.Editor
|
||||||
public string AssetGUID { private set; get; }
|
public string AssetGUID { private set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否为原生资源
|
/// 资源类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRawAsset { private set; get; }
|
public System.Type AssetType { private set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否为着色器资源
|
/// 是否为着色器资源
|
||||||
|
@ -50,11 +50,6 @@ namespace YooAsset.Editor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly List<string> AssetTags = new List<string>();
|
public readonly List<string> AssetTags = new List<string>();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 资源包的分类标签
|
|
||||||
/// </summary>
|
|
||||||
public readonly List<string> BundleTags = new List<string>();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 依赖的所有资源
|
/// 依赖的所有资源
|
||||||
/// 注意:包括零依赖资源和冗余资源(资源包名无效)
|
/// 注意:包括零依赖资源和冗余资源(资源包名无效)
|
||||||
|
@ -62,17 +57,16 @@ namespace YooAsset.Editor
|
||||||
public List<BuildAssetInfo> AllDependAssetInfos { private set; get; }
|
public List<BuildAssetInfo> AllDependAssetInfos { private set; get; }
|
||||||
|
|
||||||
|
|
||||||
public BuildAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, bool isRawAsset)
|
public BuildAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath)
|
||||||
{
|
{
|
||||||
CollectorType = collectorType;
|
CollectorType = collectorType;
|
||||||
BundleName = bundleName;
|
BundleName = bundleName;
|
||||||
Address = address;
|
Address = address;
|
||||||
AssetPath = assetPath;
|
AssetPath = assetPath;
|
||||||
IsRawAsset = isRawAsset;
|
|
||||||
|
|
||||||
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
||||||
System.Type assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
AssetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||||||
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
|
if (AssetType == typeof(UnityEngine.Shader) || AssetType == typeof(UnityEngine.ShaderVariantCollection))
|
||||||
IsShaderAsset = true;
|
IsShaderAsset = true;
|
||||||
else
|
else
|
||||||
IsShaderAsset = false;
|
IsShaderAsset = false;
|
||||||
|
@ -82,11 +76,10 @@ namespace YooAsset.Editor
|
||||||
CollectorType = ECollectorType.None;
|
CollectorType = ECollectorType.None;
|
||||||
Address = string.Empty;
|
Address = string.Empty;
|
||||||
AssetPath = assetPath;
|
AssetPath = assetPath;
|
||||||
IsRawAsset = false;
|
|
||||||
|
|
||||||
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
AssetGUID = UnityEditor.AssetDatabase.AssetPathToGUID(assetPath);
|
||||||
System.Type assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
AssetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||||||
if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection))
|
if (AssetType == typeof(UnityEngine.Shader) || AssetType == typeof(UnityEngine.ShaderVariantCollection))
|
||||||
IsShaderAsset = true;
|
IsShaderAsset = true;
|
||||||
else
|
else
|
||||||
IsShaderAsset = false;
|
IsShaderAsset = false;
|
||||||
|
@ -96,7 +89,7 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置所有依赖的资源
|
/// 设置所有依赖的资源
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetAllDependAssetInfos(List<BuildAssetInfo> dependAssetInfos)
|
public void SetDependAssetInfos(List<BuildAssetInfo> dependAssetInfos)
|
||||||
{
|
{
|
||||||
if (AllDependAssetInfos != null)
|
if (AllDependAssetInfos != null)
|
||||||
throw new System.Exception("Should never get here !");
|
throw new System.Exception("Should never get here !");
|
||||||
|
@ -123,32 +116,6 @@ namespace YooAsset.Editor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 添加资源包的分类标签
|
|
||||||
/// 说明:传染算法统计到的分类标签
|
|
||||||
/// </summary>
|
|
||||||
public void AddBundleTags(List<string> tags)
|
|
||||||
{
|
|
||||||
foreach (var tag in tags)
|
|
||||||
{
|
|
||||||
if (BundleTags.Contains(tag) == false)
|
|
||||||
{
|
|
||||||
BundleTags.Add(tag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 资源包名是否存在
|
|
||||||
/// </summary>
|
|
||||||
public bool HasBundleName()
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(BundleName))
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加关联的资源包名称
|
/// 添加关联的资源包名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -162,33 +129,14 @@ namespace YooAsset.Editor
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 计算共享资源包的完整包名
|
/// 资源包名是否存在
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void CalculateShareBundleName(ISharedPackRule sharedPackRule, bool uniqueBundleName, string packageName, string shadersBundleName)
|
public bool HasBundleName()
|
||||||
{
|
{
|
||||||
if (CollectorType != ECollectorType.None)
|
if (string.IsNullOrEmpty(BundleName))
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
if (IsRawAsset)
|
|
||||||
throw new Exception("Should never get here !");
|
|
||||||
|
|
||||||
if (IsShaderAsset)
|
|
||||||
{
|
|
||||||
BundleName = shadersBundleName;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
return true;
|
||||||
if (_referenceBundleNames.Count > 1)
|
|
||||||
{
|
|
||||||
PackRuleResult packRuleResult = sharedPackRule.GetPackRuleResult(AssetPath);
|
|
||||||
BundleName = packRuleResult.GetShareBundleName(packageName, uniqueBundleName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 注意:被引用次数小于1的资源不需要设置资源包名称
|
|
||||||
BundleName = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -57,51 +57,21 @@ namespace YooAsset.Editor
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 参与构建的资源列表
|
||||||
|
/// 注意:不包含零依赖资源和冗余资源
|
||||||
|
/// </summary>
|
||||||
|
public readonly List<BuildAssetInfo> MainAssets = new List<BuildAssetInfo>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源包名称
|
/// 资源包名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string BundleName { private set; get; }
|
public string BundleName { private set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 参与构建的资源列表
|
/// 加密文件
|
||||||
/// 注意:不包含零依赖资源和冗余资源
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly List<BuildAssetInfo> AllMainAssets = new List<BuildAssetInfo>();
|
public bool Encrypted { set; get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Bundle文件的加载方法
|
|
||||||
/// </summary>
|
|
||||||
public EBundleLoadMethod LoadMethod { set; get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否为原生文件
|
|
||||||
/// </summary>
|
|
||||||
public bool IsRawFile
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
foreach (var assetInfo in AllMainAssets)
|
|
||||||
{
|
|
||||||
if (assetInfo.IsRawAsset)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否为加密文件
|
|
||||||
/// </summary>
|
|
||||||
public bool IsEncryptedFile
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(EncryptedFilePath))
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public BuildBundleInfo(string bundleName)
|
public BuildBundleInfo(string bundleName)
|
||||||
|
@ -117,7 +87,7 @@ namespace YooAsset.Editor
|
||||||
if (IsContainsAsset(assetInfo.AssetPath))
|
if (IsContainsAsset(assetInfo.AssetPath))
|
||||||
throw new System.Exception($"Asset is existed : {assetInfo.AssetPath}");
|
throw new System.Exception($"Asset is existed : {assetInfo.AssetPath}");
|
||||||
|
|
||||||
AllMainAssets.Add(assetInfo);
|
MainAssets.Add(assetInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -125,7 +95,7 @@ namespace YooAsset.Editor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsContainsAsset(string assetPath)
|
public bool IsContainsAsset(string assetPath)
|
||||||
{
|
{
|
||||||
foreach (var assetInfo in AllMainAssets)
|
foreach (var assetInfo in MainAssets)
|
||||||
{
|
{
|
||||||
if (assetInfo.AssetPath == assetPath)
|
if (assetInfo.AssetPath == assetPath)
|
||||||
{
|
{
|
||||||
|
@ -135,29 +105,12 @@ namespace YooAsset.Editor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取资源包的分类标签列表
|
|
||||||
/// </summary>
|
|
||||||
public string[] GetBundleTags()
|
|
||||||
{
|
|
||||||
List<string> result = new List<string>(AllMainAssets.Count);
|
|
||||||
foreach (var assetInfo in AllMainAssets)
|
|
||||||
{
|
|
||||||
foreach (var assetTag in assetInfo.BundleTags)
|
|
||||||
{
|
|
||||||
if (result.Contains(assetTag) == false)
|
|
||||||
result.Add(assetTag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取构建的资源路径列表
|
/// 获取构建的资源路径列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[] GetAllMainAssetPaths()
|
public string[] GetAllMainAssetPaths()
|
||||||
{
|
{
|
||||||
return AllMainAssets.Select(t => t.AssetPath).ToArray();
|
return MainAssets.Select(t => t.AssetPath).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -167,7 +120,7 @@ namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
var packAssets = GetAllMainAssetPaths();
|
var packAssets = GetAllMainAssetPaths();
|
||||||
List<string> result = new List<string>(packAssets);
|
List<string> result = new List<string>(packAssets);
|
||||||
foreach (var assetInfo in AllMainAssets)
|
foreach (var assetInfo in MainAssets)
|
||||||
{
|
{
|
||||||
if (assetInfo.AllDependAssetInfos == null)
|
if (assetInfo.AllDependAssetInfos == null)
|
||||||
continue;
|
continue;
|
||||||
|
@ -202,7 +155,7 @@ namespace YooAsset.Editor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public BuildAssetInfo[] GetAllManifestAssetInfos()
|
public BuildAssetInfo[] GetAllManifestAssetInfos()
|
||||||
{
|
{
|
||||||
return AllMainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
|
return MainAssets.Where(t => t.CollectorType == ECollectorType.MainAssetCollector).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -216,9 +169,7 @@ namespace YooAsset.Editor
|
||||||
packageBundle.FileCRC = PackageFileCRC;
|
packageBundle.FileCRC = PackageFileCRC;
|
||||||
packageBundle.FileSize = PackageFileSize;
|
packageBundle.FileSize = PackageFileSize;
|
||||||
packageBundle.UnityCRC = PackageUnityCRC;
|
packageBundle.UnityCRC = PackageUnityCRC;
|
||||||
packageBundle.IsRawFile = IsRawFile;
|
packageBundle.Encrypted = Encrypted;
|
||||||
packageBundle.LoadMethod = (byte)LoadMethod;
|
|
||||||
packageBundle.Tags = GetBundleTags();
|
|
||||||
return packageBundle;
|
return packageBundle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,16 @@ namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
public class BuildMapContext : IContextObject
|
public class BuildMapContext : IContextObject
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 资源包集合
|
||||||
|
/// </summary>
|
||||||
private readonly Dictionary<string, BuildBundleInfo> _bundleInfoDic = new Dictionary<string, BuildBundleInfo>(10000);
|
private readonly Dictionary<string, BuildBundleInfo> _bundleInfoDic = new Dictionary<string, BuildBundleInfo>(10000);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 冗余的资源列表
|
/// 冗余的资源列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly List<ReportRedundancyInfo> RedundancyInfos= new List<ReportRedundancyInfo>(1000);
|
public readonly List<ReportRedundancyInfo> RedundancyInfos = new List<ReportRedundancyInfo>(1000);
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 参与构建的资源总数
|
/// 参与构建的资源总数
|
||||||
|
@ -22,7 +26,7 @@ namespace YooAsset.Editor
|
||||||
public int AssetFileCount;
|
public int AssetFileCount;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 收集命令
|
/// 资源收集命令
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public CollectCommand Command { set; get; }
|
public CollectCommand Command { set; get; }
|
||||||
|
|
||||||
|
@ -87,8 +91,7 @@ namespace YooAsset.Editor
|
||||||
List<UnityEditor.AssetBundleBuild> builds = new List<UnityEditor.AssetBundleBuild>(_bundleInfoDic.Count);
|
List<UnityEditor.AssetBundleBuild> builds = new List<UnityEditor.AssetBundleBuild>(_bundleInfoDic.Count);
|
||||||
foreach (var bundleInfo in _bundleInfoDic.Values)
|
foreach (var bundleInfo in _bundleInfoDic.Values)
|
||||||
{
|
{
|
||||||
if (bundleInfo.IsRawFile == false)
|
builds.Add(bundleInfo.CreatePipelineBuild());
|
||||||
builds.Add(bundleInfo.CreatePipelineBuild());
|
|
||||||
}
|
}
|
||||||
return builds.ToArray();
|
return builds.ToArray();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
using System.Collections;
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
|
@ -7,54 +9,27 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建参数
|
/// 构建参数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class BuildParameters
|
public abstract class BuildParameters
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// SBP构建参数
|
|
||||||
/// </summary>
|
|
||||||
public class SBPBuildParameters
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 生成代码防裁剪配置
|
|
||||||
/// </summary>
|
|
||||||
public bool WriteLinkXML = true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 缓存服务器地址
|
|
||||||
/// </summary>
|
|
||||||
public string CacheServerHost;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 缓存服务器端口
|
|
||||||
/// </summary>
|
|
||||||
public int CacheServerPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 可编程构建管线的参数
|
|
||||||
/// </summary>
|
|
||||||
public SBPBuildParameters SBPParameters;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 内置资源的根目录
|
|
||||||
/// </summary>
|
|
||||||
public string StreamingAssetsRoot;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建输出的根目录
|
/// 构建输出的根目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string BuildOutputRoot;
|
public string BuildOutputRoot;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建的平台
|
/// 内置文件的根目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public BuildTarget BuildTarget;
|
public string BuildinFileRoot;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建管线
|
/// 构建管线
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EBuildPipeline BuildPipeline;
|
public string BuildPipeline;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建的平台
|
||||||
|
/// </summary>
|
||||||
|
public BuildTarget BuildTarget;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建模式
|
/// 构建模式
|
||||||
|
@ -72,54 +47,140 @@ namespace YooAsset.Editor
|
||||||
public string PackageVersion;
|
public string PackageVersion;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否显示普通日志
|
|
||||||
/// </summary>
|
|
||||||
public bool EnableLog = true;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 验证构建结果
|
/// 验证构建结果
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool VerifyBuildingResult = false;
|
public bool VerifyBuildingResult = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 共享资源的打包规则
|
/// 资源包名称样式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ISharedPackRule SharedPackRule = null;
|
public EFileNameStyle FileNameStyle;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源的加密接口
|
/// 内置文件的拷贝选项
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IEncryptionServices EncryptionServices = null;
|
public EBuildinFileCopyOption BuildinFileCopyOption;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 补丁文件名称的样式
|
/// 内置文件的拷贝参数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EOutputNameStyle OutputNameStyle = EOutputNameStyle.HashName;
|
public string BuildinFileCopyParams;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 拷贝内置资源选项
|
/// 资源包加密服务类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ECopyBuildinFileOption CopyBuildinFileOption = ECopyBuildinFileOption.None;
|
public IEncryptionServices EncryptionServices;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private string _pipelineOutputDirectory = string.Empty;
|
||||||
|
private string _packageOutputDirectory = string.Empty;
|
||||||
|
private string _packageRootDirectory = string.Empty;
|
||||||
|
private string _buildinRootDirectory = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 拷贝内置资源的标签
|
/// 检测构建参数是否合法
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string CopyBuildinFileTags = string.Empty;
|
public virtual void CheckBuildParameters()
|
||||||
|
{
|
||||||
|
// 检测当前是否正在构建资源包
|
||||||
|
if (UnityEditor.BuildPipeline.isBuildingPlayer)
|
||||||
|
throw new Exception("当前正在构建资源包,请结束后再试");
|
||||||
|
|
||||||
|
// 检测构建参数合法性
|
||||||
|
if (BuildTarget == BuildTarget.NoTarget)
|
||||||
|
throw new Exception("请选择目标平台!");
|
||||||
|
if (string.IsNullOrEmpty(PackageName))
|
||||||
|
throw new Exception("包裹名称不能为空!");
|
||||||
|
if (string.IsNullOrEmpty(PackageVersion))
|
||||||
|
throw new Exception("包裹版本不能为空!");
|
||||||
|
if (string.IsNullOrEmpty(BuildOutputRoot))
|
||||||
|
throw new Exception("构建输出的根目录为空!");
|
||||||
|
if (string.IsNullOrEmpty(BuildinFileRoot))
|
||||||
|
throw new Exception("内置资源根目录为空!");
|
||||||
|
|
||||||
|
// 检测是否有未保存场景
|
||||||
|
if (BuildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
if (EditorTools.HasDirtyScenes())
|
||||||
|
throw new Exception("检测到未保存的场景文件");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 强制构建删除包裹目录
|
||||||
|
if (BuildMode == EBuildMode.ForceRebuild)
|
||||||
|
{
|
||||||
|
string packageRootDirectory = GetPackageRootDirectory();
|
||||||
|
if (EditorTools.DeleteDirectory(packageRootDirectory))
|
||||||
|
{
|
||||||
|
BuildLogger.Log($"删除包裹目录:{packageRootDirectory}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检测包裹输出目录是否存在
|
||||||
|
if (BuildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
string packageOutputDirectory = GetPackageOutputDirectory();
|
||||||
|
if (Directory.Exists(packageOutputDirectory))
|
||||||
|
throw new Exception($"本次构建的补丁目录已经存在:{packageOutputDirectory}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果输出目录不存在
|
||||||
|
string pipelineOutputDirectory = GetPipelineOutputDirectory();
|
||||||
|
if (EditorTools.CreateDirectory(pipelineOutputDirectory))
|
||||||
|
{
|
||||||
|
BuildLogger.Log($"创建输出目录:{pipelineOutputDirectory}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 压缩选项
|
/// 获取构建管线的输出目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ECompressOption CompressOption = ECompressOption.Uncompressed;
|
/// <returns></returns>
|
||||||
|
public string GetPipelineOutputDirectory()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_pipelineOutputDirectory))
|
||||||
|
{
|
||||||
|
_pipelineOutputDirectory = $"{BuildOutputRoot}/{BuildTarget}/{PackageName}/{YooAssetSettings.OutputFolderName}";
|
||||||
|
}
|
||||||
|
return _pipelineOutputDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 禁止写入类型树结构(可以降低包体和内存并提高加载效率)
|
/// 获取本次构建的补丁输出目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DisableWriteTypeTree = false;
|
public string GetPackageOutputDirectory()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_packageOutputDirectory))
|
||||||
|
{
|
||||||
|
_packageOutputDirectory = $"{BuildOutputRoot}/{BuildTarget}/{PackageName}/{PackageVersion}";
|
||||||
|
}
|
||||||
|
return _packageOutputDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 忽略类型树变化
|
/// 获取本次构建的补丁根目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IgnoreTypeTreeChanges = true;
|
public string GetPackageRootDirectory()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_packageRootDirectory))
|
||||||
|
{
|
||||||
|
_packageRootDirectory = $"{BuildOutputRoot}/{BuildTarget}/{PackageName}";
|
||||||
|
}
|
||||||
|
return _packageRootDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取内置资源的根目录
|
||||||
|
/// </summary>
|
||||||
|
public string GetBuildinRootDirectory()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_buildinRootDirectory))
|
||||||
|
{
|
||||||
|
_buildinRootDirectory = $"{BuildinFileRoot}/{PackageName}";
|
||||||
|
}
|
||||||
|
return _buildinRootDirectory;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,17 +1,13 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
public class BuildParametersContext : IContextObject
|
public class BuildParametersContext : IContextObject
|
||||||
{
|
{
|
||||||
private string _pipelineOutputDirectory = string.Empty;
|
|
||||||
private string _packageOutputDirectory = string.Empty;
|
|
||||||
private string _packageRootDirectory = string.Empty;
|
|
||||||
private string _streamingAssetsDirectory = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建参数
|
/// 构建参数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -23,17 +19,21 @@ namespace YooAsset.Editor
|
||||||
Parameters = parameters;
|
Parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检测构建参数是否合法
|
||||||
|
/// </summary>
|
||||||
|
public void CheckBuildParameters()
|
||||||
|
{
|
||||||
|
Parameters.CheckBuildParameters();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取构建管线的输出目录
|
/// 获取构建管线的输出目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public string GetPipelineOutputDirectory()
|
public string GetPipelineOutputDirectory()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_pipelineOutputDirectory))
|
return Parameters.GetPipelineOutputDirectory();
|
||||||
{
|
|
||||||
_pipelineOutputDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{YooAssetSettings.OutputFolderName}";
|
|
||||||
}
|
|
||||||
return _pipelineOutputDirectory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -41,11 +41,7 @@ namespace YooAsset.Editor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string GetPackageOutputDirectory()
|
public string GetPackageOutputDirectory()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_packageOutputDirectory))
|
return Parameters.GetPackageOutputDirectory();
|
||||||
{
|
|
||||||
_packageOutputDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}/{Parameters.PackageVersion}";
|
|
||||||
}
|
|
||||||
return _packageOutputDirectory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -53,93 +49,15 @@ namespace YooAsset.Editor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string GetPackageRootDirectory()
|
public string GetPackageRootDirectory()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_packageRootDirectory))
|
return Parameters.GetPackageRootDirectory();
|
||||||
{
|
|
||||||
_packageRootDirectory = $"{Parameters.BuildOutputRoot}/{Parameters.BuildTarget}/{Parameters.PackageName}";
|
|
||||||
}
|
|
||||||
return _packageRootDirectory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取内置资源的目录
|
/// 获取内置资源的根目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string GetStreamingAssetsDirectory()
|
public string GetBuildinRootDirectory()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_streamingAssetsDirectory))
|
return Parameters.GetBuildinRootDirectory();
|
||||||
{
|
|
||||||
_streamingAssetsDirectory = $"{Parameters.StreamingAssetsRoot}/{Parameters.PackageName}";
|
|
||||||
}
|
|
||||||
return _streamingAssetsDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取内置构建管线的构建选项
|
|
||||||
/// </summary>
|
|
||||||
public BuildAssetBundleOptions GetPipelineBuildOptions()
|
|
||||||
{
|
|
||||||
// For the new build system, unity always need BuildAssetBundleOptions.CollectDependencies and BuildAssetBundleOptions.DeterministicAssetBundle
|
|
||||||
// 除非设置ForceRebuildAssetBundle标记,否则会进行增量打包
|
|
||||||
|
|
||||||
if (Parameters.BuildMode == EBuildMode.SimulateBuild)
|
|
||||||
throw new Exception("Should never get here !");
|
|
||||||
|
|
||||||
BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
|
|
||||||
opt |= BuildAssetBundleOptions.StrictMode; //Do not allow the build to succeed if any errors are reporting during it.
|
|
||||||
|
|
||||||
if (Parameters.BuildMode == EBuildMode.DryRunBuild)
|
|
||||||
{
|
|
||||||
opt |= BuildAssetBundleOptions.DryRunBuild;
|
|
||||||
return opt;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Parameters.CompressOption == ECompressOption.Uncompressed)
|
|
||||||
opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
|
|
||||||
else if (Parameters.CompressOption == ECompressOption.LZ4)
|
|
||||||
opt |= BuildAssetBundleOptions.ChunkBasedCompression;
|
|
||||||
|
|
||||||
if (Parameters.BuildMode == EBuildMode.ForceRebuild)
|
|
||||||
opt |= BuildAssetBundleOptions.ForceRebuildAssetBundle; //Force rebuild the asset bundles
|
|
||||||
if (Parameters.DisableWriteTypeTree)
|
|
||||||
opt |= BuildAssetBundleOptions.DisableWriteTypeTree; //Do not include type information within the asset bundle (don't write type tree).
|
|
||||||
if (Parameters.IgnoreTypeTreeChanges)
|
|
||||||
opt |= BuildAssetBundleOptions.IgnoreTypeTreeChanges; //Ignore the type tree changes when doing the incremental build check.
|
|
||||||
|
|
||||||
opt |= BuildAssetBundleOptions.DisableLoadAssetByFileName; //Disables Asset Bundle LoadAsset by file name.
|
|
||||||
opt |= BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension; //Disables Asset Bundle LoadAsset by file name with extension.
|
|
||||||
|
|
||||||
return opt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取可编程构建管线的构建参数
|
|
||||||
/// </summary>
|
|
||||||
public UnityEditor.Build.Pipeline.BundleBuildParameters GetSBPBuildParameters()
|
|
||||||
{
|
|
||||||
if (Parameters.BuildMode == EBuildMode.SimulateBuild)
|
|
||||||
throw new Exception("Should never get here !");
|
|
||||||
|
|
||||||
var targetGroup = BuildPipeline.GetBuildTargetGroup(Parameters.BuildTarget);
|
|
||||||
var pipelineOutputDirectory = GetPipelineOutputDirectory();
|
|
||||||
var buildParams = new UnityEditor.Build.Pipeline.BundleBuildParameters(Parameters.BuildTarget, targetGroup, pipelineOutputDirectory);
|
|
||||||
|
|
||||||
if (Parameters.CompressOption == ECompressOption.Uncompressed)
|
|
||||||
buildParams.BundleCompression = UnityEngine.BuildCompression.Uncompressed;
|
|
||||||
else if (Parameters.CompressOption == ECompressOption.LZMA)
|
|
||||||
buildParams.BundleCompression = UnityEngine.BuildCompression.LZMA;
|
|
||||||
else if (Parameters.CompressOption == ECompressOption.LZ4)
|
|
||||||
buildParams.BundleCompression = UnityEngine.BuildCompression.LZ4;
|
|
||||||
else
|
|
||||||
throw new System.NotImplementedException(Parameters.CompressOption.ToString());
|
|
||||||
|
|
||||||
if (Parameters.DisableWriteTypeTree)
|
|
||||||
buildParams.ContentBuildFlags |= UnityEditor.Build.Content.ContentBuildFlags.DisableWriteTypeTree;
|
|
||||||
|
|
||||||
buildParams.UseCache = true;
|
|
||||||
buildParams.CacheServerHost = Parameters.SBPParameters.CacheServerHost;
|
|
||||||
buildParams.CacheServerPort = Parameters.SBPParameters.CacheServerPort;
|
|
||||||
buildParams.WriteLinkXML = Parameters.SBPParameters.WriteLinkXML;
|
|
||||||
|
|
||||||
return buildParams;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 2de5a58f37a4ae64e804f150144da809
|
guid: 431722e1bca52d448825f603789d7e4b
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
|
@ -0,0 +1,82 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class TaskCopyBuildinFiles
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 拷贝首包资源文件
|
||||||
|
/// </summary>
|
||||||
|
internal void CopyBuildinFilesToStreaming(BuildParametersContext buildParametersContext, PackageManifest manifest)
|
||||||
|
{
|
||||||
|
EBuildinFileCopyOption copyOption = buildParametersContext.Parameters.BuildinFileCopyOption;
|
||||||
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
|
string buildinRootDirectory = buildParametersContext.GetBuildinRootDirectory();
|
||||||
|
string buildPackageName = buildParametersContext.Parameters.PackageName;
|
||||||
|
string buildPackageVersion = buildParametersContext.Parameters.PackageVersion;
|
||||||
|
|
||||||
|
// 清空内置文件的目录
|
||||||
|
if (copyOption == EBuildinFileCopyOption.ClearAndCopyAll || copyOption == EBuildinFileCopyOption.ClearAndCopyByTags)
|
||||||
|
{
|
||||||
|
EditorTools.ClearFolder(buildinRootDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝补丁清单文件
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildPackageName, buildPackageVersion);
|
||||||
|
string sourcePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
string destPath = $"{buildinRootDirectory}/{fileName}";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝补丁清单哈希文件
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageHashFileName(buildPackageName, buildPackageVersion);
|
||||||
|
string sourcePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
string destPath = $"{buildinRootDirectory}/{fileName}";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝补丁清单版本文件
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageVersionFileName(buildPackageName);
|
||||||
|
string sourcePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
string destPath = $"{buildinRootDirectory}/{fileName}";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝文件列表(所有文件)
|
||||||
|
if (copyOption == EBuildinFileCopyOption.ClearAndCopyAll || copyOption == EBuildinFileCopyOption.OnlyCopyAll)
|
||||||
|
{
|
||||||
|
foreach (var packageBundle in manifest.BundleList)
|
||||||
|
{
|
||||||
|
string sourcePath = $"{packageOutputDirectory}/{packageBundle.FileName}";
|
||||||
|
string destPath = $"{buildinRootDirectory}/{packageBundle.FileName}";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝文件列表(带标签的文件)
|
||||||
|
if (copyOption == EBuildinFileCopyOption.ClearAndCopyByTags || copyOption == EBuildinFileCopyOption.OnlyCopyByTags)
|
||||||
|
{
|
||||||
|
string[] tags = buildParametersContext.Parameters.BuildinFileCopyParams.Split(';');
|
||||||
|
foreach (var packageBundle in manifest.BundleList)
|
||||||
|
{
|
||||||
|
if (packageBundle.HasTag(tags) == false)
|
||||||
|
continue;
|
||||||
|
string sourcePath = $"{packageOutputDirectory}/{packageBundle.FileName}";
|
||||||
|
string destPath = $"{buildinRootDirectory}/{packageBundle.FileName}";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刷新目录
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
BuildLogger.Log($"内置文件拷贝完成:{buildinRootDirectory}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,213 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using UnityEditor.Build.Pipeline;
|
||||||
|
using UnityEditor.Build.Pipeline.Interfaces;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class ManifestContext : IContextObject
|
||||||
|
{
|
||||||
|
internal PackageManifest Manifest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class TaskCreateManifest
|
||||||
|
{
|
||||||
|
private readonly Dictionary<string, int> _cachedBundleID = new Dictionary<string, int>(10000);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建补丁清单文件到输出目录
|
||||||
|
/// </summary>
|
||||||
|
protected void CreateManifestFile(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
|
|
||||||
|
// 创建新补丁清单
|
||||||
|
PackageManifest manifest = new PackageManifest();
|
||||||
|
manifest.FileVersion = YooAssetSettings.ManifestFileVersion;
|
||||||
|
manifest.EnableAddressable = buildMapContext.Command.EnableAddressable;
|
||||||
|
manifest.LocationToLower = buildMapContext.Command.LocationToLower;
|
||||||
|
manifest.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
|
||||||
|
manifest.OutputNameStyle = (int)buildParameters.FileNameStyle;
|
||||||
|
manifest.BuildPipeline = buildParameters.BuildPipeline;
|
||||||
|
manifest.PackageName = buildParameters.PackageName;
|
||||||
|
manifest.PackageVersion = buildParameters.PackageVersion;
|
||||||
|
manifest.BundleList = GetAllPackageBundle(buildMapContext);
|
||||||
|
manifest.AssetList = GetAllPackageAsset(buildMapContext);
|
||||||
|
|
||||||
|
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
// 处理资源包的依赖列表
|
||||||
|
ProcessBundleDepends(context, manifest);
|
||||||
|
|
||||||
|
// 处理资源包的标签集合
|
||||||
|
ProcessBundleTags(manifest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建补丁清单文本文件
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetManifestJsonFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||||
|
string filePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
ManifestTools.SerializeToJson(filePath, manifest);
|
||||||
|
BuildLogger.Log($"创建补丁清单文件:{filePath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建补丁清单二进制文件
|
||||||
|
string packageHash;
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||||
|
string filePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
ManifestTools.SerializeToBinary(filePath, manifest);
|
||||||
|
packageHash = HashUtility.FileMD5(filePath);
|
||||||
|
BuildLogger.Log($"创建补丁清单文件:{filePath}");
|
||||||
|
|
||||||
|
ManifestContext manifestContext = new ManifestContext();
|
||||||
|
byte[] bytesData = FileUtility.ReadAllBytes(filePath);
|
||||||
|
manifestContext.Manifest = ManifestTools.DeserializeFromBinary(bytesData);
|
||||||
|
context.SetContextObject(manifestContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建补丁清单哈希文件
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageHashFileName(buildParameters.PackageName, buildParameters.PackageVersion);
|
||||||
|
string filePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
FileUtility.WriteAllText(filePath, packageHash);
|
||||||
|
BuildLogger.Log($"创建补丁清单哈希文件:{filePath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建补丁清单版本文件
|
||||||
|
{
|
||||||
|
string fileName = YooAssetSettingsData.GetPackageVersionFileName(buildParameters.PackageName);
|
||||||
|
string filePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
FileUtility.WriteAllText(filePath, buildParameters.PackageVersion);
|
||||||
|
BuildLogger.Log($"创建补丁清单版本文件:{filePath}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源包的依赖集合
|
||||||
|
/// </summary>
|
||||||
|
protected abstract string[] GetBundleDepends(BuildContext context, string bundleName);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取主资源对象列表
|
||||||
|
/// </summary>
|
||||||
|
private List<PackageAsset> GetAllPackageAsset(BuildMapContext buildMapContext)
|
||||||
|
{
|
||||||
|
List<PackageAsset> result = new List<PackageAsset>(1000);
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
var assetInfos = bundleInfo.GetAllManifestAssetInfos();
|
||||||
|
foreach (var assetInfo in assetInfos)
|
||||||
|
{
|
||||||
|
PackageAsset packageAsset = new PackageAsset();
|
||||||
|
packageAsset.Address = buildMapContext.Command.EnableAddressable ? assetInfo.Address : string.Empty;
|
||||||
|
packageAsset.AssetPath = assetInfo.AssetPath;
|
||||||
|
packageAsset.AssetGUID = buildMapContext.Command.IncludeAssetGUID ? assetInfo.AssetGUID : string.Empty;
|
||||||
|
packageAsset.AssetTags = assetInfo.AssetTags.ToArray();
|
||||||
|
packageAsset.BundleID = GetCachedBundleID(assetInfo.BundleName);
|
||||||
|
result.Add(packageAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源包列表
|
||||||
|
/// </summary>
|
||||||
|
private List<PackageBundle> GetAllPackageBundle(BuildMapContext buildMapContext)
|
||||||
|
{
|
||||||
|
List<PackageBundle> result = new List<PackageBundle>(1000);
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
var packageBundle = bundleInfo.CreatePackageBundle();
|
||||||
|
result.Add(packageBundle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注意:缓存资源包索引
|
||||||
|
for (int index = 0; index < result.Count; index++)
|
||||||
|
{
|
||||||
|
string bundleName = result[index].BundleName;
|
||||||
|
_cachedBundleID.Add(bundleName, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理资源包的依赖集合
|
||||||
|
/// </summary>
|
||||||
|
private void ProcessBundleDepends(BuildContext context, PackageManifest manifest)
|
||||||
|
{
|
||||||
|
// 查询引擎生成的资源包依赖关系,然后记录到清单
|
||||||
|
foreach (var packageBundle in manifest.BundleList)
|
||||||
|
{
|
||||||
|
int mainBundleID = GetCachedBundleID(packageBundle.BundleName);
|
||||||
|
var depends = GetBundleDepends(context, packageBundle.BundleName);
|
||||||
|
List<int> dependIDs = new List<int>(depends.Length);
|
||||||
|
foreach (var dependBundleName in depends)
|
||||||
|
{
|
||||||
|
int bundleID = GetCachedBundleID(dependBundleName);
|
||||||
|
if (bundleID != mainBundleID)
|
||||||
|
dependIDs.Add(bundleID);
|
||||||
|
}
|
||||||
|
packageBundle.DependIDs = dependIDs.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理资源包的标签集合
|
||||||
|
/// </summary>
|
||||||
|
private void ProcessBundleTags(PackageManifest manifest)
|
||||||
|
{
|
||||||
|
Dictionary<int, HashSet<string>> cacheBundleTags = new Dictionary<int, HashSet<string>>(10000);
|
||||||
|
|
||||||
|
foreach (var packageAsset in manifest.AssetList)
|
||||||
|
{
|
||||||
|
// 主资源包
|
||||||
|
int bundleID = packageAsset.BundleID;
|
||||||
|
CacheBundleTags(cacheBundleTags, bundleID, packageAsset.AssetTags);
|
||||||
|
|
||||||
|
// 依赖资源包
|
||||||
|
var packageBundle = manifest.BundleList[bundleID];
|
||||||
|
foreach (var dependBundleID in packageBundle.DependIDs)
|
||||||
|
{
|
||||||
|
CacheBundleTags(cacheBundleTags, dependBundleID, packageAsset.AssetTags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int index = 0; index < manifest.BundleList.Count; index++)
|
||||||
|
{
|
||||||
|
manifest.BundleList[index].Tags = cacheBundleTags[index].ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void CacheBundleTags(Dictionary<int, HashSet<string>> cacheBundleTags, int bundleID, string[] assetTags)
|
||||||
|
{
|
||||||
|
if (cacheBundleTags.ContainsKey(bundleID) == false)
|
||||||
|
cacheBundleTags.Add(bundleID, new HashSet<string>());
|
||||||
|
|
||||||
|
foreach (var assetTag in assetTags)
|
||||||
|
{
|
||||||
|
if (cacheBundleTags[bundleID].Contains(assetTag) == false)
|
||||||
|
cacheBundleTags[bundleID].Add(assetTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源包的索引ID
|
||||||
|
/// </summary>
|
||||||
|
private int GetCachedBundleID(string bundleName)
|
||||||
|
{
|
||||||
|
if (_cachedBundleID.TryGetValue(bundleName, out int value) == false)
|
||||||
|
{
|
||||||
|
throw new Exception($"Not found cached bundle ID : {bundleName}");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,23 +6,9 @@ using UnityEditor;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute("创建构建报告文件")]
|
public class TaskCreateReport
|
||||||
public class TaskCreateReport : IBuildTask
|
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
protected void CreateReportFile(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext, ManifestContext manifestContext)
|
||||||
{
|
|
||||||
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
|
||||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
|
||||||
var manifestContext = context.GetContextObject<ManifestContext>();
|
|
||||||
|
|
||||||
var buildMode = buildParameters.Parameters.BuildMode;
|
|
||||||
if (buildMode != EBuildMode.SimulateBuild)
|
|
||||||
{
|
|
||||||
CreateReportFile(buildParameters, buildMapContext, manifestContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CreateReportFile(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext, ManifestContext manifestContext)
|
|
||||||
{
|
{
|
||||||
var buildParameters = buildParametersContext.Parameters;
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
|
||||||
|
@ -49,16 +35,33 @@ namespace YooAsset.Editor
|
||||||
buildReport.Summary.LocationToLower = buildMapContext.Command.LocationToLower;
|
buildReport.Summary.LocationToLower = buildMapContext.Command.LocationToLower;
|
||||||
buildReport.Summary.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
|
buildReport.Summary.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
|
||||||
buildReport.Summary.UniqueBundleName = buildMapContext.Command.UniqueBundleName;
|
buildReport.Summary.UniqueBundleName = buildMapContext.Command.UniqueBundleName;
|
||||||
buildReport.Summary.SharedPackRuleClassName = buildParameters.SharedPackRule == null ?
|
|
||||||
"null" : buildParameters.SharedPackRule.GetType().FullName;
|
|
||||||
buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ?
|
buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ?
|
||||||
"null" : buildParameters.EncryptionServices.GetType().FullName;
|
"null" : buildParameters.EncryptionServices.GetType().FullName;
|
||||||
|
|
||||||
// 构建参数
|
// 构建参数
|
||||||
buildReport.Summary.OutputNameStyle = buildParameters.OutputNameStyle;
|
if (buildParameters.BuildPipeline == nameof(BuiltinBuildPipeline))
|
||||||
buildReport.Summary.CompressOption = buildParameters.CompressOption;
|
{
|
||||||
buildReport.Summary.DisableWriteTypeTree = buildParameters.DisableWriteTypeTree;
|
var builtinBuildParameters = buildParameters as BuiltinBuildParameters;
|
||||||
buildReport.Summary.IgnoreTypeTreeChanges = buildParameters.IgnoreTypeTreeChanges;
|
buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle;
|
||||||
|
buildReport.Summary.CompressOption = builtinBuildParameters.CompressOption;
|
||||||
|
buildReport.Summary.DisableWriteTypeTree = builtinBuildParameters.DisableWriteTypeTree;
|
||||||
|
buildReport.Summary.IgnoreTypeTreeChanges = builtinBuildParameters.IgnoreTypeTreeChanges;
|
||||||
|
}
|
||||||
|
else if (buildParameters.BuildPipeline == nameof(ScriptableBuildPipeline))
|
||||||
|
{
|
||||||
|
var scriptableBuildParameters = buildParameters as ScriptableBuildParameters;
|
||||||
|
buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle;
|
||||||
|
buildReport.Summary.CompressOption = scriptableBuildParameters.CompressOption;
|
||||||
|
buildReport.Summary.DisableWriteTypeTree = scriptableBuildParameters.DisableWriteTypeTree;
|
||||||
|
buildReport.Summary.IgnoreTypeTreeChanges = scriptableBuildParameters.IgnoreTypeTreeChanges;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle;
|
||||||
|
buildReport.Summary.CompressOption = ECompressOption.Uncompressed;
|
||||||
|
buildReport.Summary.DisableWriteTypeTree = false;
|
||||||
|
buildReport.Summary.IgnoreTypeTreeChanges = false;
|
||||||
|
}
|
||||||
|
|
||||||
// 构建结果
|
// 构建结果
|
||||||
buildReport.Summary.AssetFileTotalCount = buildMapContext.AssetFileCount;
|
buildReport.Summary.AssetFileTotalCount = buildMapContext.AssetFileCount;
|
||||||
|
@ -67,8 +70,6 @@ namespace YooAsset.Editor
|
||||||
buildReport.Summary.AllBundleTotalSize = GetAllBundleSize(manifest);
|
buildReport.Summary.AllBundleTotalSize = GetAllBundleSize(manifest);
|
||||||
buildReport.Summary.EncryptedBundleTotalCount = GetEncryptedBundleCount(manifest);
|
buildReport.Summary.EncryptedBundleTotalCount = GetEncryptedBundleCount(manifest);
|
||||||
buildReport.Summary.EncryptedBundleTotalSize = GetEncryptedBundleSize(manifest);
|
buildReport.Summary.EncryptedBundleTotalSize = GetEncryptedBundleSize(manifest);
|
||||||
buildReport.Summary.RawBundleTotalCount = GetRawBundleCount(manifest);
|
|
||||||
buildReport.Summary.RawBundleTotalSize = GetRawBundleSize(manifest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 资源对象列表
|
// 资源对象列表
|
||||||
|
@ -83,7 +84,6 @@ namespace YooAsset.Editor
|
||||||
reportAssetInfo.AssetGUID = AssetDatabase.AssetPathToGUID(packageAsset.AssetPath);
|
reportAssetInfo.AssetGUID = AssetDatabase.AssetPathToGUID(packageAsset.AssetPath);
|
||||||
reportAssetInfo.MainBundleName = mainBundle.BundleName;
|
reportAssetInfo.MainBundleName = mainBundle.BundleName;
|
||||||
reportAssetInfo.MainBundleSize = mainBundle.FileSize;
|
reportAssetInfo.MainBundleSize = mainBundle.FileSize;
|
||||||
reportAssetInfo.DependBundles = GetDependBundles(manifest, packageAsset);
|
|
||||||
reportAssetInfo.DependAssets = GetDependAssets(buildMapContext, mainBundle.BundleName, packageAsset.AssetPath);
|
reportAssetInfo.DependAssets = GetDependAssets(buildMapContext, mainBundle.BundleName, packageAsset.AssetPath);
|
||||||
buildReport.AssetInfos.Add(reportAssetInfo);
|
buildReport.AssetInfos.Add(reportAssetInfo);
|
||||||
}
|
}
|
||||||
|
@ -98,10 +98,9 @@ namespace YooAsset.Editor
|
||||||
reportBundleInfo.FileHash = packageBundle.FileHash;
|
reportBundleInfo.FileHash = packageBundle.FileHash;
|
||||||
reportBundleInfo.FileCRC = packageBundle.FileCRC;
|
reportBundleInfo.FileCRC = packageBundle.FileCRC;
|
||||||
reportBundleInfo.FileSize = packageBundle.FileSize;
|
reportBundleInfo.FileSize = packageBundle.FileSize;
|
||||||
reportBundleInfo.IsRawFile = packageBundle.IsRawFile;
|
reportBundleInfo.Encrypted = packageBundle.Encrypted;
|
||||||
reportBundleInfo.LoadMethod = (EBundleLoadMethod)packageBundle.LoadMethod;
|
|
||||||
reportBundleInfo.Tags = packageBundle.Tags;
|
reportBundleInfo.Tags = packageBundle.Tags;
|
||||||
reportBundleInfo.ReferenceIDs = packageBundle.ReferenceIDs;
|
reportBundleInfo.DependBundles = GetDependBundles(manifest, packageBundle);
|
||||||
reportBundleInfo.AllBuiltinAssets = GetAllBuiltinAssets(buildMapContext, packageBundle.BundleName);
|
reportBundleInfo.AllBuiltinAssets = GetAllBuiltinAssets(buildMapContext, packageBundle.BundleName);
|
||||||
buildReport.BundleInfos.Add(reportBundleInfo);
|
buildReport.BundleInfos.Add(reportBundleInfo);
|
||||||
}
|
}
|
||||||
|
@ -119,10 +118,10 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取资源对象依赖的所有资源包
|
/// 获取资源对象依赖的所有资源包
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private List<string> GetDependBundles(PackageManifest manifest, PackageAsset packageAsset)
|
private List<string> GetDependBundles(PackageManifest manifest, PackageBundle packageBundle)
|
||||||
{
|
{
|
||||||
List<string> dependBundles = new List<string>(packageAsset.DependIDs.Length);
|
List<string> dependBundles = new List<string>(packageBundle.DependIDs.Length);
|
||||||
foreach (int index in packageAsset.DependIDs)
|
foreach (int index in packageBundle.DependIDs)
|
||||||
{
|
{
|
||||||
string dependBundleName = manifest.BundleList[index].BundleName;
|
string dependBundleName = manifest.BundleList[index].BundleName;
|
||||||
dependBundles.Add(dependBundleName);
|
dependBundles.Add(dependBundleName);
|
||||||
|
@ -139,7 +138,7 @@ namespace YooAsset.Editor
|
||||||
var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
|
var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
|
||||||
{
|
{
|
||||||
BuildAssetInfo findAssetInfo = null;
|
BuildAssetInfo findAssetInfo = null;
|
||||||
foreach (var assetInfo in bundleInfo.AllMainAssets)
|
foreach (var assetInfo in bundleInfo.MainAssets)
|
||||||
{
|
{
|
||||||
if (assetInfo.AssetPath == assetPath)
|
if (assetInfo.AssetPath == assetPath)
|
||||||
{
|
{
|
||||||
|
@ -190,7 +189,7 @@ namespace YooAsset.Editor
|
||||||
int fileCount = 0;
|
int fileCount = 0;
|
||||||
foreach (var packageBundle in manifest.BundleList)
|
foreach (var packageBundle in manifest.BundleList)
|
||||||
{
|
{
|
||||||
if (packageBundle.LoadMethod != (byte)EBundleLoadMethod.Normal)
|
if (packageBundle.Encrypted)
|
||||||
fileCount++;
|
fileCount++;
|
||||||
}
|
}
|
||||||
return fileCount;
|
return fileCount;
|
||||||
|
@ -200,27 +199,7 @@ namespace YooAsset.Editor
|
||||||
long fileBytes = 0;
|
long fileBytes = 0;
|
||||||
foreach (var packageBundle in manifest.BundleList)
|
foreach (var packageBundle in manifest.BundleList)
|
||||||
{
|
{
|
||||||
if (packageBundle.LoadMethod != (byte)EBundleLoadMethod.Normal)
|
if (packageBundle.Encrypted)
|
||||||
fileBytes += packageBundle.FileSize;
|
|
||||||
}
|
|
||||||
return fileBytes;
|
|
||||||
}
|
|
||||||
private int GetRawBundleCount(PackageManifest manifest)
|
|
||||||
{
|
|
||||||
int fileCount = 0;
|
|
||||||
foreach (var packageBundle in manifest.BundleList)
|
|
||||||
{
|
|
||||||
if (packageBundle.IsRawFile)
|
|
||||||
fileCount++;
|
|
||||||
}
|
|
||||||
return fileCount;
|
|
||||||
}
|
|
||||||
private long GetRawBundleSize(PackageManifest manifest)
|
|
||||||
{
|
|
||||||
long fileBytes = 0;
|
|
||||||
foreach (var packageBundle in manifest.BundleList)
|
|
||||||
{
|
|
||||||
if (packageBundle.IsRawFile)
|
|
||||||
fileBytes += packageBundle.FileSize;
|
fileBytes += packageBundle.FileSize;
|
||||||
}
|
}
|
||||||
return fileBytes;
|
return fileBytes;
|
|
@ -6,25 +6,12 @@ using System.Collections.Generic;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute("资源包加密")]
|
public class TaskEncryption
|
||||||
public class TaskEncryption : IBuildTask
|
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
|
||||||
{
|
|
||||||
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
|
||||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
|
||||||
|
|
||||||
var buildMode = buildParameters.Parameters.BuildMode;
|
|
||||||
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
|
|
||||||
{
|
|
||||||
EncryptingBundleFiles(buildParameters, buildMapContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加密文件
|
/// 加密文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void EncryptingBundleFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
public void EncryptingBundleFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
||||||
{
|
{
|
||||||
var encryptionServices = buildParametersContext.Parameters.EncryptionServices;
|
var encryptionServices = buildParametersContext.Parameters.EncryptionServices;
|
||||||
if (encryptionServices == null)
|
if (encryptionServices == null)
|
||||||
|
@ -42,21 +29,18 @@ namespace YooAsset.Editor
|
||||||
fileInfo.FilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
fileInfo.FilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||||
|
|
||||||
var encryptResult = encryptionServices.Encrypt(fileInfo);
|
var encryptResult = encryptionServices.Encrypt(fileInfo);
|
||||||
if (encryptResult.LoadMethod != EBundleLoadMethod.Normal)
|
if (encryptResult.Encrypted)
|
||||||
{
|
{
|
||||||
// 注意:原生文件不支持加密
|
|
||||||
if (bundleInfo.IsRawFile)
|
|
||||||
{
|
|
||||||
BuildLogger.Warning($"Encryption not support raw file : {bundleInfo.BundleName}");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
string filePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}.encrypt";
|
string filePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}.encrypt";
|
||||||
FileUtility.WriteAllBytes(filePath, encryptResult.EncryptedData);
|
FileUtility.WriteAllBytes(filePath, encryptResult.EncryptedData);
|
||||||
bundleInfo.EncryptedFilePath = filePath;
|
bundleInfo.EncryptedFilePath = filePath;
|
||||||
bundleInfo.LoadMethod = encryptResult.LoadMethod;
|
bundleInfo.Encrypted = true;
|
||||||
BuildLogger.Log($"Bundle文件加密完成:{filePath}");
|
BuildLogger.Log($"Bundle文件加密完成:{filePath}");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bundleInfo.Encrypted = false;
|
||||||
|
}
|
||||||
|
|
||||||
// 进度条
|
// 进度条
|
||||||
EditorTools.DisplayProgressBar("加密资源包", ++progressValue, buildMapContext.Collection.Count);
|
EditorTools.DisplayProgressBar("加密资源包", ++progressValue, buildMapContext.Collection.Count);
|
|
@ -0,0 +1,170 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class TaskGetBuildMap
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 生成资源构建上下文
|
||||||
|
/// </summary>
|
||||||
|
public BuildMapContext CreateBuildMap(BuildParameters buildParameters)
|
||||||
|
{
|
||||||
|
var buildMode = buildParameters.BuildMode;
|
||||||
|
var packageName = buildParameters.PackageName;
|
||||||
|
|
||||||
|
Dictionary<string, BuildAssetInfo> allBuildAssetInfos = new Dictionary<string, BuildAssetInfo>(1000);
|
||||||
|
|
||||||
|
// 1. 获取所有收集器收集的资源
|
||||||
|
var collectResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(buildMode, packageName);
|
||||||
|
List<CollectAssetInfo> allCollectAssetInfos = collectResult.CollectAssets;
|
||||||
|
|
||||||
|
// 2. 剔除未被引用的依赖项资源
|
||||||
|
RemoveZeroReferenceAssets(allCollectAssetInfos);
|
||||||
|
|
||||||
|
// 3. 录入所有收集器收集的资源
|
||||||
|
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||||
|
{
|
||||||
|
if (allBuildAssetInfos.ContainsKey(collectAssetInfo.AssetPath) == false)
|
||||||
|
{
|
||||||
|
if (collectAssetInfo.CollectorType != ECollectorType.MainAssetCollector)
|
||||||
|
{
|
||||||
|
if (collectAssetInfo.AssetTags.Count > 0)
|
||||||
|
{
|
||||||
|
collectAssetInfo.AssetTags.Clear();
|
||||||
|
BuildLogger.Warning($"The tags has been cleared ! {collectAssetInfo.AssetPath} ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var buildAssetInfo = new BuildAssetInfo(collectAssetInfo.CollectorType, collectAssetInfo.BundleName, collectAssetInfo.Address, collectAssetInfo.AssetPath);
|
||||||
|
buildAssetInfo.AddAssetTags(collectAssetInfo.AssetTags);
|
||||||
|
allBuildAssetInfos.Add(collectAssetInfo.AssetPath, buildAssetInfo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception($"Should never get here !");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 录入所有收集资源的依赖资源
|
||||||
|
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||||
|
{
|
||||||
|
string bundleName = collectAssetInfo.BundleName;
|
||||||
|
foreach (var dependAssetPath in collectAssetInfo.DependAssets)
|
||||||
|
{
|
||||||
|
if (allBuildAssetInfos.ContainsKey(dependAssetPath))
|
||||||
|
{
|
||||||
|
allBuildAssetInfos[dependAssetPath].AddReferenceBundleName(bundleName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var buildAssetInfo = new BuildAssetInfo(dependAssetPath);
|
||||||
|
buildAssetInfo.AddReferenceBundleName(bundleName);
|
||||||
|
allBuildAssetInfos.Add(dependAssetPath, buildAssetInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 填充所有收集资源的依赖列表
|
||||||
|
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||||
|
{
|
||||||
|
var dependAssetInfos = new List<BuildAssetInfo>(collectAssetInfo.DependAssets.Count);
|
||||||
|
foreach (var dependAssetPath in collectAssetInfo.DependAssets)
|
||||||
|
{
|
||||||
|
if (allBuildAssetInfos.TryGetValue(dependAssetPath, out BuildAssetInfo value))
|
||||||
|
dependAssetInfos.Add(value);
|
||||||
|
else
|
||||||
|
throw new Exception("Should never get here !");
|
||||||
|
}
|
||||||
|
allBuildAssetInfos[collectAssetInfo.AssetPath].SetDependAssetInfos(dependAssetInfos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 记录关键信息
|
||||||
|
BuildMapContext context = new BuildMapContext();
|
||||||
|
context.AssetFileCount = allBuildAssetInfos.Count;
|
||||||
|
context.Command = collectResult.Command;
|
||||||
|
|
||||||
|
// 7. 记录冗余资源
|
||||||
|
foreach (var buildAssetInfo in allBuildAssetInfos.Values)
|
||||||
|
{
|
||||||
|
if (buildAssetInfo.IsRedundancyAsset())
|
||||||
|
{
|
||||||
|
var redundancyInfo = new ReportRedundancyInfo();
|
||||||
|
redundancyInfo.AssetPath = buildAssetInfo.AssetPath;
|
||||||
|
redundancyInfo.AssetType = buildAssetInfo.AssetType.Name;
|
||||||
|
redundancyInfo.AssetGUID = buildAssetInfo.AssetGUID;
|
||||||
|
redundancyInfo.FileSize = FileUtility.GetFileSize(buildAssetInfo.AssetPath);
|
||||||
|
redundancyInfo.Number = buildAssetInfo.GetReferenceBundleCount();
|
||||||
|
context.RedundancyInfos.Add(redundancyInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. 移除不参与构建的资源
|
||||||
|
List<BuildAssetInfo> removeBuildList = new List<BuildAssetInfo>();
|
||||||
|
foreach (var buildAssetInfo in allBuildAssetInfos.Values)
|
||||||
|
{
|
||||||
|
if (buildAssetInfo.HasBundleName() == false)
|
||||||
|
removeBuildList.Add(buildAssetInfo);
|
||||||
|
}
|
||||||
|
foreach (var removeValue in removeBuildList)
|
||||||
|
{
|
||||||
|
allBuildAssetInfos.Remove(removeValue.AssetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 9. 构建资源列表
|
||||||
|
var allPackAssets = allBuildAssetInfos.Values.ToList();
|
||||||
|
if (allPackAssets.Count == 0)
|
||||||
|
throw new Exception("构建的资源列表不能为空");
|
||||||
|
foreach (var assetInfo in allPackAssets)
|
||||||
|
{
|
||||||
|
context.PackAsset(assetInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
private void RemoveZeroReferenceAssets(List<CollectAssetInfo> allCollectAssetInfos)
|
||||||
|
{
|
||||||
|
// 1. 检测是否任何存在依赖资源
|
||||||
|
if (allCollectAssetInfos.Exists(x => x.CollectorType == ECollectorType.DependAssetCollector) == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 2. 获取所有主资源的依赖资源集合
|
||||||
|
HashSet<string> allDependAsset = new HashSet<string>();
|
||||||
|
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||||
|
{
|
||||||
|
var collectorType = collectAssetInfo.CollectorType;
|
||||||
|
if (collectorType == ECollectorType.MainAssetCollector || collectorType == ECollectorType.StaticAssetCollector)
|
||||||
|
{
|
||||||
|
foreach (var dependAsset in collectAssetInfo.DependAssets)
|
||||||
|
{
|
||||||
|
if (allDependAsset.Contains(dependAsset) == false)
|
||||||
|
allDependAsset.Add(dependAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 找出所有零引用的依赖资源集合
|
||||||
|
List<CollectAssetInfo> removeList = new List<CollectAssetInfo>();
|
||||||
|
foreach (var collectAssetInfo in allCollectAssetInfos)
|
||||||
|
{
|
||||||
|
var collectorType = collectAssetInfo.CollectorType;
|
||||||
|
if (collectorType == ECollectorType.DependAssetCollector)
|
||||||
|
{
|
||||||
|
if (allDependAsset.Contains(collectAssetInfo.AssetPath) == false)
|
||||||
|
removeList.Add(collectAssetInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 移除所有零引用的依赖资源
|
||||||
|
foreach (var removeValue in removeList)
|
||||||
|
{
|
||||||
|
BuildLogger.Log($"发现未被依赖的资源并自动移除 : {removeValue.AssetPath}");
|
||||||
|
allCollectAssetInfos.Remove(removeValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public abstract class TaskUpdateBundleInfo
|
||||||
|
{
|
||||||
|
public void UpdateBundleInfo(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||||
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
|
int outputNameStyle = (int)buildParametersContext.Parameters.FileNameStyle;
|
||||||
|
|
||||||
|
// 1.检测文件名长度
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
// NOTE:检测文件名长度不要超过260字符。
|
||||||
|
string fileName = bundleInfo.BundleName;
|
||||||
|
if (fileName.Length >= 260)
|
||||||
|
throw new Exception($"The output bundle name is too long {fileName.Length} chars : {fileName}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.更新构建输出的文件路径
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
bundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||||
|
if (bundleInfo.Encrypted)
|
||||||
|
bundleInfo.PackageSourceFilePath = bundleInfo.EncryptedFilePath;
|
||||||
|
else
|
||||||
|
bundleInfo.PackageSourceFilePath = bundleInfo.BuildOutputFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.更新文件其它信息
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
bundleInfo.PackageUnityHash = GetUnityHash(bundleInfo, context);
|
||||||
|
bundleInfo.PackageUnityCRC = GetUnityCRC(bundleInfo, context);
|
||||||
|
bundleInfo.PackageFileHash = GetBundleFileHash(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||||
|
bundleInfo.PackageFileCRC = GetBundleFileCRC(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||||
|
bundleInfo.PackageFileSize = GetBundleFileSize(bundleInfo.PackageSourceFilePath, buildParametersContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4.更新补丁包输出的文件路径
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
string bundleName = bundleInfo.BundleName;
|
||||||
|
string fileHash = bundleInfo.PackageFileHash;
|
||||||
|
string fileExtension = ManifestTools.GetRemoteBundleFileExtension(bundleName);
|
||||||
|
string fileName = ManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleName, fileExtension, fileHash);
|
||||||
|
bundleInfo.PackageDestFilePath = $"{packageOutputDirectory}/{fileName}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract string GetUnityHash(BuildBundleInfo bundleInfo, BuildContext context);
|
||||||
|
protected abstract uint GetUnityCRC(BuildBundleInfo bundleInfo, BuildContext context);
|
||||||
|
protected abstract string GetBundleFileHash(string filePath, BuildParametersContext buildParametersContext);
|
||||||
|
protected abstract string GetBundleFileCRC(string filePath, BuildParametersContext buildParametersContext);
|
||||||
|
protected abstract long GetBundleFileSize(string filePath, BuildParametersContext buildParametersContext);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 40c870edb8e84064a8be2d56acb8bbc0
|
guid: 5c0a1b7e213a63047994bbf419867c64
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 950b38743cf6b74419af76ab327206ed
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -8,7 +8,7 @@ using UnityEngine;
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute("资源构建内容打包")]
|
[TaskAttribute("资源构建内容打包")]
|
||||||
public class TaskBuilding : IBuildTask
|
public class TaskBuilding_BBP : IBuildTask
|
||||||
{
|
{
|
||||||
public class BuildResultContext : IContextObject
|
public class BuildResultContext : IContextObject
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,7 @@ namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var builtinBuildParameters = buildParametersContext.Parameters as BuiltinBuildParameters;
|
||||||
|
|
||||||
// 模拟构建模式下跳过引擎构建
|
// 模拟构建模式下跳过引擎构建
|
||||||
var buildMode = buildParametersContext.Parameters.BuildMode;
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
@ -27,7 +28,7 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
// 开始构建
|
// 开始构建
|
||||||
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||||
BuildAssetBundleOptions buildOptions = buildParametersContext.GetPipelineBuildOptions();
|
BuildAssetBundleOptions buildOptions = builtinBuildParameters.GetBundleBuildOptions();
|
||||||
AssetBundleManifest buildResults = BuildPipeline.BuildAssetBundles(pipelineOutputDirectory, buildMapContext.GetPipelineBuilds(), buildOptions, buildParametersContext.Parameters.BuildTarget);
|
AssetBundleManifest buildResults = BuildPipeline.BuildAssetBundles(pipelineOutputDirectory, buildMapContext.GetPipelineBuilds(), buildOptions, buildParametersContext.Parameters.BuildTarget);
|
||||||
if (buildResults == null)
|
if (buildResults == null)
|
||||||
{
|
{
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: d110092f543e3fe40a4d3882e1a718e8
|
guid: d10c8f8b9937fe848b2cb0cc0836280d
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("拷贝内置文件")]
|
||||||
|
public class TaskCopyBuildinFiles_BBP : TaskCopyBuildinFiles, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
|
||||||
|
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
|
||||||
|
{
|
||||||
|
if (buildParametersContext.Parameters.BuildinFileCopyOption != EBuildinFileCopyOption.None)
|
||||||
|
{
|
||||||
|
CopyBuildinFilesToStreaming(buildParametersContext, manifestContext.Manifest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 24698266f028e4a47bb88f091fd64547
|
guid: 80c30fb9eb35a514daadefa4a2fb4f28
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("创建清单文件")]
|
||||||
|
public class TaskCreateManifest_BBP : TaskCreateManifest, IBuildTask
|
||||||
|
{
|
||||||
|
private TaskBuilding_BBP.BuildResultContext _buildResultContext = null;
|
||||||
|
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
CreateManifestFile(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string[] GetBundleDepends(BuildContext context, string bundleName)
|
||||||
|
{
|
||||||
|
if (_buildResultContext == null)
|
||||||
|
_buildResultContext = context.GetContextObject<TaskBuilding_BBP.BuildResultContext>();
|
||||||
|
|
||||||
|
return _buildResultContext.UnityManifest.GetAllDependencies(bundleName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 0dee755cccd608d48b6581ec33c99b39
|
guid: db8a306d84a7b284f9acc8925cfaf812
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
|
@ -0,0 +1,54 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("制作包裹")]
|
||||||
|
public class TaskCreatePackage_BBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode != EBuildMode.SimulateBuild && buildMode != EBuildMode.DryRunBuild)
|
||||||
|
{
|
||||||
|
CopyPackageFiles(buildParameters, buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拷贝补丁文件到补丁包目录
|
||||||
|
/// </summary>
|
||||||
|
private void CopyPackageFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
||||||
|
{
|
||||||
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||||
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
|
BuildLogger.Log($"开始拷贝补丁文件到补丁包目录:{packageOutputDirectory}");
|
||||||
|
|
||||||
|
// 拷贝UnityManifest序列化文件
|
||||||
|
{
|
||||||
|
string sourcePath = $"{pipelineOutputDirectory}/{YooAssetSettings.OutputFolderName}";
|
||||||
|
string destPath = $"{packageOutputDirectory}/{YooAssetSettings.OutputFolderName}";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝UnityManifest文本文件
|
||||||
|
{
|
||||||
|
string sourcePath = $"{pipelineOutputDirectory}/{YooAssetSettings.OutputFolderName}.manifest";
|
||||||
|
string destPath = $"{packageOutputDirectory}/{YooAssetSettings.OutputFolderName}.manifest";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝所有补丁文件
|
||||||
|
int progressValue = 0;
|
||||||
|
int fileTotalCount = buildMapContext.Collection.Count;
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
EditorTools.CopyFile(bundleInfo.PackageSourceFilePath, bundleInfo.PackageDestFilePath, true);
|
||||||
|
EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, fileTotalCount);
|
||||||
|
}
|
||||||
|
EditorTools.ClearProgressBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 9466e826c135e994c84961e4b921ca5f
|
guid: 509e58fe0b061a54795f60209fbbbb5a
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("创建构建报告文件")]
|
||||||
|
public class TaskCreateReport_BBP : TaskCreateReport, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||||
|
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
CreateReportFile(buildParameters, buildMapContext, manifestContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cb66f3d5c56a85643a0e009d59079e54
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("资源包加密")]
|
||||||
|
public class TaskEncryption_BBP : TaskEncryption, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
|
||||||
|
{
|
||||||
|
EncryptingBundleFiles(buildParameters, buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6e871faedf2401c4c9225eb9815c5aa0
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,20 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("获取资源构建内容")]
|
||||||
|
public class TaskGetBuildMap_BBP : TaskGetBuildMap, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = CreateBuildMap(buildParametersContext.Parameters);
|
||||||
|
context.SetContextObject(buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b621fbca3fe162448bda8c817daa101a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,30 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("资源构建准备工作")]
|
||||||
|
public class TaskPrepare_BBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
var builtinBuildParameters = buildParameters as BuiltinBuildParameters;
|
||||||
|
|
||||||
|
// 检测基础构建参数
|
||||||
|
buildParametersContext.CheckBuildParameters();
|
||||||
|
|
||||||
|
// 检测Unity版本
|
||||||
|
#if UNITY_2021_3_OR_NEWER
|
||||||
|
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
BuildLogger.Warning("Unity2021版本开始内置构建管线不再维护,推荐使用可编程构建管线(SBP)!");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6dc94501197179048b85b6e959c50e9c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,79 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("更新资源包信息")]
|
||||||
|
public class TaskUpdateBundleInfo_BBP : TaskUpdateBundleInfo, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
UpdateBundleInfo(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string GetUnityHash(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var parameters = buildParametersContext.Parameters;
|
||||||
|
var buildMode = parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
return "00000000000000000000000000000000"; //32位
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var buildResult = context.GetContextObject<TaskBuilding_BBP.BuildResultContext>();
|
||||||
|
var hash = buildResult.UnityManifest.GetAssetBundleHash(bundleInfo.BundleName);
|
||||||
|
if (hash.isValid)
|
||||||
|
return hash.ToString();
|
||||||
|
else
|
||||||
|
throw new Exception($"Not found bundle hash in build result : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override uint GetUnityCRC(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var parameters = buildParametersContext.Parameters;
|
||||||
|
var buildMode = parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string filePath = bundleInfo.BuildOutputFilePath;
|
||||||
|
if (BuildPipeline.GetCRCForAssetBundle(filePath, out uint crc))
|
||||||
|
return crc;
|
||||||
|
else
|
||||||
|
throw new Exception($"Not found bundle crc in build result : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override string GetBundleFileHash(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return "00000000000000000000000000000000"; //32位
|
||||||
|
else
|
||||||
|
return HashUtility.FileMD5(filePath);
|
||||||
|
}
|
||||||
|
protected override string GetBundleFileCRC(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return "00000000"; //8位
|
||||||
|
else
|
||||||
|
return HashUtility.FileCRC32(filePath);
|
||||||
|
}
|
||||||
|
protected override long GetBundleFileSize(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return FileUtility.GetFileSize(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 26a84c5ae3c1a344883de3f85d48c952
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,68 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("验证构建结果")]
|
||||||
|
public class TaskVerifyBuildResult_BBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildParameters = buildParametersContext.Parameters as BuiltinBuildParameters;
|
||||||
|
|
||||||
|
// 模拟构建模式下跳过验证
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.SimulateBuild)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 验证构建结果
|
||||||
|
if (buildParameters.VerifyBuildingResult)
|
||||||
|
{
|
||||||
|
var buildResultContext = context.GetContextObject<TaskBuilding_BBP.BuildResultContext>();
|
||||||
|
VerifyingBuildingResult(context, buildResultContext.UnityManifest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证构建结果
|
||||||
|
/// </summary>
|
||||||
|
private void VerifyingBuildingResult(BuildContext context, AssetBundleManifest unityManifest)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
string[] unityCreateBundles = unityManifest.GetAllAssetBundles();
|
||||||
|
|
||||||
|
// 1. 过滤掉原生Bundle
|
||||||
|
string[] mapBundles = buildMapContext.Collection.Select(t => t.BundleName).ToArray();
|
||||||
|
|
||||||
|
// 2. 验证Bundle
|
||||||
|
List<string> exceptBundleList1 = unityCreateBundles.Except(mapBundles).ToList();
|
||||||
|
if (exceptBundleList1.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var exceptBundle in exceptBundleList1)
|
||||||
|
{
|
||||||
|
BuildLogger.Warning($"差异资源包: {exceptBundle}");
|
||||||
|
}
|
||||||
|
throw new System.Exception("存在差异资源包!请查看警告信息!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 验证Bundle
|
||||||
|
List<string> exceptBundleList2 = mapBundles.Except(unityCreateBundles).ToList();
|
||||||
|
if (exceptBundleList2.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var exceptBundle in exceptBundleList2)
|
||||||
|
{
|
||||||
|
BuildLogger.Warning($"差异资源包: {exceptBundle}");
|
||||||
|
}
|
||||||
|
throw new System.Exception("存在差异资源包!请查看警告信息!");
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildLogger.Log("构建结果验证成功!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class BuiltinBuildParameters : BuildParameters
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 压缩选项
|
||||||
|
/// </summary>
|
||||||
|
public ECompressOption CompressOption = ECompressOption.Uncompressed;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 禁止写入类型树结构(可以降低包体和内存并提高加载效率)
|
||||||
|
/// </summary>
|
||||||
|
public bool DisableWriteTypeTree = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 忽略类型树变化
|
||||||
|
/// </summary>
|
||||||
|
public bool IgnoreTypeTreeChanges = true;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取内置构建管线的构建选项
|
||||||
|
/// </summary>
|
||||||
|
public BuildAssetBundleOptions GetBundleBuildOptions()
|
||||||
|
{
|
||||||
|
// For the new build system, unity always need BuildAssetBundleOptions.CollectDependencies and BuildAssetBundleOptions.DeterministicAssetBundle
|
||||||
|
// 除非设置ForceRebuildAssetBundle标记,否则会进行增量打包
|
||||||
|
|
||||||
|
BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
|
||||||
|
opt |= BuildAssetBundleOptions.StrictMode; //Do not allow the build to succeed if any errors are reporting during it.
|
||||||
|
|
||||||
|
if (BuildMode == EBuildMode.DryRunBuild)
|
||||||
|
{
|
||||||
|
opt |= BuildAssetBundleOptions.DryRunBuild;
|
||||||
|
return opt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CompressOption == ECompressOption.Uncompressed)
|
||||||
|
opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
|
||||||
|
else if (CompressOption == ECompressOption.LZ4)
|
||||||
|
opt |= BuildAssetBundleOptions.ChunkBasedCompression;
|
||||||
|
|
||||||
|
if (BuildMode == EBuildMode.ForceRebuild)
|
||||||
|
opt |= BuildAssetBundleOptions.ForceRebuildAssetBundle; //Force rebuild the asset bundles
|
||||||
|
if (DisableWriteTypeTree)
|
||||||
|
opt |= BuildAssetBundleOptions.DisableWriteTypeTree; //Do not include type information within the asset bundle (don't write type tree).
|
||||||
|
if (IgnoreTypeTreeChanges)
|
||||||
|
opt |= BuildAssetBundleOptions.IgnoreTypeTreeChanges; //Ignore the type tree changes when doing the incremental build check.
|
||||||
|
|
||||||
|
opt |= BuildAssetBundleOptions.DisableLoadAssetByFileName; //Disables Asset Bundle LoadAsset by file name.
|
||||||
|
opt |= BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension; //Disables Asset Bundle LoadAsset by file name with extension.
|
||||||
|
|
||||||
|
return opt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cd05d8038cf42e54e974483bb5da4198
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,38 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class BuiltinBuildPipeline : IBuildPipeline
|
||||||
|
{
|
||||||
|
public BuildResult Run(BuildParameters buildParameters, bool enableLog)
|
||||||
|
{
|
||||||
|
AssetBundleBuilder builder = new AssetBundleBuilder();
|
||||||
|
return builder.Run(buildParameters, GetDefaultBuildPipeline(), enableLog);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取默认的构建流程
|
||||||
|
/// </summary>
|
||||||
|
private List<IBuildTask> GetDefaultBuildPipeline()
|
||||||
|
{
|
||||||
|
List<IBuildTask> pipeline = new List<IBuildTask>
|
||||||
|
{
|
||||||
|
new TaskPrepare_BBP(), //前期准备工作
|
||||||
|
new TaskGetBuildMap_BBP(), //获取构建列表
|
||||||
|
new TaskBuilding_BBP(), //开始执行构建
|
||||||
|
new TaskVerifyBuildResult_BBP(), //验证构建结果
|
||||||
|
new TaskUpdateBundleInfo_BBP(), //更新资源包信息
|
||||||
|
new TaskCreateManifest_BBP(), //创建清单文件
|
||||||
|
new TaskCreateReport_BBP(), //创建报告文件
|
||||||
|
new TaskCreatePackage_BBP(), //制作包裹
|
||||||
|
new TaskCopyBuildinFiles_BBP(), //拷贝内置文件
|
||||||
|
};
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 62d7756143e561843800bc521b5e090f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8a5f30f9c58f36946b2028bddce08c9c
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 141f7d1ebdf7cc147801aa711e29ac17
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -5,8 +5,8 @@ using System.Collections.Generic;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
[TaskAttribute("拷贝原生文件")]
|
[TaskAttribute("资源构建内容打包")]
|
||||||
public class TaskCopyRawFile : IBuildTask
|
public class TaskBuilding_RFBP : IBuildTask
|
||||||
{
|
{
|
||||||
void IBuildTask.Run(BuildContext context)
|
void IBuildTask.Run(BuildContext context)
|
||||||
{
|
{
|
||||||
|
@ -29,14 +29,10 @@ namespace YooAsset.Editor
|
||||||
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||||
foreach (var bundleInfo in buildMapContext.Collection)
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
{
|
{
|
||||||
if (bundleInfo.IsRawFile)
|
string dest = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
||||||
|
foreach (var assetInfo in bundleInfo.MainAssets)
|
||||||
{
|
{
|
||||||
string dest = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
EditorTools.CopyFile(assetInfo.AssetPath, dest, true);
|
||||||
foreach (var assetInfo in bundleInfo.AllMainAssets)
|
|
||||||
{
|
|
||||||
if (assetInfo.IsRawAsset)
|
|
||||||
EditorTools.CopyFile(assetInfo.AssetPath, dest, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("拷贝内置文件")]
|
||||||
|
public class TaskCopyBuildinFiles_RFBP : TaskCopyBuildinFiles, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||||
|
|
||||||
|
if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
if (buildParameters.BuildinFileCopyOption != EBuildinFileCopyOption.None)
|
||||||
|
{
|
||||||
|
CopyBuildinFilesToStreaming(buildParametersContext, manifestContext.Manifest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bf10a5495e90b844b8aca1eadf7ed8f7
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,21 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("创建清单文件")]
|
||||||
|
public class TaskCreateManifest_RFBP : TaskCreateManifest, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
CreateManifestFile(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string[] GetBundleDepends(BuildContext context, string bundleName)
|
||||||
|
{
|
||||||
|
return new string[] { };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 86bdc7d5ae31fdd409f9dc68d73e2600
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,41 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("制作包裹")]
|
||||||
|
public class TaskCreatePackage_RFBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
CopyPackageFiles(buildParameters, buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拷贝补丁文件到补丁包目录
|
||||||
|
/// </summary>
|
||||||
|
private void CopyPackageFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
||||||
|
{
|
||||||
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||||
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
|
BuildLogger.Log($"开始拷贝补丁文件到补丁包目录:{packageOutputDirectory}");
|
||||||
|
|
||||||
|
// 拷贝所有补丁文件
|
||||||
|
int progressValue = 0;
|
||||||
|
int fileTotalCount = buildMapContext.Collection.Count;
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
EditorTools.CopyFile(bundleInfo.PackageSourceFilePath, bundleInfo.PackageDestFilePath, true);
|
||||||
|
EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, fileTotalCount);
|
||||||
|
}
|
||||||
|
EditorTools.ClearProgressBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a6d813044f843b944b4ec3d6f562c7e2
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("创建构建报告文件")]
|
||||||
|
public class TaskCreateReport_RFBP : TaskCreateReport, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||||
|
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
CreateReportFile(buildParameters, buildMapContext, manifestContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 55595ba60c30a634d8921cfc6524e201
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("获取资源构建内容")]
|
||||||
|
public class TaskGetBuildMap_RFBP : TaskGetBuildMap, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = CreateBuildMap(buildParametersContext.Parameters);
|
||||||
|
context.SetContextObject(buildMapContext);
|
||||||
|
|
||||||
|
// 检测构建结果
|
||||||
|
CheckBuildMapContent(buildMapContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检测资源构建上下文
|
||||||
|
/// </summary>
|
||||||
|
private void CheckBuildMapContent(BuildMapContext buildMapContext)
|
||||||
|
{
|
||||||
|
// 注意:原生文件资源包只能包含一个原生文件
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
if (bundleInfo.MainAssets.Count != 1)
|
||||||
|
throw new Exception($"The bundle does not support multiple raw asset : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a8bdb5b4ee29e5b48a88689c6519b830
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("资源构建准备工作")]
|
||||||
|
public class TaskPrepare_RFBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
|
||||||
|
// 检测基础构建参数
|
||||||
|
buildParametersContext.CheckBuildParameters();
|
||||||
|
|
||||||
|
// 检测不被支持的构建模式
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.DryRunBuild)
|
||||||
|
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.DryRunBuild)} build mode !");
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.IncrementalBuild)
|
||||||
|
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.IncrementalBuild)} build mode !");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 97204fd262bb58449a87e517318905c3
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,61 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("更新资源包信息")]
|
||||||
|
public class TaskUpdateBundleInfo_RFBP : TaskUpdateBundleInfo, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
UpdateBundleInfo(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string GetUnityHash(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var parameters = buildParametersContext.Parameters;
|
||||||
|
var buildMode = parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
return "00000000000000000000000000000000"; //32位
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string filePath = bundleInfo.PackageSourceFilePath;
|
||||||
|
return HashUtility.FileMD5(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override uint GetUnityCRC(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
protected override string GetBundleFileHash(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return "00000000000000000000000000000000"; //32位
|
||||||
|
else
|
||||||
|
return HashUtility.FileMD5(filePath);
|
||||||
|
}
|
||||||
|
protected override string GetBundleFileCRC(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return "00000000"; //8位
|
||||||
|
else
|
||||||
|
return HashUtility.FileCRC32(filePath);
|
||||||
|
}
|
||||||
|
protected override long GetBundleFileSize(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return FileUtility.GetFileSize(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b2c8ae6a3e6ca3b4bba4e1495ea297d4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,10 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class RawFileBuildParameters : BuildParameters
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d5ba9a5c89be56147a651be73b1d8a30
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,37 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class RawFileBuildPipeline : IBuildPipeline
|
||||||
|
{
|
||||||
|
public BuildResult Run(BuildParameters buildParameters, bool enableLog)
|
||||||
|
{
|
||||||
|
AssetBundleBuilder builder = new AssetBundleBuilder();
|
||||||
|
return builder.Run(buildParameters, GetDefaultBuildPipeline(), enableLog);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取默认的构建流程
|
||||||
|
/// </summary>
|
||||||
|
private List<IBuildTask> GetDefaultBuildPipeline()
|
||||||
|
{
|
||||||
|
List<IBuildTask> pipeline = new List<IBuildTask>
|
||||||
|
{
|
||||||
|
new TaskPrepare_RFBP(), //前期准备工作
|
||||||
|
new TaskGetBuildMap_RFBP(), //获取构建列表
|
||||||
|
new TaskBuilding_RFBP(), //开始执行构建
|
||||||
|
new TaskUpdateBundleInfo_RFBP(), //更新资源包信息
|
||||||
|
new TaskCreateManifest_RFBP(), //创建清单文件
|
||||||
|
new TaskCreateReport_RFBP(), //创建报告文件
|
||||||
|
new TaskCreatePackage_RFBP(), //制作包裹
|
||||||
|
new TaskCopyBuildinFiles_RFBP(), //拷贝内置文件
|
||||||
|
};
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ee1731ae83e2f0045bab58773be95743
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c8b9d8597bfdc994e9ef52f319cc96ec
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 64c9242d4708b1f47b1469897bbfe127
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -2,7 +2,6 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using UnityEditor.Build.Pipeline;
|
using UnityEditor.Build.Pipeline;
|
||||||
using UnityEditor.Build.Pipeline.Interfaces;
|
using UnityEditor.Build.Pipeline.Interfaces;
|
||||||
using UnityEditor.Build.Pipeline.Tasks;
|
using UnityEditor.Build.Pipeline.Tasks;
|
||||||
|
@ -21,6 +20,7 @@ namespace YooAsset.Editor
|
||||||
{
|
{
|
||||||
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var scriptableBuildParameters = buildParametersContext.Parameters as ScriptableBuildParameters;
|
||||||
|
|
||||||
// 模拟构建模式下跳过引擎构建
|
// 模拟构建模式下跳过引擎构建
|
||||||
var buildMode = buildParametersContext.Parameters.BuildMode;
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
@ -32,7 +32,7 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
// 开始构建
|
// 开始构建
|
||||||
IBundleBuildResults buildResults;
|
IBundleBuildResults buildResults;
|
||||||
var buildParameters = buildParametersContext.GetSBPBuildParameters();
|
var buildParameters = scriptableBuildParameters.GetBundleBuildParameters();
|
||||||
var taskList = SBPBuildTasks.Create(buildMapContext.Command.ShadersBundleName);
|
var taskList = SBPBuildTasks.Create(buildMapContext.Command.ShadersBundleName);
|
||||||
ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
|
ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
|
||||||
if (exitCode < 0)
|
if (exitCode < 0)
|
|
@ -1,5 +1,5 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 1af5fed7e9f83174d868c12b41c4a79e
|
guid: 255306458772c8b4eb94ca288dfc77ac
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("拷贝内置文件")]
|
||||||
|
public class TaskCopyBuildinFiles_SBP : TaskCopyBuildinFiles, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
|
||||||
|
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
|
||||||
|
{
|
||||||
|
if (buildParametersContext.Parameters.BuildinFileCopyOption != EBuildinFileCopyOption.None)
|
||||||
|
{
|
||||||
|
CopyBuildinFilesToStreaming(buildParametersContext, manifestContext.Manifest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 67f8cc89ad41abe42aa1eed9a3d41f20
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,30 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor.Build.Pipeline;
|
||||||
|
using UnityEditor.Build.Pipeline.Interfaces;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("创建清单文件")]
|
||||||
|
public class TaskCreateManifest_SBP : TaskCreateManifest, IBuildTask
|
||||||
|
{
|
||||||
|
private TaskBuilding_SBP.BuildResultContext _buildResultContext = null;
|
||||||
|
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
CreateManifestFile(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string[] GetBundleDepends(BuildContext context, string bundleName)
|
||||||
|
{
|
||||||
|
if (_buildResultContext == null)
|
||||||
|
_buildResultContext = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||||
|
|
||||||
|
if (_buildResultContext.Results.BundleInfos.ContainsKey(bundleName) == false)
|
||||||
|
throw new Exception($"Not found bundle in SBP build results : {bundleName}");
|
||||||
|
return _buildResultContext.Results.BundleInfos[bundleName].Dependencies;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: adfbea99cce4707409469a37c7e5da31
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,56 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("制作包裹")]
|
||||||
|
public class TaskCreatePackage_SBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
CopyPackageFiles(buildParameters, buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 拷贝补丁文件到补丁包目录
|
||||||
|
/// </summary>
|
||||||
|
private void CopyPackageFiles(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext)
|
||||||
|
{
|
||||||
|
var scriptableBuildParameters = buildParametersContext.Parameters as ScriptableBuildParameters;
|
||||||
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
||||||
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
||||||
|
BuildLogger.Log($"开始拷贝补丁文件到补丁包目录:{packageOutputDirectory}");
|
||||||
|
|
||||||
|
// 拷贝构建日志
|
||||||
|
{
|
||||||
|
string sourcePath = $"{pipelineOutputDirectory}/buildlogtep.json";
|
||||||
|
string destPath = $"{packageOutputDirectory}/buildlogtep.json";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝代码防裁剪配置
|
||||||
|
if (scriptableBuildParameters.WriteLinkXML)
|
||||||
|
{
|
||||||
|
string sourcePath = $"{pipelineOutputDirectory}/link.xml";
|
||||||
|
string destPath = $"{packageOutputDirectory}/link.xml";
|
||||||
|
EditorTools.CopyFile(sourcePath, destPath, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拷贝所有补丁文件
|
||||||
|
int progressValue = 0;
|
||||||
|
int fileTotalCount = buildMapContext.Collection.Count;
|
||||||
|
foreach (var bundleInfo in buildMapContext.Collection)
|
||||||
|
{
|
||||||
|
EditorTools.CopyFile(bundleInfo.PackageSourceFilePath, bundleInfo.PackageDestFilePath, true);
|
||||||
|
EditorTools.DisplayProgressBar("拷贝补丁文件", ++progressValue, fileTotalCount);
|
||||||
|
}
|
||||||
|
EditorTools.ClearProgressBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c798c7056a23c8840af89492d30cb89c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("创建构建报告文件")]
|
||||||
|
public class TaskCreateReport_SBP : TaskCreateReport, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
var manifestContext = context.GetContextObject<ManifestContext>();
|
||||||
|
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode != EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
CreateReportFile(buildParameters, buildMapContext, manifestContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 11893a8199d4d8549b76a16c740d507a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("资源包加密")]
|
||||||
|
public class TaskEncryption_SBP : TaskEncryption, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParameters = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
||||||
|
|
||||||
|
var buildMode = buildParameters.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
|
||||||
|
{
|
||||||
|
EncryptingBundleFiles(buildParameters, buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ff8ba0dd63fc3304c8f20680733a74e0
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,20 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("获取资源构建内容")]
|
||||||
|
public class TaskGetBuildMap_SBP : TaskGetBuildMap, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildMapContext = CreateBuildMap(buildParametersContext.Parameters);
|
||||||
|
context.SetContextObject(buildMapContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cc3a7680622c5254f80b9541196091c3
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("资源构建准备工作")]
|
||||||
|
public class TaskPrepare_SBP : IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var buildParameters = buildParametersContext.Parameters;
|
||||||
|
|
||||||
|
// 检测基础构建参数
|
||||||
|
buildParametersContext.CheckBuildParameters();
|
||||||
|
|
||||||
|
// 检测不被支持的构建模式
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.DryRunBuild)
|
||||||
|
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.DryRunBuild)} build mode !");
|
||||||
|
if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
|
||||||
|
throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.ForceRebuild)} build mode !");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 698615f2a9590ef488a62419111d1e3d
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,79 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
[TaskAttribute("更新资源包信息")]
|
||||||
|
public class TaskUpdateBundleInfo_SBP : TaskUpdateBundleInfo, IBuildTask
|
||||||
|
{
|
||||||
|
void IBuildTask.Run(BuildContext context)
|
||||||
|
{
|
||||||
|
UpdateBundleInfo(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string GetUnityHash(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var parameters = buildParametersContext.Parameters;
|
||||||
|
var buildMode = parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
return "00000000000000000000000000000000"; //32位
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 注意:当资源包的依赖列表发生变化的时候,ContentHash也会发生变化!
|
||||||
|
var buildResult = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||||
|
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
||||||
|
return value.Hash.ToString();
|
||||||
|
else
|
||||||
|
throw new Exception($"Not found bundle hash in build result : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override uint GetUnityCRC(BuildBundleInfo bundleInfo, BuildContext context)
|
||||||
|
{
|
||||||
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
||||||
|
var parameters = buildParametersContext.Parameters;
|
||||||
|
var buildMode = parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var buildResult = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||||
|
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
||||||
|
return value.Crc;
|
||||||
|
else
|
||||||
|
throw new Exception($"Not found bundle crc in build result : {bundleInfo.BundleName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override string GetBundleFileHash(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return "00000000000000000000000000000000"; //32位
|
||||||
|
else
|
||||||
|
return HashUtility.FileMD5(filePath);
|
||||||
|
}
|
||||||
|
protected override string GetBundleFileCRC(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return "00000000"; //8位
|
||||||
|
else
|
||||||
|
return HashUtility.FileCRC32(filePath);
|
||||||
|
}
|
||||||
|
protected override long GetBundleFileSize(string filePath, BuildParametersContext buildParametersContext)
|
||||||
|
{
|
||||||
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
||||||
|
if (buildMode == EBuildMode.SimulateBuild)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return FileUtility.GetFileSize(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c53b8e8dd0618e344931ad9ac4ad0656
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -3,8 +3,8 @@ using System.Linq;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEditor;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
using UnityEditor.Build.Pipeline.Interfaces;
|
using UnityEditor.Build.Pipeline.Interfaces;
|
||||||
|
|
||||||
namespace YooAsset.Editor
|
namespace YooAsset.Editor
|
||||||
|
@ -15,13 +15,14 @@ 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 as ScriptableBuildParameters;
|
||||||
|
|
||||||
// 模拟构建模式下跳过验证
|
// 模拟构建模式下跳过验证
|
||||||
if (buildParametersContext.Parameters.BuildMode == EBuildMode.SimulateBuild)
|
if (buildParameters.BuildMode == EBuildMode.SimulateBuild)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 验证构建结果
|
// 验证构建结果
|
||||||
if (buildParametersContext.Parameters.VerifyBuildingResult)
|
if (buildParameters.VerifyBuildingResult)
|
||||||
{
|
{
|
||||||
var buildResultContext = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
var buildResultContext = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
||||||
VerifyingBuildingResult(context, buildResultContext.Results);
|
VerifyingBuildingResult(context, buildResultContext.Results);
|
||||||
|
@ -38,7 +39,7 @@ namespace YooAsset.Editor
|
||||||
List<string> unityCreateBundles = buildResults.BundleInfos.Keys.ToList();
|
List<string> unityCreateBundles = buildResults.BundleInfos.Keys.ToList();
|
||||||
|
|
||||||
// 1. 过滤掉原生Bundle
|
// 1. 过滤掉原生Bundle
|
||||||
List<string> expectBundles = buildMapContext.Collection.Where(t => t.IsRawFile == false).Select(t => t.BundleName).ToList();
|
List<string> expectBundles = buildMapContext.Collection.Select(t => t.BundleName).ToList();
|
||||||
|
|
||||||
// 2. 验证Bundle
|
// 2. 验证Bundle
|
||||||
List<string> exceptBundleList1 = unityCreateBundles.Except(expectBundles).ToList();
|
List<string> exceptBundleList1 = unityCreateBundles.Except(expectBundles).ToList();
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue