108 lines
3.7 KiB
C#
108 lines
3.7 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEditor;
|
||
|
||
namespace YooAsset.Editor
|
||
{
|
||
public class AssetBundleBuilder
|
||
{
|
||
public class BuildParametersContext : IContextObject
|
||
{
|
||
/// <summary>
|
||
/// 构建参数
|
||
/// </summary>
|
||
public BuildParameters Parameters { private set; get; }
|
||
|
||
/// <summary>
|
||
/// 构建管线的输出目录
|
||
/// </summary>
|
||
public string PipelineOutputDirectory { private set; get; }
|
||
|
||
|
||
public BuildParametersContext(BuildParameters parameters)
|
||
{
|
||
Parameters = parameters;
|
||
PipelineOutputDirectory = AssetBundleBuilderHelper.MakePipelineOutputDirectory(parameters.OutputRoot, parameters.BuildTarget);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取本次构建的补丁目录
|
||
/// </summary>
|
||
public string GetPackageDirectory()
|
||
{
|
||
return $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.BuildVersion}";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取构建选项
|
||
/// </summary>
|
||
public BuildAssetBundleOptions GetPipelineBuildOptions()
|
||
{
|
||
// 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 (Parameters.CompressOption == ECompressOption.Uncompressed)
|
||
opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
|
||
else if (Parameters.CompressOption == ECompressOption.LZ4)
|
||
opt |= BuildAssetBundleOptions.ChunkBasedCompression;
|
||
|
||
if (Parameters.ForceRebuild)
|
||
opt |= BuildAssetBundleOptions.ForceRebuildAssetBundle; //Force rebuild the asset bundles
|
||
if (Parameters.AppendHash)
|
||
opt |= BuildAssetBundleOptions.AppendHashToAssetBundleName; //Append the hash to the assetBundle name
|
||
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.
|
||
if (Parameters.DisableLoadAssetByFileName)
|
||
{
|
||
opt |= BuildAssetBundleOptions.DisableLoadAssetByFileName; //Disables Asset Bundle LoadAsset by file name.
|
||
opt |= BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension; //Disables Asset Bundle LoadAsset by file name with extension.
|
||
}
|
||
|
||
return opt;
|
||
}
|
||
}
|
||
|
||
private readonly BuildContext _buildContext = new BuildContext();
|
||
|
||
/// <summary>
|
||
/// 开始构建
|
||
/// </summary>
|
||
public bool Run(BuildParameters buildParameters)
|
||
{
|
||
// 清空旧数据
|
||
_buildContext.ClearAllContext();
|
||
|
||
// 构建参数
|
||
var buildParametersContext = new BuildParametersContext(buildParameters);
|
||
_buildContext.SetContextObject(buildParametersContext);
|
||
|
||
// 执行构建流程
|
||
List<IBuildTask> pipeline = new List<IBuildTask>
|
||
{
|
||
new TaskPrepare(), //前期准备工作
|
||
new TaskGetBuildMap(), //获取构建列表
|
||
new TaskBuilding(), //开始执行构建
|
||
new TaskEncryption(), //加密资源文件
|
||
new TaskCreatePatchManifest(), //创建清单文件
|
||
new TaskCreateReadme(), //创建说明文件
|
||
new TaskCreateReport(), //创建报告文件
|
||
new TaskCreatePatchPackage(), //制作补丁包
|
||
new TaskCopyBuildinFiles(), //拷贝内置文件
|
||
};
|
||
|
||
bool succeed = BuildRunner.Run(pipeline, _buildContext);
|
||
if (succeed)
|
||
Debug.Log($"构建成功!");
|
||
else
|
||
Debug.LogWarning($"构建失败!");
|
||
return succeed;
|
||
}
|
||
}
|
||
} |