diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/ExtdBuildTasks.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/ExtdBuildTasks.cs new file mode 100644 index 0000000..282662c --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/ExtdBuildTasks.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using UnityEditor.Build.Content; +using UnityEngine.U2D; +using UnityEditor.Build.Pipeline.Injector; +using UnityEditor.Build.Pipeline.Interfaces; +using UnityEngine; +using System.Linq; + +namespace UnityEditor.Build.Pipeline.Tasks +{ + /// + /// Ref https://zhuanlan.zhihu.com/p/586918159 + /// + public class RemoveSpriteAtlasRedundancy : IBuildTask + { + /// + public int Version => 1; + + [InjectContext] + IBundleWriteData writeDataParam; + + /// + public ReturnCode Run() + { + BundleWriteData writeData = (BundleWriteData)writeDataParam; + + // 所有图集散图的 guid 集合 + HashSet spriteGuids = new HashSet(); + + // 遍历资源包里的资源记录其中图集的散图 guid + foreach (var pair in writeData.FileToObjects) + { + foreach (ObjectIdentifier objectIdentifier in pair.Value) + { + string path = AssetDatabase.GUIDToAssetPath(objectIdentifier.guid); + Object asset = AssetDatabase.LoadAssetAtPath(path); + if (asset is SpriteAtlas) + { + List spritePaths = AssetDatabase.GetDependencies(path, false).ToList(); + foreach (string spritePath in spritePaths) + { + GUID spriteGuild = AssetDatabase.GUIDFromAssetPath(spritePath); + spriteGuids.Add(spriteGuild); + } + } + } + } + + // 将 writeData.FileToObjects 包含的图集散图的 texture 删掉避免冗余 + foreach (var pair in writeData.FileToObjects) + { + List 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); + } + } + } + } + + return ReturnCode.Success; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/ExtdBuildTasks.cs.meta b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/ExtdBuildTasks.cs.meta new file mode 100644 index 0000000..015455c --- /dev/null +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/ExtdBuildTasks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f01d5c82be95c8f4b93aeefc0454ae5c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/SBPBuildTasks.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/SBPBuildTasks.cs index ef864ec..71056e6 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/SBPBuildTasks.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/SBPBuildTasks.cs @@ -33,19 +33,20 @@ namespace UnityEditor.Build.Pipeline.Tasks // Packing buildTasks.Add(new GenerateBundlePacking()); + buildTasks.Add(new RemoveSpriteAtlasRedundancy()); // Fix for SpriteAtlas Redundancy buildTasks.Add(new UpdateBundleObjectLayout()); buildTasks.Add(new GenerateBundleCommands()); buildTasks.Add(new GenerateSubAssetPathMaps()); buildTasks.Add(new GenerateBundleMaps()); buildTasks.Add(new PostPackingCallback()); - + // Writing buildTasks.Add(new WriteSerializedFiles()); buildTasks.Add(new ArchiveAndCompressBundles()); buildTasks.Add(new AppendBundleHash()); buildTasks.Add(new GenerateLinkXml()); buildTasks.Add(new PostWritingCallback()); - + return buildTasks; } }