3 using System.Collections.Generic;
14 #if UNITY_2017_1_OR_NEWER 15 private static readonly List<AtlasPrefabReference> References =
new List<AtlasPrefabReference>();
19 FindAtlasPrefabReferences();
20 UpdateAllReferences();
21 PrefabUtility.prefabInstanceUpdated += PrefabInstanceUpdated;
24 private static void FindAtlasPrefabReferences()
27 foreach (var reference
in FindAllAssets<AtlasPrefabReference>())
29 if (reference.Atlas == null)
31 Debug.LogWarning(
"No sprite atlas referenced: " + reference.name);
34 if (reference.Prefabs.Any(o => o == null))
36 Debug.LogWarning(
"One or more prefab references are null: " + reference.name);
39 References.Add(reference);
43 private static void UpdateAllReferences()
45 foreach (var atlasPrefabReference
in References)
47 UpdateAtlasReferences(atlasPrefabReference);
51 private static void PrefabInstanceUpdated(GameObject instance)
53 var prefab = PrefabUtility.GetPrefabParent(instance) as GameObject;
54 foreach (var atlasPrefabReference
in References)
56 if (atlasPrefabReference.Prefabs.Contains(prefab))
58 UpdateAtlasReferences(atlasPrefabReference);
62 private static AssetDeleteResult OnWillDeleteAsset(
string assetPath, RemoveAssetOptions options)
65 if (atlasReference != null)
67 EditorApplication.delayCall += FindAtlasPrefabReferences;
68 return AssetDeleteResult.DidNotDelete;
71 var deletedSprite = AssetDatabase.LoadAssetAtPath<Sprite>(assetPath);
72 if (deletedSprite != null)
74 foreach (var reference
in References.Where(_ref => _ref.Atlas.ContainsSprite(deletedSprite)))
76 var localRef = reference;
77 EditorApplication.delayCall += () => UpdateAtlasReferences(localRef);
79 return AssetDeleteResult.DidNotDelete;
82 return AssetDeleteResult.DidNotDelete;
85 private static string[] OnWillSaveAssets(
string[] paths)
89 EditorApplication.delayCall += FindAtlasPrefabReferences;
90 EditorApplication.delayCall += UpdateAllReferences;
95 private static IEnumerable<T> FindAllAssets<T>() where T :
UnityEngine.Object
97 var type = typeof(T).FullName;
98 foreach (var assetGuid
in AssetDatabase.FindAssets(
"t:" + type))
100 var obj = AssetDatabase.LoadAssetAtPath<T>(AssetDatabase.GUIDToAssetPath(assetGuid));
110 var uniqueSprites = GetDistinctSprites(reference.Prefabs).ToList();
111 reference.Atlas.SetSprites(uniqueSprites);
114 private static IEnumerable<Sprite> GetDistinctSprites(IEnumerable<GameObject> prefabs)
116 return prefabs.SelectMany(p => p.GetComponentsInChildren<Image>())
117 .Select(img => img.sprite).Where(img => img != null).Distinct();
119 #endif // UNITY_2017_1_OR_NEWER