WuhuIslandTesting/Library/PackageCache/com.unity.scriptablebuildpipeline@1.21.5/Editor/Tasks/StripUnusedSpriteSources.cs
2025-01-07 02:06:59 +01:00

72 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEditor.Build.Content;
using UnityEditor.Build.Pipeline.Injector;
using UnityEditor.Build.Pipeline.Interfaces;
namespace UnityEditor.Build.Pipeline.Tasks
{
/// <summary>
/// Removes all unusued sprite source data from asset references and scene references.
/// </summary>
public class StripUnusedSpriteSources : IBuildTask
{
/// <inheritdoc />
public int Version { get { return 2; } }
#pragma warning disable 649
[InjectContext]
IDependencyData m_DependencyData;
[InjectContext(ContextUsage.In, true)]
IBuildSpriteData m_SpriteData;
[InjectContext(ContextUsage.InOut, true)]
IBuildExtendedAssetData m_ExtendedAssetData;
#pragma warning restore 649
/// <inheritdoc />
public ReturnCode Run()
{
if (m_SpriteData == null || m_SpriteData.ImporterData.Count == 0)
return ReturnCode.SuccessNotRun;
if (EditorSettings.spritePackerMode == SpritePackerMode.Disabled)
return ReturnCode.SuccessNotRun;
var unusedSources = new HashSet<ObjectIdentifier>();
var textures = m_SpriteData.ImporterData.Values.Where(x => x.PackedSprite).Select(x => x.SourceTexture);
unusedSources.UnionWith(textures);
// Count refs from assets
var assetRefs = m_DependencyData.AssetInfo.SelectMany(x => x.Value.referencedObjects);
foreach (ObjectIdentifier reference in assetRefs)
unusedSources.Remove(reference);
// Count refs from scenes
var sceneRefs = m_DependencyData.SceneInfo.SelectMany(x => x.Value.referencedObjects);
foreach (ObjectIdentifier reference in sceneRefs)
unusedSources.Remove(reference);
SetOutputInformation(unusedSources);
return ReturnCode.Success;
}
void SetOutputInformation(HashSet<ObjectIdentifier> unusedSources)
{
foreach (var source in unusedSources)
{
var assetInfo = m_DependencyData.AssetInfo[source.guid];
assetInfo.includedObjects.RemoveAt(0);
ExtendedAssetData extendedData;
if (m_ExtendedAssetData != null && m_ExtendedAssetData.ExtendedData.TryGetValue(source.guid, out extendedData))
{
extendedData.Representations.Remove(source);
if (extendedData.Representations.Count == 1)
m_ExtendedAssetData.ExtendedData.Remove(source.guid);
}
}
}
}
}