Update AssetBundleBuilder

pull/4/head
hevinci 2022-03-23 17:18:43 +08:00
parent 0c14e95679
commit a6c6da62d3
10 changed files with 88 additions and 48 deletions

View File

@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
@ -27,11 +28,21 @@ namespace YooAsset.Editor
// 构建参数
private int _buildVersion;
private BuildTarget _buildTarget;
private ECompressOption _compressOption = ECompressOption.Uncompressed;
private ECompressOption _compressOption;
private bool _appendExtension = false;
private bool _forceRebuild = false;
private string _buildinTags = string.Empty;
// 加密类相关
private List<Type> _encryptionServicesClassTypes;
private string[] _encryptionServicesClassNames;
private int _encryptionServicesSelectIndex = -1;
// 冗余类相关
private List<Type> _redundancyServicesClassTypes;
private string[] _redundancyServicesClassNames;
private int _redundancyServicesSelectIndex = -1;
// GUI相关
private bool _isInit = false;
private GUIStyle _centerStyle;
@ -52,8 +63,12 @@ namespace YooAsset.Editor
EditorGUILayout.LabelField("Build Output", pipelineOutputDirectory);
// 构建参数
_buildVersion = EditorGUILayout.IntField("Build Version", _buildVersion, GUILayout.MaxWidth(250));
_compressOption = (ECompressOption)EditorGUILayout.EnumPopup("Compression", _compressOption, GUILayout.MaxWidth(250));
_buildVersion = EditorGUILayout.IntField("Build Version", _buildVersion, GUILayout.MaxWidth(300));
_compressOption = (ECompressOption)EditorGUILayout.EnumPopup("Compression", _compressOption, GUILayout.MaxWidth(300));
if (_encryptionServicesClassNames.Length > 0)
_encryptionServicesSelectIndex = EditorGUILayout.Popup("Encryption Services", _encryptionServicesSelectIndex, _encryptionServicesClassNames, GUILayout.MaxWidth(300));
if (_redundancyServicesClassNames.Length > 0)
_redundancyServicesSelectIndex = EditorGUILayout.Popup("Redundancy Services", _redundancyServicesSelectIndex, _redundancyServicesClassNames, GUILayout.MaxWidth(300));
_appendExtension = GUILayout.Toggle(_appendExtension, "Append Extension", GUILayout.MaxWidth(120));
_forceRebuild = GUILayout.Toggle(_forceRebuild, "Force Rebuild", GUILayout.MaxWidth(120));
if (_forceRebuild)
@ -104,6 +119,12 @@ namespace YooAsset.Editor
_buildVersion = appVersion.Revision;
_buildTarget = EditorUserBuildSettings.activeBuildTarget;
_encryptionServicesClassTypes = GetEncryptionServicesClassTypes();
_encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.FullName).ToArray();
_redundancyServicesClassTypes = GetRedundancyServicesClassTypes();
_redundancyServicesClassNames = _redundancyServicesClassTypes.Select(t => t.FullName).ToArray();
// 读取配置
LoadSettingsFromPlayerPrefs();
}
@ -119,6 +140,8 @@ namespace YooAsset.Editor
buildParameters.OutputRoot = defaultOutputRoot;
buildParameters.BuildTarget = _buildTarget;
buildParameters.BuildVersion = _buildVersion;
buildParameters.EncryptionServices = CreateEncryptionServicesInstance();
buildParameters.RedundancyServices = CreateRedundancyServicesInstance();
buildParameters.CompressOption = _compressOption;
buildParameters.AppendFileExtension = _appendExtension;
buildParameters.ForceRebuild = _forceRebuild;
@ -126,6 +149,32 @@ namespace YooAsset.Editor
_assetBuilder.Run(buildParameters);
}
private List<Type> GetEncryptionServicesClassTypes()
{
List<Type> classTypes = AssemblyUtility.GetAssignableTypes(AssemblyUtility.UnityDefaultAssemblyEditorName, typeof(IEncryptionServices));
return classTypes;
}
private IEncryptionServices CreateEncryptionServicesInstance()
{
if (_encryptionServicesSelectIndex < 0)
return null;
var classType = _encryptionServicesClassTypes[_encryptionServicesSelectIndex];
return (IEncryptionServices)Activator.CreateInstance(classType);
}
private List<Type> GetRedundancyServicesClassTypes()
{
List<Type> classTypes = AssemblyUtility.GetAssignableTypes(AssemblyUtility.UnityDefaultAssemblyEditorName, typeof(IRedundancyServices));
return classTypes;
}
private IRedundancyServices CreateRedundancyServicesInstance()
{
if (_redundancyServicesSelectIndex < 0)
return null;
var classType = _redundancyServicesClassTypes[_redundancyServicesSelectIndex];
return (IRedundancyServices)Activator.CreateInstance(classType);
}
#region 配置相关
private const string StrEditorCompressOption = "StrEditorCompressOption";
private const string StrEditorAppendExtension = "StrEditorAppendExtension";

View File

@ -40,6 +40,16 @@ namespace YooAsset.Editor
/// </summary>
public bool AppendFileExtension = false;
/// <summary>
/// 加密类
/// </summary>
public IEncryptionServices EncryptionServices;
/// <summary>
/// 冗余类
/// </summary>
public IRedundancyServices RedundancyServices;
/// <summary>
/// 强制重新构建整个项目如果为FALSE则是增量打包

View File

@ -53,6 +53,16 @@ namespace YooAsset.Editor
/// </summary>
public string ShadersBundleName;
/// <summary>
/// 加密服务类名称
/// </summary>
public string EncryptionServicesClassName;
/// <summary>
/// 冗余服务类名称
/// </summary>
public string RedundancyServicesClassName;
// 构建参数
public bool ForceRebuild;
public string BuildinTags;

View File

@ -33,6 +33,10 @@ namespace YooAsset.Editor
buildReport.Summary.AppendFileExtension = buildParameters.Parameters.AppendFileExtension;
buildReport.Summary.AutoCollectShaders = AssetBundleCollectorSettingData.Setting.AutoCollectShaders;
buildReport.Summary.ShadersBundleName = AssetBundleCollectorSettingData.Setting.ShadersBundleName;
buildReport.Summary.EncryptionServicesClassName = buildParameters.Parameters.EncryptionServices == null ?
"null" : buildParameters.Parameters.EncryptionServices.GetType().FullName;
buildReport.Summary.RedundancyServicesClassName = buildParameters.Parameters.RedundancyServices == null ?
"null" : buildParameters.Parameters.RedundancyServices.GetType().FullName;
// 构建参数
buildReport.Summary.ForceRebuild = buildParameters.Parameters.ForceRebuild;

View File

@ -26,40 +26,23 @@ namespace YooAsset.Editor
var buildParameters = context.GetContextObject<AssetBundleBuilder.BuildParametersContext>();
var buildMapContext = context.GetContextObject<TaskGetBuildMap.BuildMapContext>();
var encrypter = CreateAssetEncrypter();
List<string> encryptList = EncryptFiles(encrypter, buildParameters, buildMapContext);
EncryptionContext encryptionContext = new EncryptionContext();
encryptionContext.EncryptList = encryptList;
encryptionContext.EncryptList = EncryptFiles(buildParameters, buildMapContext);
context.SetContextObject(encryptionContext);
}
/// <summary>
/// 创建加密类
/// </summary>
/// <returns>如果没有定义类型则返回NULL</returns>
private IAssetEncrypter CreateAssetEncrypter()
{
var types = AssemblyUtility.GetAssignableTypes(AssemblyUtility.UnityDefaultAssemblyEditorName, typeof(IAssetEncrypter));
if (types.Count == 0)
return null;
if (types.Count != 1)
throw new Exception($"Found more {nameof(IAssetEncrypter)} types. We only support one.");
UnityEngine.Debug.Log($"创建实例类 : {types[0].FullName}");
return (IAssetEncrypter)Activator.CreateInstance(types[0]);
}
/// <summary>
/// 加密文件
/// </summary>
private List<string> EncryptFiles(IAssetEncrypter encrypter, AssetBundleBuilder.BuildParametersContext buildParameters, TaskGetBuildMap.BuildMapContext buildMapContext)
private List<string> EncryptFiles(AssetBundleBuilder.BuildParametersContext buildParameters, TaskGetBuildMap.BuildMapContext buildMapContext)
{
var encryptionServices = buildParameters.Parameters.EncryptionServices;
// 加密资源列表
List<string> encryptList = new List<string>();
// 如果没有设置加密类
if (encrypter == null)
if (encryptionServices == null)
return encryptList;
UnityEngine.Debug.Log($"开始加密资源文件");
@ -68,7 +51,7 @@ namespace YooAsset.Editor
{
var bundleName = bundleInfo.BundleName;
string filePath = $"{buildParameters.PipelineOutputDirectory}/{bundleName}";
if (encrypter.Check(filePath))
if (encryptionServices.Check(filePath))
{
encryptList.Add(bundleName);
@ -76,7 +59,7 @@ namespace YooAsset.Editor
byte[] fileData = File.ReadAllBytes(filePath);
if (EditorTools.CheckBundleFileValid(fileData))
{
byte[] bytes = encrypter.Encrypt(fileData);
byte[] bytes = encryptionServices.Encrypt(fileData);
File.WriteAllBytes(filePath, bytes);
UnityEngine.Debug.Log($"文件加密完成:{filePath}");
}

View File

@ -189,7 +189,7 @@ namespace YooAsset.Editor
buildMapContext.AssetFileCount = buildAssetDic.Values.Count;
// 4. 移除零依赖的资源
var redundancy = CreateAssetRedundancy();
var redundancyServices = buildParameters.Parameters.RedundancyServices;
List<BuildAssetInfo> undependentAssets = new List<BuildAssetInfo>();
foreach (KeyValuePair<string, BuildAssetInfo> pair in buildAssetDic)
{
@ -205,7 +205,7 @@ namespace YooAsset.Editor
}
// 冗余扩展
if (redundancy != null && redundancy.Check(buildAssetInfo.AssetPath))
if (redundancyServices != null && redundancyServices.Check(buildAssetInfo.AssetPath))
{
undependentAssets.Add(buildAssetInfo);
buildMapContext.RedundancyAssetList.Add(buildAssetInfo.AssetPath);
@ -300,21 +300,5 @@ namespace YooAsset.Editor
}
}
}
/// <summary>
/// 创建冗余类
/// </summary>
/// <returns>如果没有定义类型则返回NULL</returns>
private IAssetRedundancy CreateAssetRedundancy()
{
var types = AssemblyUtility.GetAssignableTypes(AssemblyUtility.UnityDefaultAssemblyEditorName, typeof(IAssetRedundancy));
if (types.Count == 0)
return null;
if (types.Count != 1)
throw new Exception($"Found more {nameof(IAssetRedundancy)} types. We only support one.");
UnityEngine.Debug.Log($"创建实例类 : {types[0].FullName}");
return (IAssetRedundancy)Activator.CreateInstance(types[0]);
}
}
}

View File

@ -1,7 +1,7 @@

namespace YooAsset.Editor
{
public interface IAssetEncrypter
public interface IEncryptionServices
{
/// <summary>
/// 检测是否需要加密

View File

@ -1,7 +1,7 @@

namespace YooAsset.Editor
{
public interface IAssetRedundancy
public interface IRedundancyServices
{
/// <summary>
/// 检测是否冗余