using System; using System.Collections.Generic; using UnityEngine; namespace UnityEditor.Tilemaps { /// /// Class containing utility methods for RuleTile Template /// public static class RuleTileTemplateUtility { /// /// Applies an RuleTileTemplate to an RuleTile with a source Texture2D /// /// RuleTileTemplate to apply. /// Source Texture2D containing Sprites for the RuleTileTemplate. /// RuleTile updated with RuleTileTemplate. /// Match Sprites from Source exactly with positional data from RuleTileTemplate /// or match based on relative positional size. public static void ApplyTemplateToRuleTile(this RuleTileTemplate template , Texture2D texture , RuleTile ruleTile , bool matchExact = true) { if (template == null || texture == null || ruleTile == null) return; ruleTile.m_DefaultSprite = template.defaultSprite; ruleTile.m_DefaultGameObject = template.defaultGameObject; ruleTile.m_DefaultColliderType = template.defaultColliderType; if (ruleTile.m_TilingRules == null) ruleTile.m_TilingRules = new List(template.rules.Count); var assets = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(texture)); var j = 0; foreach (var rule in template.rules) { var copyRule = rule.tilingRule.Clone(); for (var i = 0; i < rule.tilingRule.m_Sprites.Length; ++i) { var spritePosition = rule.spritePositions[i]; foreach (var asset in assets) { var sprite = asset as Sprite; if (sprite == null) continue; var match = false; if (matchExact) { match = Mathf.Approximately(spritePosition.x, sprite.rect.x) && Mathf.Approximately(spritePosition.y, sprite.rect.y); } else { match = Mathf.Approximately(spritePosition.x / template.textureWidth, sprite.rect.x / texture.width) && Mathf.Approximately(spritePosition.y / template.textureHeight, sprite.rect.y / texture.height); } if (match) { copyRule.m_Sprites[i] = sprite;; break; } } } ruleTile.m_TilingRules.Add(copyRule); j++; } } /// /// Creates an RuleTileTemplate with the given parameters. /// /// RuleTile to save template with. /// RuleTileTemplate generated with the given parameters. public static RuleTileTemplate CreateTemplate(RuleTile ruleTile) { var template = ScriptableObject.CreateInstance(); template.defaultSprite = ruleTile.m_DefaultSprite; template.defaultGameObject = ruleTile.m_DefaultGameObject; template.defaultColliderType = ruleTile.m_DefaultColliderType; var count = ruleTile.m_TilingRules.Count; template.rules = new List(count); for (var j = 0; j < count; j++) { var ruleData = new RuleTileTemplate.RuleData(); ruleData.tilingRule = ruleTile.m_TilingRules[j]; var spriteCount = ruleData.tilingRule.m_Sprites.Length; ruleData.spritePositions = new List(spriteCount); for (var i = 0; i < spriteCount; ++i) { var sprite = ruleData.tilingRule.m_Sprites[i]; var position = sprite != null ? sprite.rect.position : Vector2.zero; ruleData.spritePositions.Add(position); } template.rules.Add(ruleData); } return template; } /// /// Creates and saves an RuleTileTemplate with a FilePanel. /// /// RuleTile to save template with. public static void SaveTemplateToFile(RuleTile ruleTile) { var template = CreateTemplate(ruleTile); var path = EditorUtility.SaveFilePanelInProject("Save RuleTile template", "New RuleTile Template", RuleTileTemplate.kExtension, ""); if (!String.IsNullOrWhiteSpace(path)) AssetDatabase.CreateAsset(template, path); } } }