update asset bundle builder

pull/186/head^2
hevinci 2023-09-25 17:59:31 +08:00
parent 11386a7ec2
commit bcb6443300
4 changed files with 62 additions and 60 deletions

View File

@ -28,6 +28,11 @@ namespace YooAsset.Editor
/// 缓存服务器端口 /// 缓存服务器端口
/// </summary> /// </summary>
public int CacheServerPort; public int CacheServerPort;
/// <summary>
/// 修复图集资源冗余问题
/// </summary>
public bool FixSpriteAtlasRedundancy = false;
} }
/// <summary> /// <summary>

View File

@ -8,65 +8,61 @@ using System.Linq;
namespace UnityEditor.Build.Pipeline.Tasks namespace UnityEditor.Build.Pipeline.Tasks
{ {
/// <summary> /// <summary>
/// Ref https://zhuanlan.zhihu.com/p/586918159 /// Ref https://zhuanlan.zhihu.com/p/586918159
/// </summary> /// </summary>
public class RemoveSpriteAtlasRedundancy : IBuildTask public class RemoveSpriteAtlasRedundancy : IBuildTask
{ {
/// <inheritdoc /> public int Version => 1;
public int Version => 1;
[InjectContext] [InjectContext]
IBundleWriteData writeDataParam; IBundleWriteData writeDataParam;
/// <inheritdoc /> public ReturnCode Run()
public ReturnCode Run() {
{
#if UNITY_2020_3_OR_NEWER #if UNITY_2020_3_OR_NEWER
BundleWriteData writeData = (BundleWriteData)writeDataParam; BundleWriteData writeData = (BundleWriteData)writeDataParam;
// 所有图集散图的 guid 集合 // 图集引用的精灵图片集合
HashSet<GUID> spriteGuids = new HashSet<GUID>(); HashSet<GUID> spriteGuids = new HashSet<GUID>();
foreach (var pair in writeData.FileToObjects)
{
foreach (ObjectIdentifier objectIdentifier in pair.Value)
{
var assetPath = AssetDatabase.GUIDToAssetPath(objectIdentifier.guid);
var assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
if (assetType == typeof(SpriteAtlas))
{
var spritePaths = AssetDatabase.GetDependencies(assetPath, false);
foreach (string spritePath in spritePaths)
{
GUID spriteGuild = AssetDatabase.GUIDFromAssetPath(spritePath);
spriteGuids.Add(spriteGuild);
}
}
}
}
// 遍历资源包里的资源记录其中图集的散图 guid // 移除图集引用的精力图片对象
foreach (var pair in writeData.FileToObjects) foreach (var pair in writeData.FileToObjects)
{ {
foreach (ObjectIdentifier objectIdentifier in pair.Value) List<ObjectIdentifier> objectIdentifiers = pair.Value;
{ for (int i = objectIdentifiers.Count - 1; i >= 0; i--)
string path = AssetDatabase.GUIDToAssetPath(objectIdentifier.guid); {
Object asset = AssetDatabase.LoadAssetAtPath<Object>(path); ObjectIdentifier objectIdentifier = objectIdentifiers[i];
if (asset is SpriteAtlas) if (spriteGuids.Contains(objectIdentifier.guid))
{ {
List<string> spritePaths = AssetDatabase.GetDependencies(path, false).ToList(); if (objectIdentifier.localIdentifierInFile == 2800000)
foreach (string spritePath in spritePaths) {
{ // 删除图集散图的冗余纹理
GUID spriteGuild = AssetDatabase.GUIDFromAssetPath(spritePath); objectIdentifiers.RemoveAt(i);
spriteGuids.Add(spriteGuild); }
} }
} }
} }
}
// 将 writeData.FileToObjects 包含的图集散图的 texture 删掉避免冗余
foreach (var pair in writeData.FileToObjects)
{
List<ObjectIdentifier> objectIdentifiers = pair.Value;
for (int i = objectIdentifiers.Count - 1; i >= 0; i--)
{
ObjectIdentifier objectIdentifier = objectIdentifiers[i];
if (spriteGuids.Contains(objectIdentifier.guid))
{
if (objectIdentifier.localIdentifierInFile == 2800000)
{
// 删除图集散图的冗余 texture
objectIdentifiers.RemoveAt(i);
}
}
}
}
#endif #endif
return ReturnCode.Success; return ReturnCode.Success;
} }
} }
} }

View File

@ -9,10 +9,10 @@ namespace UnityEditor.Build.Pipeline.Tasks
{ {
public static class SBPBuildTasks public static class SBPBuildTasks
{ {
public static IList<IBuildTask> Create(string builtInShaderBundleName) public static IList<IBuildTask> Create(bool fixSpriteAtlasRedundancy, string builtInShaderBundleName)
{ {
var buildTasks = new List<IBuildTask>(); var buildTasks = new List<IBuildTask>();
// Setup // Setup
buildTasks.Add(new SwitchToBuildPlatform()); buildTasks.Add(new SwitchToBuildPlatform());
buildTasks.Add(new RebuildSpriteAtlasCache()); buildTasks.Add(new RebuildSpriteAtlasCache());
@ -33,20 +33,21 @@ namespace UnityEditor.Build.Pipeline.Tasks
// Packing // Packing
buildTasks.Add(new GenerateBundlePacking()); buildTasks.Add(new GenerateBundlePacking());
buildTasks.Add(new RemoveSpriteAtlasRedundancy()); // Fix for SpriteAtlas Redundancy if (fixSpriteAtlasRedundancy)
buildTasks.Add(new RemoveSpriteAtlasRedundancy());
buildTasks.Add(new UpdateBundleObjectLayout()); buildTasks.Add(new UpdateBundleObjectLayout());
buildTasks.Add(new GenerateBundleCommands()); buildTasks.Add(new GenerateBundleCommands());
buildTasks.Add(new GenerateSubAssetPathMaps()); buildTasks.Add(new GenerateSubAssetPathMaps());
buildTasks.Add(new GenerateBundleMaps()); buildTasks.Add(new GenerateBundleMaps());
buildTasks.Add(new PostPackingCallback()); buildTasks.Add(new PostPackingCallback());
// Writing // Writing
buildTasks.Add(new WriteSerializedFiles()); buildTasks.Add(new WriteSerializedFiles());
buildTasks.Add(new ArchiveAndCompressBundles()); buildTasks.Add(new ArchiveAndCompressBundles());
buildTasks.Add(new AppendBundleHash()); buildTasks.Add(new AppendBundleHash());
buildTasks.Add(new GenerateLinkXml()); buildTasks.Add(new GenerateLinkXml());
buildTasks.Add(new PostWritingCallback()); buildTasks.Add(new PostWritingCallback());
return buildTasks; return buildTasks;
} }
} }

View File

@ -33,7 +33,7 @@ namespace YooAsset.Editor
// 开始构建 // 开始构建
IBundleBuildResults buildResults; IBundleBuildResults buildResults;
var buildParameters = buildParametersContext.GetSBPBuildParameters(); var buildParameters = buildParametersContext.GetSBPBuildParameters();
var taskList = SBPBuildTasks.Create(buildMapContext.Command.ShadersBundleName); var taskList = SBPBuildTasks.Create(buildParametersContext.Parameters.SBPParameters.FixSpriteAtlasRedundancy, 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)
{ {