using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; namespace UnityEditor.Tilemaps { /// /// Tile Template which places created Tiles into fixed positions passed with this Template /// [Serializable] public class PositionTileTemplate : TileTemplate { [SerializeField] private List m_Positions; /// /// Positions to place Sprites into Tile Palette /// public IEnumerable positions { get => m_Positions; set { if (m_Positions == null) m_Positions = new List(); m_Positions.Clear(); m_Positions.AddRange(value); } } /// /// Tile Template which places created Tiles into fixed positions passed with this Template /// /// Positions to place Sprites into Tile Palette public PositionTileTemplate(IEnumerable positions) { m_Positions = new List(); m_Positions.AddRange(positions); } private static IEnumerable<(T1, T2)> MultipleEnumerate(IEnumerable t1s, IEnumerable t2s) { using IEnumerator enum1 = t1s.GetEnumerator(); using IEnumerator enum2 = t2s.GetEnumerator(); while (enum1.MoveNext() && enum2.MoveNext()) yield return (enum1.Current, enum2.Current); } /// /// Creates a List of TileBase Assets from Texture2D and Sprites with placement /// data onto a Tile Palette. /// /// Texture2D to generate Tile Assets from. /// Sprites to generate Tile Assets from. Each Sprite will be created as a Tile asset and mapped to a position in order. /// Tile Assets and placement data to generate. public override void CreateTileAssets(Texture2D texture2D, IEnumerable sprites, ref List tilesToAdd) { var createTileMethod = GridPaintActiveTargetsPreferences.GetCreateTileFromPaletteUsingPreferences(); if (createTileMethod == null) return; var i = 0; var uniqueNames = new HashSet(); var tileMap = new Dictionary(); foreach (var (textureSprite, position) in MultipleEnumerate(sprites, positions)) { if (!tileMap.TryGetValue(textureSprite, out TileBase tile)) { tile = createTileMethod.Invoke(null, new object[] { textureSprite }) as TileBase; tileMap.Add(textureSprite, tile); } if (tile == null) continue; var tileName = tile.name; if (string.IsNullOrEmpty(tileName) || uniqueNames.Contains(tileName)) { tileName = TileDragAndDrop.GenerateUniqueNameForNamelessSprite(textureSprite, uniqueNames, ref i); tile.name = tileName; } uniqueNames.Add(tileName); tilesToAdd.Add(new TileChangeData() { position = position, tile = tile, transform = Matrix4x4.identity, color = Color.white }); } } } }