using System.Collections.Generic; using System.IO; using UnityEditor.AssetImporters; using UnityEditor.U2D; using UnityEditorInternal; using UnityEngine; using UnityEngine.Tilemaps; using UnityEngine.U2D; using Object = UnityEngine.Object; namespace UnityEditor.Tilemaps { /// /// Importer for the TileSet /// [ScriptedImporter(1, "tileset", importQueueOffset: 4, AllowCaching = true)] public class TileSetImporter : ScriptedImporter { [SerializeField] internal bool paletteGridFoldout = true; [SerializeField] internal bool textureSourcesFoldout = true; [SerializeField] internal bool spriteAtlasSettingsFoldout; /// /// This method is called by the Asset pipeline to import files as a TileSet asset. /// /// /// This argument contains all the contextual information needed to process the import event /// and is also used by the custom importer to store the resulting Unity Asset. /// public override void OnImportAsset(AssetImportContext ctx) { var loadedObjects = InternalEditorUtility.LoadSerializedFileAndForget(ctx.assetPath); TileSet tileSet = default; SpriteAtlas spriteAtlas = default; foreach (var loadedObject in loadedObjects) { if (loadedObject is TileSet loadedTileSet) tileSet = loadedTileSet; if (loadedObject is SpriteAtlas loadedSpriteAtlas) spriteAtlas = loadedSpriteAtlas; } if (tileSet == null) { Debug.LogError("Unable to load TileSet asset"); return; } var tileSetName = Path.GetFileNameWithoutExtension(ctx.assetPath); // Gather Sprites from Textures var textureList = new List(); var spritesList = new List>(); var templateList = new List(); foreach (var textureSource in tileSet.textureSources) { if (textureSource.texture == null) continue; var texturePath = AssetDatabase.GetAssetPath(textureSource.texture); ctx.DependsOnArtifact(texturePath); var textureObjects = AssetDatabase.LoadAllAssetsAtPath(texturePath); var textureSprites = new List(); foreach (var textureObject in textureObjects) { var sprite = textureObject as Sprite; if (sprite != null) textureSprites.Add(sprite); } if (textureSprites.Count > 0) { textureList.Add(textureSource.texture); spritesList.Add(textureSprites); TileTemplate tileTemplate = null; if (textureSource.tileTemplate != null) { var templatePath = AssetDatabase.GetAssetPath(textureSource.tileTemplate); ctx.DependsOnArtifact(templatePath); tileTemplate = AssetDatabase.LoadAssetAtPath(templatePath); } templateList.Add(tileTemplate); } // Register textures to SpriteAtlas if (tileSet.createAtlas && spriteAtlas != null) { spriteAtlas.Remove(new Object[] { textureSource.texture }); spriteAtlas.Add(new Object[] { textureSource.texture }); } } // Create Palette var paletteGO = GridPaletteUtility.CreateNewPaletteAsSubAsset(tileSetName , tileSet.cellLayout , tileSet.cellSizing , tileSet.cellSize , tileSet.hexagonLayout == TileSet.HexagonLayout.PointTop ? GridLayout.CellSwizzle.XYZ : GridLayout.CellSwizzle.YXZ , tileSet.sortMode , tileSet.sortAxis , textureList , spritesList , templateList , out var gridPalette , out var tileList); ctx.AddObjectToAsset(gridPalette.name, gridPalette); ctx.AddObjectToAsset(paletteGO.name, paletteGO); foreach (var tile in tileList) { // Use Sprite ID + Tile for pure Tile if (tile is Tile t && t.sprite != null) { ctx.AddObjectToAsset($"{t.sprite.GetSpriteID()} Tile", tile); } else { ctx.AddObjectToAsset(tile.name, tile); } } // Sprite Atlas if (tileSet.createAtlas && spriteAtlas != null) { spriteAtlas.name = $"{tileSetName} Atlas"; spriteAtlas.RegisterAndPackAtlas(ctx, this, tileSet.scriptablePacker); ctx.AddObjectToAsset(spriteAtlas.name, spriteAtlas); } ctx.SetMainObject(paletteGO); } } }