Example #1
0
        static void CreatePalette(string tilesetName, string tilesetTileTargetDir, ImportedTile[] tileAssets, bool singleImageTileset, int tileWidth, int tileHeight, int columns, int cellWidth, int cellHeight)
        {
            GameObject newPaletteGO = new GameObject(tilesetName, typeof(Grid));

            newPaletteGO.GetComponent <Grid>().cellSize = new Vector3(1.0f, 1.0f, 0.0f);
            GameObject paletteTilemapGO = new GameObject("Layer1", typeof(Tilemap), typeof(TilemapRenderer));

            paletteTilemapGO.transform.SetParent(newPaletteGO.transform);

            paletteTilemapGO.GetComponent <TilemapRenderer>().enabled = false;

            Tilemap paletteTilemap = paletteTilemapGO.GetComponent <Tilemap>();

            paletteTilemap.tileAnchor = TiledTSXImporter.GetPivot(tileWidth, tileHeight, cellWidth, cellHeight);
            if (columns <= 0)
            {
                columns = 5;
            }

            if (singleImageTileset)
            {
                for (int i = 0; i < tileAssets.Length; i++)
                {
                    Sprite sprite = tileAssets[i].tile.sprite;
                    Rect   rect   = sprite.rect;
                    int    x      = (int)rect.x / tileWidth;
                    int    y      = (int)rect.y / tileHeight;
                    paletteTilemap.SetTile(new Vector3Int(x, y, 0), tileAssets[i].tile);
                }
            }
            else
            {
                int x = 0;
                int y = 0;
                for (int i = 0; i < tileAssets.Length; i++)
                {
                    paletteTilemap.SetTile(new Vector3Int(x, y, 0), tileAssets[i].tile);
                    x++;
                    if (x >= columns)
                    {
                        x = 0;
                        y--;
                    }
                }
            }
            string palettePath = tilesetTileTargetDir + Path.DirectorySeparatorChar + tilesetName + ".prefab";

            palettePath = palettePath.Replace('\\', '/');
            UnityEngine.Object newPrefab = PrefabUtility.CreateEmptyPrefab(palettePath);
            PrefabUtility.ReplacePrefab(newPaletteGO, newPrefab, ReplacePrefabOptions.Default);
            GameObject.DestroyImmediate(newPaletteGO);

            GridPalette gridPalette = ScriptableObject.CreateInstance <GridPalette>();

            gridPalette.cellSizing = GridPalette.CellSizing.Automatic;
            gridPalette.name       = "Palette Settings";
            AssetDatabase.AddObjectToAsset(gridPalette, palettePath);
            AssetDatabase.ImportAsset(palettePath);
        }
Example #2
0
        public static ImportedTemplate LoadTXFile(string path, string tilesetDir, int cellWidth, int cellHeight, int pixelsPerUnit)
        {
            TXTypes.Template template = ImportUtils.ReadXMLIntoObject <TXTypes.Template>(path);

            ImportedTileset tileset;

            if (template.tileset != null)
            {
                string baseFolder = Path.GetDirectoryName(path);
                tileset = TiledTSXImporter.ImportFromTilesetReference(template.tileset, baseFolder, tilesetDir, cellWidth, cellHeight, pixelsPerUnit);
            }
            else
            {
                tileset = null;
            }

            return(new ImportedTemplate(template, tileset));
        }
Example #3
0
        public static Sprite ImportPathAsSprite(string tmxFolderPath, string relativeSourcePath, string storageFolder, int pixelsPerUnit)
        {
            string imageSourcePath;
            string imageTargetPath;

            CreateSingleImagePaths(relativeSourcePath, tmxFolderPath, storageFolder, out imageSourcePath, out imageTargetPath);
            TiledTSXImporter.CopyImages(new string[] { imageSourcePath }, new string[] { imageTargetPath });
            if (File.Exists(imageTargetPath))
            {
                TextureImporter ti = AssetImporter.GetAtPath(imageTargetPath) as TextureImporter;

                TextureImporterSettings textureSettings = new TextureImporterSettings();
                ti.ReadTextureSettings(textureSettings);

                SpriteMeshType  meshType   = SpriteMeshType.FullRect;
                SpriteAlignment alignment  = SpriteAlignment.TopLeft;
                FilterMode      filterMode = FilterMode.Point;

                if (textureSettings.spritePixelsPerUnit != pixelsPerUnit ||
                    textureSettings.spriteMeshType != meshType ||
                    textureSettings.spriteAlignment != (int)alignment ||
                    textureSettings.filterMode != filterMode)
                {
                    textureSettings.spritePixelsPerUnit = pixelsPerUnit;
                    textureSettings.spriteMeshType      = meshType;
                    textureSettings.spriteAlignment     = (int)alignment;
                    textureSettings.filterMode          = filterMode;
                    ti.SetTextureSettings(textureSettings);

                    EditorUtility.SetDirty(ti);
                    ti.SaveAndReimport();
                }
                Sprite newSprite = AssetDatabase.LoadAssetAtPath <Sprite> (imageTargetPath);
                Debug.Assert(newSprite != null);
                return(newSprite);
            }
            else
            {
                return(null);
            }
        }
Example #4
0
        public static ImportedTileset ImportFromTilesetReference(TMX.TilesetReference tilesetReference, string baseFolder, string tilesetDir, int cellWidth, int cellHeight, int pixelsPerUnit)
        {
            // The source path in the tileset reference is recorded relative to the tmx
            TSX.Tileset    actualTileset;
            ImportedTile[] importedTiles;
            if (tilesetReference.source != null)
            {
                string tsxPath = Path.Combine(baseFolder, tilesetReference.source);
                importedTiles = TiledTSXImporter.ImportTSXFile(tsxPath, tilesetDir, cellWidth, cellHeight, pixelsPerUnit, out actualTileset);
            }
            else
            {
                importedTiles = TiledTSXImporter.ImportEmbeddedTileset(tilesetReference, tilesetDir, baseFolder, cellWidth, cellHeight, pixelsPerUnit, out actualTileset);
            }

            if (importedTiles == null || (importedTiles.Length > 0 && importedTiles[0] == null))
            {
                Debug.LogError("Failed to import tileset " + (tilesetReference.source != null ? tilesetReference.source : tilesetReference.name) + " properly...");
                return(null);
            }

            return(new ImportedTileset(importedTiles, tilesetReference.firstgid, actualTileset));
        }
Example #5
0
        /* Entry point into this class */
        public static bool ImportTMXFile(string path, string inTilesetDir, Grid targetGrid, string inImageLayerSpriteDir, bool setHiddenLayersToInactive)
        {
            s_tmxParentFolder = Path.GetDirectoryName(path);
            string filename = Path.GetFileNameWithoutExtension(path);

            s_imageLayerSpriteDir       = inImageLayerSpriteDir;
            s_tilesetDir                = inTilesetDir;
            s_orderInLayer              = 0;
            s_setHiddenLayersToInactive = setHiddenLayersToInactive;

            s_map = ImportUtils.ReadXMLIntoObject <TMX.Map>(path);
            if (s_map == null)
            {
                return(false);
            }
            if (s_map.backgroundcolor != null)
            {
                Color backgroundColor;
                if (ColorUtility.TryParseHtmlString(s_map.backgroundcolor, out backgroundColor))
                {
                    Camera.main.backgroundColor = backgroundColor;
                }
            }
            if (s_map.tilesets != null)
            {
                // First we need to load (or import) all the tilesets referenced by the TMX file...
                s_cellWidth        = s_map.tilewidth;
                s_cellHeight       = s_map.tileheight;
                s_pixelsPerUnit    = Mathf.Max(s_map.tilewidth, s_map.tileheight);
                s_importedTilesets = new ImportedTileset[s_map.tilesets.Length];
                for (int i = 0; i < s_map.tilesets.Length; i++)
                {
                    s_importedTilesets[i] = TiledTSXImporter.ImportFromTilesetReference(s_map.tilesets[i], s_tmxParentFolder, s_tilesetDir, s_cellWidth, s_cellHeight, s_pixelsPerUnit);
                    if (s_importedTilesets[i] == null || s_importedTilesets[i].tiles == null || s_importedTilesets[i].tiles[0] == null)
                    {
                        Debug.LogError("Imported tileset is incomplete");
                        return(false);
                    }
                }


                // Set up the Grid to store everything in
                s_gridGO = PrepareGrid(filename, targetGrid);

                s_importOperations = ImportUtils.GetObjectsThatImplementInterface <ITilemapImportOperation>();
                s_sortOrder        = TilemapRenderer.SortOrder.TopLeft;
                if (s_map.renderorder != null)
                {
                    if (s_map.renderorder.Equals("right-down"))
                    {
                        s_sortOrder = TilemapRenderer.SortOrder.TopLeft;
                    }
                    else if (s_map.renderorder.Equals("right-up"))
                    {
                        s_sortOrder = TilemapRenderer.SortOrder.BottomLeft;
                    }
                    else if (s_map.renderorder.Equals("left-down"))
                    {
                        s_sortOrder = TilemapRenderer.SortOrder.TopRight;
                    }
                    else if (s_map.renderorder.Equals("left-up"))
                    {
                        s_sortOrder = TilemapRenderer.SortOrder.BottomRight;
                    }
                }
                // Unity's isometric rendering only works well with TopRight sortorder
                if (s_map.orientation == "isometric")
                {
                    s_sortOrder = TilemapRenderer.SortOrder.TopRight;
                }

                // Unity hex grid only supports even stagger index, so we need a workaround to compensate
                TileLayerImporter.s_needsHexOddToEvenConversion = s_map.orientation == "hexagonal" && s_map.staggerindex == "odd";
                // Unity's isometric rendering is 90 degrees rotated anti-clockwise on the grid compared to Tiled,
                // so we need to rotate the grid clockwise 90 degrees to look correct in Unity
                TileLayerImporter.s_needsGridRotationToMatchUnityIsometric = s_map.orientation == "isometric";

                ObjectLayerImporter.s_importedTemplates = new Dictionary <string, ImportedTemplate>();

                bool loadedLayers = false;
                if (s_map.topLevelLayers != null)
                {
                    loadedLayers = TreatLayers(s_gridGO, s_map.topLevelLayers);
                }
                else
                {
                    loadedLayers = true;
                }

                // Handle the complete map's properties
                if (loadedLayers)
                {
                    HandleCustomProperties(s_gridGO, s_map.properties);
                }
            }

            return(true);
        }
Example #6
0
        static void CreatePalette(string tilesetName, string tilesetTileTargetDir, ImportedTile[] tileAssets, bool singleImageTileset, int tileWidth, int tileHeight, int columns, int cellWidth, int cellHeight)
        {
            GameObject newPaletteGO = new GameObject(tilesetName, typeof(Grid));

            newPaletteGO.GetComponent <Grid>().cellSize = new Vector3(1.0f, 1.0f, 0.0f);
            GameObject paletteTilemapGO = new GameObject("Layer1", typeof(Tilemap), typeof(TilemapRenderer));

            paletteTilemapGO.transform.SetParent(newPaletteGO.transform);

            paletteTilemapGO.GetComponent <TilemapRenderer>().enabled = false;

            Tilemap paletteTilemap = paletteTilemapGO.GetComponent <Tilemap>();

            paletteTilemap.tileAnchor = TiledTSXImporter.GetPivot(tileWidth, tileHeight, cellWidth, cellHeight);
            if (columns <= 0)
            {
                columns = 5;
            }

            if (singleImageTileset)
            {
                for (int i = 0; i < tileAssets.Length; i++)
                {
                    Sprite sprite = tileAssets[i].tile.sprite;
                    Rect   rect   = sprite.rect;
                    int    x      = (int)rect.x / tileWidth;
                    int    y      = (int)rect.y / tileHeight;
                    paletteTilemap.SetTile(new Vector3Int(x, y, 0), tileAssets[i].tile);
                }
            }
            else
            {
                int x = 0;
                int y = 0;
                for (int i = 0; i < tileAssets.Length; i++)
                {
                    paletteTilemap.SetTile(new Vector3Int(x, y, 0), tileAssets[i].tile);
                    x++;
                    if (x >= columns)
                    {
                        x = 0;
                        y--;
                    }
                }
            }
            string palettePath = tilesetTileTargetDir + Path.DirectorySeparatorChar + tilesetName + ".prefab";

            palettePath = palettePath.Replace('\\', '/');

            bool       createdPrefab = false;
            GameObject newPrefab     = PrefabUtility.SaveAsPrefabAsset(newPaletteGO, palettePath, out createdPrefab);

            Debug.Log("Created tile palette asset = " + createdPrefab);

            AssetDatabase.SaveAssets();

            UnityEngine.GameObject.DestroyImmediate(newPaletteGO);

            // Clear out any old subassets
            UnityEngine.Object[] assets = AssetDatabase.LoadAllAssetsAtPath(palettePath);
            for (int i = 0; i < assets.Length; i++)
            {
                UnityEngine.Object asset = assets[i];
                if (!AssetDatabase.IsMainAsset(asset) && asset is GridPalette)
                {
                    UnityEngine.Object.DestroyImmediate(asset, true);
                }
            }

            GridPalette gridPalette = ScriptableObject.CreateInstance <GridPalette>();

            gridPalette.cellSizing = GridPalette.CellSizing.Automatic;
            gridPalette.name       = "Palette Settings";
            AssetDatabase.AddObjectToAsset(gridPalette, newPrefab);
            AssetDatabase.SaveAssets();
        }
Example #7
0
        public static bool ImportTMXFile(string path, string tilesetDir, Grid targetGrid)
        {
            string tmxParentFolder = Path.GetDirectoryName(path);
            string filename        = Path.GetFileNameWithoutExtension(path);

            TMX.Map map = ImportUtils.ReadXMLIntoObject <TMX.Map>(path);
            if (map == null)
            {
                return(false);
            }
            if (map.backgroundcolor != null)
            {
                Color backgroundColor;
                if (ColorUtility.TryParseHtmlString(map.backgroundcolor, out backgroundColor))
                {
                    Camera.main.backgroundColor = backgroundColor;
                }
            }
            if (map.tilesets != null)
            {
                // First we need to load (or import) all the tilesets referenced by the TMX file...
                int cellWidth     = map.tilewidth;
                int cellHeight    = map.tileheight;
                int pixelsPerUnit = Mathf.Max(map.tilewidth, map.tileheight);
                ImportedTileset[] importedTilesets = new ImportedTileset[map.tilesets.Length];
                for (int i = 0; i < map.tilesets.Length; i++)
                {
                    importedTilesets[i] = TiledTSXImporter.ImportFromTilesetReference(map.tilesets[i], tmxParentFolder, tilesetDir, cellWidth, cellHeight, pixelsPerUnit);
                    if (importedTilesets[i] == null || importedTilesets[i].tiles == null || importedTilesets[i].tiles[0] == null)
                    {
                        Debug.LogError("Imported tileset is incomplete");
                        return(false);
                    }
                }


                // Set up the Grid to store everything in
                GameObject newGrid = null;
                if (targetGrid != null)
                {
                    newGrid = targetGrid.gameObject;
                    for (int i = newGrid.transform.childCount - 1; i >= 0; --i)
                    {
                        Undo.DestroyObjectImmediate(newGrid.transform.GetChild(i).gameObject);
                    }
                }
                else
                {
                    newGrid = new GameObject(filename, typeof(Grid));
                    newGrid.GetComponent <Grid>().cellSize = new Vector3(1.0f, 1.0f, 0.0f);
                    Undo.RegisterCreatedObjectUndo(newGrid, "Import map to new Grid");
                }

                ITilemapImportOperation[] importOperations = ImportUtils.GetObjectsThatImplementInterface <ITilemapImportOperation>();
                TilemapRenderer.SortOrder sortOrder        = TilemapRenderer.SortOrder.TopLeft;
                if (map.renderorder.Equals("right-down"))
                {
                    sortOrder = TilemapRenderer.SortOrder.TopLeft;
                }
                else if (map.renderorder.Equals("right-up"))
                {
                    sortOrder = TilemapRenderer.SortOrder.BottomLeft;
                }
                else if (map.renderorder.Equals("left-down"))
                {
                    sortOrder = TilemapRenderer.SortOrder.TopRight;
                }
                else if (map.renderorder.Equals("left-up"))
                {
                    sortOrder = TilemapRenderer.SortOrder.BottomRight;
                }
                // Load all the tile layers
                if (map.layers != null)
                {
                    for (int i = 0; i < map.layers.Length; i++)
                    {
                        TMX.Layer layer = map.layers[i];

                        bool success = ImportTileLayer(layer, newGrid, i, importedTilesets, importOperations, sortOrder, cellWidth, cellHeight, map.infinite);
                        if (!success)
                        {
                            return(false);
                        }
                    }
                }

                Dictionary <string, ImportedTemplate> importedTemplates = new Dictionary <string, ImportedTemplate>();

                // Load all the objects
                if (map.objectgroups != null)
                {
                    for (int g = 0; g < map.objectgroups.Length; g++)
                    {
                        TMX.ObjectGroup objectGroup = map.objectgroups[g];

                        if (objectGroup != null && objectGroup.objects != null && objectGroup.objects.Length > 0)
                        {
                            GameObject newObjectLayer = new GameObject(objectGroup.name);
                            newObjectLayer.transform.SetParent(newGrid.transform, false);
                            Undo.RegisterCreatedObjectUndo(newObjectLayer, "Import object layer");

                            int sortingLayer = (map.layers == null ? 0 : map.layers.Length) + g;

                            for (int i = 0; i < objectGroup.objects.Length; i++)
                            {
                                TMX.Object mapObject = objectGroup.objects[i];

                                bool success = ImportMapObject(mapObject, importedTilesets, importedTemplates, newObjectLayer, map.tilewidth, map.tileheight, sortingLayer, importOperations, tilesetDir, cellWidth, cellHeight, pixelsPerUnit, tmxParentFolder);
                                if (!success)
                                {
                                    return(false);
                                }
                            }
                            Color objectColour = new Color(1.0f, 1.0f, 1.0f, 1.0f);
                            if (objectGroup.color != null)
                            {
                                ColorUtility.TryParseHtmlString(objectGroup.color, out objectColour);
                            }
                            if (objectGroup.opacity != 1.0f)
                            {
                                objectColour.a = objectGroup.opacity;
                            }
                            SpriteRenderer[] renderers = newObjectLayer.GetComponentsInChildren <SpriteRenderer>();
                            foreach (SpriteRenderer r in renderers)
                            {
                                r.color = objectColour;
                            }
                            if (!objectGroup.visible)
                            {
                                foreach (SpriteRenderer r in renderers)
                                {
                                    r.enabled = false;
                                }
                            }

                            IDictionary <string, string> properties = (objectGroup.properties == null ? new Dictionary <string, string>() : objectGroup.properties.ToDictionary());

                            foreach (ITilemapImportOperation operation in importOperations)
                            {
                                operation.HandleCustomProperties(newObjectLayer, properties);
                            }
                        }
                    }
                }
            }

            return(true);
        }