SpriteCollectionRefresh.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text.RegularExpressions;
  6. using Assets.HeroEditor4D.Common.Scripts.Collections;
  7. using Assets.HeroEditor4D.Common.Scripts.Data;
  8. using Assets.HeroEditor4D.Common.Scripts.Editor;
  9. using UnityEditor;
  10. using UnityEngine;
  11. namespace HeroEditor4D.Common.Editor
  12. {
  13. /// <summary>
  14. /// Refreshes the main sprite collection when importing new sprite bundles.
  15. /// </summary>
  16. public class SpriteCollectionRefresh : AssetPostprocessor
  17. {
  18. public static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
  19. {
  20. var spriteCollection = UnityEngine.Object.FindObjectOfType<SpriteCollection>();
  21. if (spriteCollection != null)
  22. {
  23. Refresh(spriteCollection);
  24. }
  25. }
  26. public static void Refresh(SpriteCollection spriteCollection)
  27. {
  28. spriteCollection.Body = LoadSprites(spriteCollection, "/BodyParts/Body");
  29. spriteCollection.Ears = LoadSprites(spriteCollection, "/BodyParts/Ears");
  30. spriteCollection.Hair = LoadSprites(spriteCollection, "/BodyParts/Hair");
  31. spriteCollection.Beard = LoadSprites(spriteCollection, "/BodyParts/Beard");
  32. spriteCollection.Eyebrows = LoadSprites(spriteCollection, "/BodyParts/Eyebrows");
  33. spriteCollection.Eyes = LoadSprites(spriteCollection, "/BodyParts/Eyes");
  34. spriteCollection.Mouth = LoadSprites(spriteCollection, "/BodyParts/Mouth");
  35. spriteCollection.Armor = LoadSprites(spriteCollection, "/Equipment/Armor");
  36. spriteCollection.Cape = LoadSprites(spriteCollection, "/Equipment/Cape");
  37. spriteCollection.Backpack = LoadSprites(spriteCollection, "/Equipment/Back");
  38. spriteCollection.MeleeWeapon1H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon1H", 1);
  39. spriteCollection.MeleeWeapon2H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon2H", 1);
  40. spriteCollection.Shield = LoadSprites(spriteCollection, "/Equipment/Shield");
  41. spriteCollection.Supplies = LoadSprites(spriteCollection, "/Equipment/Supplies", 1);
  42. spriteCollection.Bow = LoadSprites(spriteCollection, "/Equipment/Bow");
  43. spriteCollection.Crossbow = LoadSprites(spriteCollection, "/Equipment/Crossbow");
  44. spriteCollection.Firearm1H = LoadSprites(spriteCollection, "/Equipment/Firearm1H");
  45. spriteCollection.Firearm2H = LoadSprites(spriteCollection, "/Equipment/Firearm2H");
  46. spriteCollection.Throwable = LoadSprites(spriteCollection, "/Equipment/Throwable");
  47. spriteCollection.Makeup = LoadSprites(spriteCollection, "/Equipment/Makeup");
  48. spriteCollection.Mask = LoadSprites(spriteCollection, "/Equipment/Mask");
  49. spriteCollection.Earrings = LoadSprites(spriteCollection, "/Equipment/Earrings");
  50. spriteCollection.Firearm1H.ForEach(FirearmMuzzleResolver.Resolve);
  51. spriteCollection.Firearm2H.ForEach(FirearmMuzzleResolver.Resolve);
  52. EditorUtility.SetDirty(spriteCollection);
  53. if (spriteCollection.DebugLogging) Debug.Log("<color=yellow>SpriteCollection: refreshed.</color>");
  54. }
  55. private static List<ItemSprite> LoadSprites(SpriteCollection sc, string subPath, int nesting = 0)
  56. {
  57. var type = subPath.Split('/')[2];
  58. var collection = new List<ItemSprite>();
  59. foreach (var asset in sc.SpriteFolders)
  60. {
  61. if (asset == null) continue;
  62. var path = AssetDatabase.GetAssetPath(asset) + subPath;
  63. if (!Directory.Exists(path)) continue;
  64. var include = sc.CollectionFilter.Where(i => !i.StartsWith("!")).ToList();
  65. var exclude = sc.CollectionFilter.Where(i => i.StartsWith("!")).Select(i => i.Replace("!", "")).ToList();
  66. var extensions = new List<string> { "*.png" };
  67. if (sc.IncludePsd) extensions.Add("*.psd");
  68. foreach (var ext in extensions)
  69. {
  70. var entries = Directory.GetFiles(path, ext, SearchOption.AllDirectories)
  71. .Select(p => p.Replace("\\", "/"))
  72. .Select(p => new ItemSprite(GetEditionName(p), GetCollectionName(p, nesting), type, Path.GetFileNameWithoutExtension(p), p, AssetDatabase.LoadAssetAtPath<Sprite>(p), AssetDatabase.LoadAllAssetsAtPath(p).OfType<Sprite>().ToList()))
  73. .Where(i => (include.Count == 0 || include.Contains(i.Collection)) && !exclude.Contains(i.Collection) || sc.CollectionFilterIgnore.Any(i.Path.Contains) && !exclude.Contains(i.Collection)).ToList();
  74. collection.AddRange(entries);
  75. }
  76. }
  77. foreach (var entry in collection)
  78. {
  79. foreach (Match match in Regex.Matches(entry.Path, @"\[(.+?)\]"))
  80. {
  81. entry.Tags.Add(match.Groups[1].Value);
  82. }
  83. }
  84. return collection.OrderBy(i => i.Name).ToList();
  85. }
  86. private static string GetEditionName(string path)
  87. {
  88. var edition = path.Split('/')[2];
  89. return edition;
  90. }
  91. private static string GetCollectionName(string path, int nesting)
  92. {
  93. var parent = Directory.GetParent(path);
  94. for (var i = 0; i < nesting; i++)
  95. {
  96. parent = parent?.Parent;
  97. }
  98. if (parent == null) throw new NotSupportedException();
  99. return parent.Name;
  100. }
  101. }
  102. }