mirror of https://github.com/tuyoogame/YooAsset
fix #407
parent
dcaafedabb
commit
d3c1c5acb0
|
@ -89,5 +89,17 @@ namespace YooAsset.Editor
|
||||||
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_ClearBuildCache";
|
||||||
EditorPrefs.SetInt(key, clearBuildCache ? 1 : 0);
|
EditorPrefs.SetInt(key, clearBuildCache ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UseAssetDependencyDB
|
||||||
|
public static bool GetPackageUseAssetDependencyDB(string packageName, EBuildPipeline buildPipeline)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
|
||||||
|
return EditorPrefs.GetInt(key, 0) > 0;
|
||||||
|
}
|
||||||
|
public static void SetPackageUseAssetDependencyDB(string packageName, EBuildPipeline buildPipeline, bool useAssetDependencyDB)
|
||||||
|
{
|
||||||
|
string key = $"{Application.productName}_{packageName}_{buildPipeline}_UseAssetDependencyDB";
|
||||||
|
EditorPrefs.SetInt(key, useAssetDependencyDB ? 1 : 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -50,7 +50,13 @@ namespace YooAsset.Editor
|
||||||
/// 清空构建缓存文件
|
/// 清空构建缓存文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool ClearBuildCacheFiles = false;
|
public bool ClearBuildCacheFiles = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 使用资源依赖缓存数据库
|
||||||
|
/// 说明:开启此项可以极大提高资源收集速度
|
||||||
|
/// </summary>
|
||||||
|
public bool UseAssetDependencyDB = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启用共享资源打包
|
/// 启用共享资源打包
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -137,6 +137,9 @@ namespace YooAsset.Editor
|
||||||
result.Add(packageAsset);
|
result.Add(packageAsset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 按照AssetPath排序
|
||||||
|
result.Sort((a, b) => a.AssetPath.CompareTo(b.AssetPath));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,6 +154,9 @@ namespace YooAsset.Editor
|
||||||
var packageBundle = bundleInfo.CreatePackageBundle();
|
var packageBundle = bundleInfo.CreatePackageBundle();
|
||||||
result.Add(packageBundle);
|
result.Add(packageBundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 按照BundleName排序
|
||||||
|
result.Sort((a, b) => a.BundleName.CompareTo(b.BundleName));
|
||||||
|
|
||||||
// 注意:缓存资源包索引
|
// 注意:缓存资源包索引
|
||||||
for (int index = 0; index < result.Count; index++)
|
for (int index = 0; index < result.Count; index++)
|
||||||
|
|
|
@ -42,6 +42,7 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
// 构建参数
|
// 构建参数
|
||||||
buildReport.Summary.ClearBuildCacheFiles = buildParameters.ClearBuildCacheFiles;
|
buildReport.Summary.ClearBuildCacheFiles = buildParameters.ClearBuildCacheFiles;
|
||||||
|
buildReport.Summary.UseAssetDependencyDB = buildParameters.UseAssetDependencyDB;
|
||||||
buildReport.Summary.EnableSharePackRule = buildParameters.EnableSharePackRule;
|
buildReport.Summary.EnableSharePackRule = buildParameters.EnableSharePackRule;
|
||||||
buildReport.Summary.EncryptionClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName;
|
buildReport.Summary.EncryptionClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName;
|
||||||
if (buildParameters.BuildPipeline == nameof(BuiltinBuildPipeline))
|
if (buildParameters.BuildPipeline == nameof(BuiltinBuildPipeline))
|
||||||
|
@ -131,6 +132,7 @@ namespace YooAsset.Editor
|
||||||
string dependBundleName = manifest.BundleList[index].BundleName;
|
string dependBundleName = manifest.BundleList[index].BundleName;
|
||||||
dependBundles.Add(dependBundleName);
|
dependBundles.Add(dependBundleName);
|
||||||
}
|
}
|
||||||
|
dependBundles.Sort();
|
||||||
return dependBundles;
|
return dependBundles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,6 +162,7 @@ namespace YooAsset.Editor
|
||||||
result.Add(dependAssetInfo.AssetInfo.AssetPath);
|
result.Add(dependAssetInfo.AssetInfo.AssetPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
result.Sort();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +172,9 @@ namespace YooAsset.Editor
|
||||||
private List<string> GetAllBuiltinAssets(BuildMapContext buildMapContext, string bundleName)
|
private List<string> GetAllBuiltinAssets(BuildMapContext buildMapContext, string bundleName)
|
||||||
{
|
{
|
||||||
var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
|
var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
|
||||||
return bundleInfo.GetAllBuiltinAssetPaths();
|
List<string> result = bundleInfo.GetAllBuiltinAssetPaths();
|
||||||
|
result.Sort();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int GetMainAssetCount(PackageManifest manifest)
|
private int GetMainAssetCount(PackageManifest manifest)
|
||||||
|
|
|
@ -20,7 +20,8 @@ namespace YooAsset.Editor
|
||||||
Dictionary<string, BuildAssetInfo> allBuildAssetInfos = new Dictionary<string, BuildAssetInfo>(1000);
|
Dictionary<string, BuildAssetInfo> allBuildAssetInfos = new Dictionary<string, BuildAssetInfo>(1000);
|
||||||
|
|
||||||
// 1. 获取所有收集器收集的资源
|
// 1. 获取所有收集器收集的资源
|
||||||
var collectResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(simulateBuild, packageName);
|
bool useAssetDependencyDB = buildParameters.UseAssetDependencyDB;
|
||||||
|
var collectResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(simulateBuild, useAssetDependencyDB, packageName);
|
||||||
List<CollectAssetInfo> allCollectAssets = collectResult.CollectAssets;
|
List<CollectAssetInfo> allCollectAssets = collectResult.CollectAssets;
|
||||||
|
|
||||||
// 2. 剔除未被引用的依赖项资源
|
// 2. 剔除未被引用的依赖项资源
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace YooAsset.Editor
|
||||||
private EnumField _copyBuildinFileOptionField;
|
private EnumField _copyBuildinFileOptionField;
|
||||||
private TextField _copyBuildinFileTagsField;
|
private TextField _copyBuildinFileTagsField;
|
||||||
private Toggle _clearBuildCacheToggle;
|
private Toggle _clearBuildCacheToggle;
|
||||||
|
private Toggle _useAssetDependencyDBToggle;
|
||||||
|
|
||||||
public BuildPipelineViewerBase(string packageName, EBuildPipeline buildPipeline, BuildTarget buildTarget, VisualElement parent)
|
public BuildPipelineViewerBase(string packageName, EBuildPipeline buildPipeline, BuildTarget buildTarget, VisualElement parent)
|
||||||
{
|
{
|
||||||
|
@ -140,6 +141,15 @@ namespace YooAsset.Editor
|
||||||
AssetBundleBuilderSetting.SetPackageClearBuildCache(PackageName, BuildPipeline, _clearBuildCacheToggle.value);
|
AssetBundleBuilderSetting.SetPackageClearBuildCache(PackageName, BuildPipeline, _clearBuildCacheToggle.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 使用资源依赖数据库
|
||||||
|
bool useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
||||||
|
_useAssetDependencyDBToggle = Root.Q<Toggle>("UseAssetDependency");
|
||||||
|
_useAssetDependencyDBToggle.SetValueWithoutNotify(useAssetDependencyDB);
|
||||||
|
_useAssetDependencyDBToggle.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(PackageName, BuildPipeline, _useAssetDependencyDBToggle.value);
|
||||||
|
});
|
||||||
|
|
||||||
// 构建按钮
|
// 构建按钮
|
||||||
var buildButton = Root.Q<Button>("Build");
|
var buildButton = Root.Q<Button>("Build");
|
||||||
buildButton.clicked += BuildButton_clicked;
|
buildButton.clicked += BuildButton_clicked;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
|
<ui:TextField picking-mode="Ignore" label="Build Output" name="BuildOutput" />
|
||||||
<ui:TextField picking-mode="Ignore" label="Build Version" name="BuildVersion" />
|
<ui:TextField picking-mode="Ignore" label="Build Version" name="BuildVersion" />
|
||||||
<ui:Toggle label="Clear Build Cache" name="ClearBuildCache" />
|
<ui:Toggle label="Clear Build Cache" name="ClearBuildCache" />
|
||||||
|
<ui:Toggle label="Use Asset Depend DB" name="UseAssetDependency" />
|
||||||
<ui:VisualElement name="EncryptionContainer" style="height: 24px;" />
|
<ui:VisualElement name="EncryptionContainer" style="height: 24px;" />
|
||||||
<uie:EnumField label="Compression" value="Center" name="Compression" />
|
<uie:EnumField label="Compression" value="Center" name="Compression" />
|
||||||
<uie:EnumField label="File Name Style" value="Center" name="FileNameStyle" />
|
<uie:EnumField label="File Name Style" value="Center" name="FileNameStyle" />
|
||||||
|
|
|
@ -27,6 +27,7 @@ namespace YooAsset.Editor
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
||||||
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
||||||
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
||||||
|
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
||||||
|
|
||||||
BuiltinBuildParameters buildParameters = new BuiltinBuildParameters();
|
BuiltinBuildParameters buildParameters = new BuiltinBuildParameters();
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
@ -42,6 +43,7 @@ namespace YooAsset.Editor
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
buildParameters.CompressOption = compressOption;
|
buildParameters.CompressOption = compressOption;
|
||||||
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
||||||
|
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline();
|
BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline();
|
||||||
|
|
|
@ -32,6 +32,9 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
var clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
var clearBuildCacheToggle = Root.Q<Toggle>("ClearBuildCache");
|
||||||
UIElementsTools.SetElementVisible(clearBuildCacheToggle, false);
|
UIElementsTools.SetElementVisible(clearBuildCacheToggle, false);
|
||||||
|
|
||||||
|
var useAssetDependencyToggle = Root.Q<Toggle>("UseAssetDependency");
|
||||||
|
UIElementsTools.SetElementVisible(useAssetDependencyToggle, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace YooAsset.Editor
|
||||||
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
||||||
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
||||||
|
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
||||||
|
|
||||||
RawFileBuildParameters buildParameters = new RawFileBuildParameters();
|
RawFileBuildParameters buildParameters = new RawFileBuildParameters();
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
@ -41,6 +42,7 @@ namespace YooAsset.Editor
|
||||||
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
||||||
|
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
RawFileBuildPipeline pipeline = new RawFileBuildPipeline();
|
RawFileBuildPipeline pipeline = new RawFileBuildPipeline();
|
||||||
|
|
|
@ -27,6 +27,7 @@ namespace YooAsset.Editor
|
||||||
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
|
||||||
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
|
||||||
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline);
|
||||||
|
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline);
|
||||||
|
|
||||||
ScriptableBuildParameters buildParameters = new ScriptableBuildParameters();
|
ScriptableBuildParameters buildParameters = new ScriptableBuildParameters();
|
||||||
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
|
||||||
|
@ -42,6 +43,7 @@ namespace YooAsset.Editor
|
||||||
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
|
||||||
buildParameters.CompressOption = compressOption;
|
buildParameters.CompressOption = compressOption;
|
||||||
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
buildParameters.ClearBuildCacheFiles = clearBuildCache;
|
||||||
|
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
buildParameters.EncryptionServices = CreateEncryptionInstance();
|
||||||
|
|
||||||
ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline();
|
ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline();
|
||||||
|
|
|
@ -149,7 +149,7 @@ namespace YooAsset.Editor
|
||||||
Dictionary<string, CollectAssetInfo> result = new Dictionary<string, CollectAssetInfo>(1000);
|
Dictionary<string, CollectAssetInfo> result = new Dictionary<string, CollectAssetInfo>(1000);
|
||||||
|
|
||||||
// 收集打包资源路径
|
// 收集打包资源路径
|
||||||
List<string> findAssets =new List<string>();
|
List<string> findAssets = new List<string>();
|
||||||
if (AssetDatabase.IsValidFolder(CollectPath))
|
if (AssetDatabase.IsValidFolder(CollectPath))
|
||||||
{
|
{
|
||||||
string collectDirectory = CollectPath;
|
string collectDirectory = CollectPath;
|
||||||
|
@ -218,13 +218,7 @@ namespace YooAsset.Editor
|
||||||
string bundleName = GetBundleName(command, group, assetInfo);
|
string bundleName = GetBundleName(command, group, assetInfo);
|
||||||
List<string> assetTags = GetAssetTags(group);
|
List<string> assetTags = GetAssetTags(group);
|
||||||
CollectAssetInfo collectAssetInfo = new CollectAssetInfo(CollectorType, bundleName, address, assetInfo, assetTags);
|
CollectAssetInfo collectAssetInfo = new CollectAssetInfo(CollectorType, bundleName, address, assetInfo, assetTags);
|
||||||
|
collectAssetInfo.DependAssets = GetAllDependencies(command, assetInfo.AssetPath);
|
||||||
// 注意:模拟构建模式下不需要收集依赖资源
|
|
||||||
if (command.SimulateBuild)
|
|
||||||
collectAssetInfo.DependAssets = new List<AssetInfo>();
|
|
||||||
else
|
|
||||||
collectAssetInfo.DependAssets = GetAllDependencies(command, assetInfo.AssetPath);
|
|
||||||
|
|
||||||
return collectAssetInfo;
|
return collectAssetInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,7 +266,11 @@ namespace YooAsset.Editor
|
||||||
}
|
}
|
||||||
private List<AssetInfo> GetAllDependencies(CollectCommand command, string mainAssetPath)
|
private List<AssetInfo> GetAllDependencies(CollectCommand command, string mainAssetPath)
|
||||||
{
|
{
|
||||||
string[] depends = AssetDatabase.GetDependencies(mainAssetPath, true);
|
// 注意:模拟构建模式下不需要收集依赖资源
|
||||||
|
if (command.SimulateBuild)
|
||||||
|
return new List<AssetInfo>();
|
||||||
|
|
||||||
|
string[] depends = command.AssetDependency.GetDependencies(mainAssetPath, true);
|
||||||
List<AssetInfo> result = new List<AssetInfo>(depends.Length);
|
List<AssetInfo> result = new List<AssetInfo>(depends.Length);
|
||||||
foreach (string assetPath in depends)
|
foreach (string assetPath in depends)
|
||||||
{
|
{
|
||||||
|
|
|
@ -89,7 +89,7 @@ namespace YooAsset.Editor
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取包裹收集的资源文件
|
/// 获取包裹收集的资源文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public CollectResult GetPackageAssets(bool simulateBuild, string packageName)
|
public CollectResult GetPackageAssets(bool simulateBuild, bool useAssetDependencyDB, string packageName)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(packageName))
|
if (string.IsNullOrEmpty(packageName))
|
||||||
throw new Exception("Build package name is null or empty !");
|
throw new Exception("Build package name is null or empty !");
|
||||||
|
@ -100,7 +100,7 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
// 创建资源收集命令
|
// 创建资源收集命令
|
||||||
IIgnoreRule ignoreRule = AssetBundleCollectorSettingData.GetIgnoreRuleInstance(package.IgnoreRuleName);
|
IIgnoreRule ignoreRule = AssetBundleCollectorSettingData.GetIgnoreRuleInstance(package.IgnoreRuleName);
|
||||||
CollectCommand command = new CollectCommand(simulateBuild, packageName,
|
CollectCommand command = new CollectCommand(simulateBuild, useAssetDependencyDB, packageName,
|
||||||
package.EnableAddressable,
|
package.EnableAddressable,
|
||||||
package.LocationToLower,
|
package.LocationToLower,
|
||||||
package.IncludeAssetGUID,
|
package.IncludeAssetGUID,
|
||||||
|
|
|
@ -991,7 +991,7 @@ namespace YooAsset.Editor
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IIgnoreRule ignoreRule = AssetBundleCollectorSettingData.GetIgnoreRuleInstance(_ignoreRulePopupField.value.ClassName);
|
IIgnoreRule ignoreRule = AssetBundleCollectorSettingData.GetIgnoreRuleInstance(_ignoreRulePopupField.value.ClassName);
|
||||||
CollectCommand command = new CollectCommand(true,
|
CollectCommand command = new CollectCommand(true, false,
|
||||||
_packageNameTxt.value,
|
_packageNameTxt.value,
|
||||||
_enableAddressableToogle.value,
|
_enableAddressableToogle.value,
|
||||||
_locationToLowerToogle.value,
|
_locationToLowerToogle.value,
|
||||||
|
|
|
@ -0,0 +1,271 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset.Editor
|
||||||
|
{
|
||||||
|
public class AssetDependencyCache
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 资源依赖缓存数据库
|
||||||
|
/// </summary>
|
||||||
|
private class CacheDatabase
|
||||||
|
{
|
||||||
|
private class CacheInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 此哈希函数会聚合了以下内容:源资源路径、源资源、元文件、目标平台以及导入器版本。
|
||||||
|
/// 如果此哈希值发送变化,则说明导入资源可能已更改,因此应重新搜集依赖关系。
|
||||||
|
/// </summary>
|
||||||
|
public string DependHash;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 直接依赖资源的GUID列表
|
||||||
|
/// </summary>
|
||||||
|
public List<string> DependGUIDs = new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string _databaseFilePath;
|
||||||
|
private readonly Dictionary<string, CacheInfo> _database = new Dictionary<string, CacheInfo>(100000);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建数据库
|
||||||
|
/// </summary>
|
||||||
|
public void CreateDatabase(string databaseFilePath, bool useCacheDatabase)
|
||||||
|
{
|
||||||
|
_databaseFilePath = databaseFilePath;
|
||||||
|
_database.Clear();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (useCacheDatabase && File.Exists(databaseFilePath))
|
||||||
|
{
|
||||||
|
// 解析缓存文件
|
||||||
|
using var stream = File.OpenRead(databaseFilePath);
|
||||||
|
using var reader = new BinaryReader(stream);
|
||||||
|
var count = reader.ReadInt32();
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
var assetPath = reader.ReadString();
|
||||||
|
var cacheInfo = new CacheInfo
|
||||||
|
{
|
||||||
|
DependHash = reader.ReadString(),
|
||||||
|
DependGUIDs = ReadStringList(reader),
|
||||||
|
};
|
||||||
|
_database.Add(assetPath, cacheInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 移除无效资源
|
||||||
|
List<string> removeList = new List<string>(10000);
|
||||||
|
foreach (var cacheInfoPair in _database)
|
||||||
|
{
|
||||||
|
var assetPath = cacheInfoPair.Key;
|
||||||
|
var assetGUID = AssetDatabase.AssetPathToGUID(assetPath);
|
||||||
|
if (string.IsNullOrEmpty(assetGUID))
|
||||||
|
{
|
||||||
|
removeList.Add(assetPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var assetPath in removeList)
|
||||||
|
{
|
||||||
|
_database.Remove(assetPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ClearCache(true);
|
||||||
|
Debug.LogError($"Failed to load cache database : {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找新增或变动资源
|
||||||
|
var allAssetPaths = AssetDatabase.GetAllAssetPaths();
|
||||||
|
foreach (var assetPath in allAssetPaths)
|
||||||
|
{
|
||||||
|
if (_database.TryGetValue(assetPath, out CacheInfo cacheInfo))
|
||||||
|
{
|
||||||
|
var dependHash = AssetDatabase.GetAssetDependencyHash(assetPath);
|
||||||
|
if (dependHash.ToString() != cacheInfo.DependHash)
|
||||||
|
{
|
||||||
|
_database[assetPath] = CreateCacheInfo(assetPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var newCacheInfo = CreateCacheInfo(assetPath);
|
||||||
|
_database.Add(assetPath, newCacheInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存缓存文件
|
||||||
|
/// </summary>
|
||||||
|
public void SaveCacheFile()
|
||||||
|
{
|
||||||
|
if (File.Exists(_databaseFilePath))
|
||||||
|
File.Delete(_databaseFilePath);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var stream = File.Create(_databaseFilePath);
|
||||||
|
using var writer = new BinaryWriter(stream);
|
||||||
|
writer.Write(_database.Count);
|
||||||
|
foreach (var assetPair in _database)
|
||||||
|
{
|
||||||
|
string assetPath = assetPair.Key;
|
||||||
|
var assetInfo = assetPair.Value;
|
||||||
|
writer.Write(assetPath);
|
||||||
|
writer.Write(assetInfo.DependHash);
|
||||||
|
WriteStringList(writer, assetInfo.DependGUIDs);
|
||||||
|
}
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.LogError($"Failed to save cache database : {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清理缓存数据
|
||||||
|
/// </summary>
|
||||||
|
public void ClearCache(bool clearDatabaseFile)
|
||||||
|
{
|
||||||
|
if (clearDatabaseFile)
|
||||||
|
{
|
||||||
|
if (File.Exists(_databaseFilePath))
|
||||||
|
File.Delete(_databaseFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
_database.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源的依赖列表
|
||||||
|
/// </summary>
|
||||||
|
public string[] GetDependencies(string assetPath, bool recursive)
|
||||||
|
{
|
||||||
|
// 注意:AssetDatabase.GetDependencies()方法返回结果里会踢出丢失文件!
|
||||||
|
// 注意:AssetDatabase.GetDependencies()方法返回结果里会包含主资源路径!
|
||||||
|
|
||||||
|
// 注意:机制上不允许存在未收录的资源
|
||||||
|
if (_database.ContainsKey(assetPath) == false)
|
||||||
|
{
|
||||||
|
throw new Exception($"Fatal : can not found cache info : {assetPath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = new HashSet<string> { assetPath };
|
||||||
|
CollectDependencies(assetPath, result, recursive);
|
||||||
|
|
||||||
|
// 注意:AssetDatabase.GetDependencies保持一致,将主资源添加到依赖列表最前面
|
||||||
|
return result.ToArray();
|
||||||
|
}
|
||||||
|
private void CollectDependencies(string assetPath, HashSet<string> result, bool recursive)
|
||||||
|
{
|
||||||
|
if (_database.TryGetValue(assetPath, out var cacheInfo) == false)
|
||||||
|
{
|
||||||
|
throw new Exception($"Fatal : can not found cache info : {assetPath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var dependGUID in cacheInfo.DependGUIDs)
|
||||||
|
{
|
||||||
|
string dependAssetPath = AssetDatabase.GUIDToAssetPath(dependGUID);
|
||||||
|
if (string.IsNullOrEmpty(dependAssetPath))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 如果是文件夹资源
|
||||||
|
if (AssetDatabase.IsValidFolder(dependAssetPath))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 如果已经收集过
|
||||||
|
if (result.Contains(dependAssetPath))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
result.Add(dependAssetPath);
|
||||||
|
|
||||||
|
// 递归收集依赖
|
||||||
|
if (recursive)
|
||||||
|
CollectDependencies(dependAssetPath, result, recursive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<string> ReadStringList(BinaryReader reader)
|
||||||
|
{
|
||||||
|
var count = reader.ReadInt32();
|
||||||
|
var values = new List<string>(count);
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
values.Add(reader.ReadString());
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
private void WriteStringList(BinaryWriter writer, List<string> values)
|
||||||
|
{
|
||||||
|
writer.Write(values.Count);
|
||||||
|
foreach (var value in values)
|
||||||
|
{
|
||||||
|
writer.Write(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private CacheInfo CreateCacheInfo(string assetPath)
|
||||||
|
{
|
||||||
|
var dependHash = AssetDatabase.GetAssetDependencyHash(assetPath);
|
||||||
|
var dependAssetPaths = AssetDatabase.GetDependencies(assetPath, false);
|
||||||
|
var dependGUIDs = new List<string>();
|
||||||
|
foreach (var dependAssetPath in dependAssetPaths)
|
||||||
|
{
|
||||||
|
string guid = AssetDatabase.AssetPathToGUID(dependAssetPath);
|
||||||
|
if (string.IsNullOrEmpty(guid) == false)
|
||||||
|
{
|
||||||
|
dependGUIDs.Add(guid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var cacheInfo = new CacheInfo();
|
||||||
|
cacheInfo.DependHash = dependHash.ToString();
|
||||||
|
cacheInfo.DependGUIDs = dependGUIDs;
|
||||||
|
return cacheInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly CacheDatabase _database;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化资源依赖缓存系统
|
||||||
|
/// </summary>
|
||||||
|
public AssetDependencyCache(bool useCacheDatabase)
|
||||||
|
{
|
||||||
|
if (useCacheDatabase)
|
||||||
|
Debug.Log("Use asset dependency database !");
|
||||||
|
|
||||||
|
string databaseFilePath = "Library/AssetDependencyDB";
|
||||||
|
_database = new CacheDatabase();
|
||||||
|
_database.CreateDatabase(databaseFilePath, useCacheDatabase);
|
||||||
|
|
||||||
|
if (useCacheDatabase)
|
||||||
|
{
|
||||||
|
_database.SaveCacheFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源的依赖列表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetPath">资源路径</param>
|
||||||
|
/// <param name="recursive">递归查找所有依赖</param>
|
||||||
|
/// <returns>返回依赖的资源路径集合</returns>
|
||||||
|
public string[] GetDependencies(string assetPath, bool recursive = true)
|
||||||
|
{
|
||||||
|
// 通过本地缓存获取依赖关系
|
||||||
|
return _database.GetDependencies(assetPath, recursive);
|
||||||
|
|
||||||
|
// 通过Unity引擎获取依赖关系
|
||||||
|
//return AssetDatabase.GetDependencies(assetPath, recursive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ddc7e04182c802b468e038777e4dd442
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -8,6 +8,11 @@ namespace YooAsset.Editor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool SimulateBuild { private set; get; }
|
public bool SimulateBuild { private set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 使用资源依赖数据库
|
||||||
|
/// </summary>
|
||||||
|
public bool UseAssetDependencyDB { private set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 包裹名称
|
/// 包裹名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -49,11 +54,12 @@ namespace YooAsset.Editor
|
||||||
public IIgnoreRule IgnoreRule { private set; get; }
|
public IIgnoreRule IgnoreRule { private set; get; }
|
||||||
|
|
||||||
|
|
||||||
public CollectCommand(bool simulateBuild, string packageName,
|
public CollectCommand(bool simulateBuild, bool useAssetDependencyDB, string packageName,
|
||||||
bool enableAddressable, bool locationToLower, bool includeAssetGUID,
|
bool enableAddressable, bool locationToLower, bool includeAssetGUID,
|
||||||
bool autoCollectShaders, bool uniqueBundleName, IIgnoreRule ignoreRule)
|
bool autoCollectShaders, bool uniqueBundleName, IIgnoreRule ignoreRule)
|
||||||
{
|
{
|
||||||
SimulateBuild = simulateBuild;
|
SimulateBuild = simulateBuild;
|
||||||
|
UseAssetDependencyDB = useAssetDependencyDB;
|
||||||
PackageName = packageName;
|
PackageName = packageName;
|
||||||
EnableAddressable = enableAddressable;
|
EnableAddressable = enableAddressable;
|
||||||
LocationToLower = locationToLower;
|
LocationToLower = locationToLower;
|
||||||
|
@ -66,5 +72,16 @@ namespace YooAsset.Editor
|
||||||
var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
|
var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
|
||||||
ShadersBundleName = packRuleResult.GetBundleName(packageName, uniqueBundleName);
|
ShadersBundleName = packRuleResult.GetBundleName(packageName, uniqueBundleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private AssetDependencyCache _assetDependency;
|
||||||
|
public AssetDependencyCache AssetDependency
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_assetDependency == null)
|
||||||
|
_assetDependency = new AssetDependencyCache(UseAssetDependencyDB);
|
||||||
|
return _assetDependency;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -104,7 +104,7 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
private void ImportBtn_onClick()
|
private void ImportBtn_onClick()
|
||||||
{
|
{
|
||||||
string selectFilePath = EditorUtility.OpenFilePanel("导入报告", EditorTools.GetProjectPath(), "json");
|
string selectFilePath = EditorUtility.OpenFilePanel("导入报告", EditorTools.GetProjectPath(), "report");
|
||||||
if (string.IsNullOrEmpty(selectFilePath))
|
if (string.IsNullOrEmpty(selectFilePath))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ namespace YooAsset.Editor
|
||||||
|
|
||||||
// 构建参数
|
// 构建参数
|
||||||
public bool ClearBuildCacheFiles;
|
public bool ClearBuildCacheFiles;
|
||||||
|
public bool UseAssetDependencyDB;
|
||||||
public bool EnableSharePackRule;
|
public bool EnableSharePackRule;
|
||||||
public string EncryptionClassName;
|
public string EncryptionClassName;
|
||||||
public EFileNameStyle FileNameStyle;
|
public EFileNameStyle FileNameStyle;
|
||||||
|
|
|
@ -78,6 +78,7 @@ namespace YooAsset.Editor
|
||||||
_items.Add(new ItemWrapper(string.Empty, string.Empty));
|
_items.Add(new ItemWrapper(string.Empty, string.Empty));
|
||||||
_items.Add(new ItemWrapper("Build Params", string.Empty));
|
_items.Add(new ItemWrapper("Build Params", string.Empty));
|
||||||
_items.Add(new ItemWrapper("Clear Build Cache Files", $"{buildReport.Summary.ClearBuildCacheFiles}"));
|
_items.Add(new ItemWrapper("Clear Build Cache Files", $"{buildReport.Summary.ClearBuildCacheFiles}"));
|
||||||
|
_items.Add(new ItemWrapper("Use Asset Dependency DB", $"{buildReport.Summary.UseAssetDependencyDB}"));
|
||||||
_items.Add(new ItemWrapper("Enable Share Pack Rule", $"{buildReport.Summary.EnableSharePackRule}"));
|
_items.Add(new ItemWrapper("Enable Share Pack Rule", $"{buildReport.Summary.EnableSharePackRule}"));
|
||||||
_items.Add(new ItemWrapper("Encryption Class Name", buildReport.Summary.EncryptionClassName));
|
_items.Add(new ItemWrapper("Encryption Class Name", buildReport.Summary.EncryptionClassName));
|
||||||
_items.Add(new ItemWrapper("FileNameStyle", $"{buildReport.Summary.FileNameStyle}"));
|
_items.Add(new ItemWrapper("FileNameStyle", $"{buildReport.Summary.FileNameStyle}"));
|
||||||
|
|
Loading…
Reference in New Issue