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
});
}
}
}
}