Sin descripción
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PopulateRuleOverrideTileWizard.cs 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using UnityEngine;
  2. using UnityEngine.Tilemaps;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using UnityEngine.Scripting.APIUpdating;
  6. namespace UnityEditor.Tilemaps
  7. {
  8. /// <summary>
  9. /// Wizard for populating RuleOverrideTile from a SpriteSheet
  10. /// </summary>
  11. [MovedFrom(true, "UnityEditor")]
  12. public class PopulateRuleOverideTileWizard : ScriptableWizard
  13. {
  14. [MenuItem("CONTEXT/RuleOverrideTile/Populate From Sprite Sheet")]
  15. static void MenuOption(MenuCommand menuCommand)
  16. {
  17. PopulateRuleOverideTileWizard.CreateWizard(menuCommand.context as RuleOverrideTile);
  18. }
  19. [MenuItem("CONTEXT/RuleOverrideTile/Populate From Sprite Sheet", true)]
  20. static bool MenuOptionValidation(MenuCommand menuCommand)
  21. {
  22. RuleOverrideTile tile = menuCommand.context as RuleOverrideTile;
  23. return tile.m_Tile;
  24. }
  25. /// <summary>
  26. /// The Texture2D containing the Sprites to override with
  27. /// </summary>
  28. public Texture2D m_spriteSet;
  29. private RuleOverrideTile m_tileset;
  30. /// <summary>
  31. /// Creates a wizard for the target RuleOverrideTIle
  32. /// </summary>
  33. /// <param name="target">The RuleOverrideTile to be edited by the wizard</param>
  34. public static void CreateWizard(RuleOverrideTile target) {
  35. PopulateRuleOverideTileWizard wizard = DisplayWizard<PopulateRuleOverideTileWizard>("Populate Override", "Populate");
  36. wizard.m_tileset = target;
  37. }
  38. /// <summary>
  39. /// Creates a new PopulateRuleOverideTileWizard and copies the settings from an existing PopulateRuleOverideTileWizard
  40. /// </summary>
  41. /// <param name="oldWizard">The wizard to copy settings from</param>
  42. public static void CloneWizard(PopulateRuleOverideTileWizard oldWizard) {
  43. PopulateRuleOverideTileWizard wizard = DisplayWizard<PopulateRuleOverideTileWizard>("Populate Override", "Populate");
  44. wizard.m_tileset = oldWizard.m_tileset;
  45. wizard.m_spriteSet = oldWizard.m_spriteSet;
  46. }
  47. private void OnWizardUpdate() {
  48. isValid = m_tileset != null && m_spriteSet != null;
  49. }
  50. private void OnWizardCreate() {
  51. try {
  52. Populate();
  53. }
  54. catch(System.Exception ex) {
  55. EditorUtility.DisplayDialog("Auto-populate failed!", ex.Message, "Ok");
  56. CloneWizard(this);
  57. }
  58. }
  59. /// <summary>
  60. /// Attempts to populate the selected override tile using the chosen sprite.
  61. /// The assumption here is that the sprite set selected by the user has the same
  62. /// naming scheme as the original sprite. That is to say, they should both have the same number
  63. /// of sprites, each sprite ends in an underscore followed by a number, and that they are
  64. /// intended to be equivalent in function.
  65. /// </summary>
  66. private void Populate() {
  67. string spriteSheet = AssetDatabase.GetAssetPath(m_spriteSet);
  68. Sprite[] overrideSprites = AssetDatabase.LoadAllAssetsAtPath(spriteSheet).OfType<Sprite>().ToArray();
  69. bool finished = false;
  70. try {
  71. Undo.RecordObject(m_tileset, "Auto-populate " + m_tileset.name);
  72. foreach(RuleTile.TilingRule rule in m_tileset.m_Tile.m_TilingRules) {
  73. foreach(Sprite originalSprite in rule.m_Sprites) {
  74. string spriteName = originalSprite.name;
  75. string spriteNumber = Regex.Match(spriteName, @"_\d+$").Value;
  76. Sprite matchingOverrideSprite = overrideSprites.First(sprite => sprite.name.EndsWith(spriteNumber));
  77. m_tileset[originalSprite] = matchingOverrideSprite;
  78. }
  79. }
  80. finished = true;
  81. }
  82. catch(System.InvalidOperationException ex) {
  83. throw (new System.ArgumentOutOfRangeException("Sprite sheet mismatch", ex));
  84. }
  85. finally {
  86. // We handle the undo like this in case we end up catching more exceptions.
  87. // We want this to ALWAYS happen unless we complete the population.
  88. if(!finished) {
  89. Undo.PerformUndo();
  90. }
  91. }
  92. }
  93. }
  94. }