コード例 #1
0
        static ImportedTile[] ImportEmbeddedTileset(TMX.TilesetReference embeddedTileset, string tilesetDir, string baseFolder, int cellWidth, int cellHeight, int pixelsPerUnit, out TSX.Tileset tilesetOut)
        {
            TSX.Tileset tileset = new TSX.Tileset(embeddedTileset);
            tilesetOut = tileset;

            if (!ImportUtils.CreateAssetFolderIfMissing(tilesetDir, true))
            {
                return(null);
            }

            Debug.Log("Loading embedded tileset = " + tileset.name);

            return(ImportTileset(tileset, tilesetDir, baseFolder, cellWidth, cellHeight, pixelsPerUnit));
        }
コード例 #2
0
        static void CreateSingleImageTilesetPaths(TSX.Tileset tileset, string pathWithoutFile, string tilesetSpriteTargetDir, string tilesetTileTargetDir, out string imageSourcePath, out string imageTargetPath, out string[] tileTargetPaths)
        {
            imageSourcePath = tileset.image.source;
            imageSourcePath = Path.Combine(pathWithoutFile, imageSourcePath);

            string imageName = Path.GetFileName(imageSourcePath);

            imageTargetPath = Path.Combine(tilesetSpriteTargetDir, imageName);

            tileTargetPaths = new string[tileset.tilecount];
            for (int i = 0; i < tileset.tilecount; i++)
            {
                string tileName = Path.GetFileNameWithoutExtension(imageSourcePath) + "_" + i + ".asset";
                tileTargetPaths[i] = Path.Combine(tilesetTileTargetDir, tileName);
            }
        }
コード例 #3
0
        static ImportedTile[] ImportTSXFile(string path, string tilesetDir, int cellWidth, int cellHeight, int pixelsPerUnit, out TSX.Tileset tilesetOut)
        {
            tilesetOut = null;
            if (!ImportUtils.CreateAssetFolderIfMissing(tilesetDir, true))
            {
                return(null);
            }

            Debug.Log("Loading TSX file from " + path + " into " + tilesetDir);

            TSX.Tileset tileset = ImportUtils.ReadXMLIntoObject <TSX.Tileset>(path);
            if (tileset == null)
            {
                return(null);
            }
            tilesetOut = tileset;

            Debug.Log("Loading tileset = " + tileset.name);

            return(ImportTileset(tileset, tilesetDir, Path.GetDirectoryName(path), cellWidth, cellHeight, pixelsPerUnit));
        }
コード例 #4
0
        static ImportedTile[] ImportTileset(TSX.Tileset tileset, string tilesetDir, string sourceTilesetDirectory, int cellWidth, int cellHeight, int pixelsPerUnit)
        {
            string tilesetSpriteTargetDir = tilesetDir + Path.DirectorySeparatorChar + tileset.name;

            if (!ImportUtils.CreateAssetFolderIfMissing(tilesetSpriteTargetDir, false))
            {
                return(null);
            }
            string tilesetTileTargetDir = tilesetDir + Path.DirectorySeparatorChar + tileset.name + Path.DirectorySeparatorChar + "TileAssets";

            if (!ImportUtils.CreateAssetFolderIfMissing(tilesetTileTargetDir, false))
            {
                return(null);
            }

            TSX.Tile[] tiles = tileset.tiles;

            string[] imageTargetPaths   = null;
            Sprite[] tileSprites        = null;
            string[] tileTargetPaths    = null;
            bool     singleImageTileset = tileset.IsSingleImageTileset();

            if (singleImageTileset)
            {
                if (tileset.image != null)
                {
                    string imageSourcePath;
                    string imageTargetPath;
                    CreateSingleImageTilesetPaths(tileset, sourceTilesetDirectory, tilesetSpriteTargetDir, tilesetTileTargetDir, out imageSourcePath, out imageTargetPath, out tileTargetPaths);
                    CopyImages(new string[] { imageSourcePath }, new string[] { imageTargetPath });

                    string subSpriteNameBase = Path.GetFileNameWithoutExtension(imageSourcePath);
                    if (!CreateTilemapSprite(imageTargetPath, cellWidth, cellHeight, pixelsPerUnit, tileset /*tileset.image.width, tileset.image.height, tileset.tilewidth, tileset.tileheight, tileset.tilecount*/, subSpriteNameBase, out tileSprites))
                    {
                        return(null);
                    }
                }
                else
                {
                    Debug.LogError("Tileset " + tileset.name + " is empty!");
                }
            }
            else
            {
                string[] imageSourcePaths = new string[tiles.Length];
                imageTargetPaths = new string[tiles.Length];
                tileTargetPaths  = new string[tiles.Length];
                CreateTilePaths(tiles, sourceTilesetDirectory, tilesetSpriteTargetDir, tilesetTileTargetDir, imageSourcePaths, imageTargetPaths, tileTargetPaths);
                CopyImages(imageSourcePaths, imageTargetPaths);

                tileSprites = new Sprite[tiles.Length];
                CreateSpriteAssets(tiles, tileset.name, pixelsPerUnit, cellWidth, cellHeight, imageTargetPaths, tileSprites);
            }

            if (tileSprites == null)
            {
                Debug.LogError("Tile sprites ended up null when importing tileset: " + tileset.name);
                return(null);
            }
            if (tileSprites.Length == 0)
            {
                Debug.LogError("0 tile sprites found from texture assets for tileset: " + tileset.name);
                return(null);
            }

            ImportedTile[] tileAssets;
            bool           success = CreateTileAssets(tiles, singleImageTileset, tileset.name, pixelsPerUnit, tileSprites, tileTargetPaths, out tileAssets);

            EditorUtility.ClearProgressBar();

            if (!success)
            {
                return(null);
            }

            CreatePalette(tileset.name, tilesetTileTargetDir, tileAssets, singleImageTileset, tileset.tilewidth, tileset.tileheight, tileset.columns, cellWidth, cellHeight);
            return(tileAssets);
        }
コード例 #5
0
        static bool CreateTilemapSprite(string targetPath, int cellWidth, int cellHeight, int pixelsPerUnit, TSX.Tileset tileset /*int width, int height, int tileWidth, int tileHeight, int tileCount*/, string subSpriteNameBase, out Sprite[] tileSprites)
        {
            TextureImporter ti = AssetImporter.GetAtPath(targetPath) as TextureImporter;

            TextureImporterSettings textureSettings = new TextureImporterSettings();

            ti.ReadTextureSettings(textureSettings);

            SpriteMeshType   meshType   = SpriteMeshType.FullRect;
            SpriteAlignment  alignment  = SpriteAlignment.Custom;
            Vector2          pivot      = GetPivot(tileset.image.width, tileset.image.height, cellWidth, cellHeight);
            FilterMode       filterMode = FilterMode.Point;
            SpriteImportMode importMode = SpriteImportMode.Multiple;

            if (textureSettings.spritePixelsPerUnit != pixelsPerUnit ||
                textureSettings.spriteMeshType != meshType ||
                textureSettings.spriteAlignment != (int)alignment ||
                textureSettings.spritePivot != pivot ||
                textureSettings.filterMode != filterMode ||
                textureSettings.spriteMode != (int)importMode)
            {
                textureSettings.spritePixelsPerUnit = pixelsPerUnit;
                textureSettings.spriteMeshType      = meshType;
                textureSettings.spriteAlignment     = (int)alignment;
                textureSettings.spritePivot         = pivot;
                textureSettings.filterMode          = filterMode;
                textureSettings.spriteMode          = (int)importMode;

                ti.SetTextureSettings(textureSettings);

                List <SpriteMetaData> newData = new List <SpriteMetaData>(tileset.tilecount);

                int i = 0;
                for (int y = tileset.image.height - tileset.margin; y > 0; y -= (tileset.tileheight + tileset.spacing))
                {
                    for (int x = tileset.margin; x < tileset.image.width; x += (tileset.tilewidth + tileset.spacing))
                    {
                        SpriteMetaData data = new SpriteMetaData();
                        data.name      = subSpriteNameBase + "_" + i;
                        data.alignment = (int)alignment;
                        data.pivot     = GetPivot(tileset.tilewidth, tileset.tileheight, cellWidth, cellHeight);
                        data.rect      = new Rect(x, y - tileset.tileheight, tileset.tilewidth, tileset.tileheight);

                        newData.Add(data);
                        i++;
                        if (i >= tileset.tilecount)
                        {
                            break;
                        }
                    }
                    if (i >= tileset.tilecount)
                    {
                        break;
                    }
                }

                ti.spritesheet = newData.ToArray();

                EditorUtility.SetDirty(ti);
                ti.SaveAndReimport();
            }

            Sprite[] subSprites = AssetDatabase.LoadAllAssetsAtPath(targetPath).OfType <Sprite>().ToArray();
            // For some reason Unity thinks it's smart to return the sub-sprites in random order...
            // ...and provide no API for retrieving sub-sprites by index >_<
            // so we have to manually sort them by the ids in their names
            Array.Sort <Sprite>(subSprites, new SpriteComparer());
            tileSprites = subSprites;
            return(true);
        }
コード例 #6
0
 public ImportedTileset(ImportedTile[] tilesIn, int firstGIDIn, TSX.Tileset tilesetIn)
 {
     tiles    = tilesIn;
     firstGID = firstGIDIn;
     tileset  = tilesetIn;
 }