GameObject SaveCurrentGameObject()
        {
            string targetFolder = EditorUtility.OpenFolderPanel("Save Floortile", lastFolder, "");

            targetFolder = SpriteTileGenerator.EnsureAssetDataPath(targetFolder);
            lastFolder   = targetFolder;
            //SpriteTileGenerator.PrefabFromSprite(floorSprite, targetFolder);
            var  mat = SpriteTileGenerator.MaterialFromTex(targetSprite.texture, targetFolder);
            Mesh mesh;

            switch (tileType)
            {
            case TileType.Block:
                mesh = CreateBlockMesh(targetSprite, additionalSprite_top);
                break;

            case TileType.ThinWall:
                mesh = SpriteTileGenerator.CreateMeshFromSprite(targetSprite);
                TransformMesh(mesh, Quaternion.Euler(270f, 90f, 90f), Vector3.up * 0.5f);
                break;

            case TileType.Slope:
                mesh = CreateSlopeMesh(targetSprite, additionalSprite_side, additionalSprite_top, height);
                break;

            default:
                mesh = SpriteTileGenerator.CreateMeshFromSprite(targetSprite);
                break;
            }
            return(SaveGameobject(mesh, mat, targetFolder, tileName));
        }
        void CreatePreviewObject(Sprite sprite, TileType type)
        {
            if (previewGO)
            {
                DestroyImmediate(previewGO);
            }
            if (GraphicsSettings.renderPipelineAsset)
            {
                previewMat = new Material(GraphicsSettings.renderPipelineAsset.defaultMaterial.shader);
            }
            else
            {
                previewMat = new Material(Shader.Find("Standard"));
            }
            previewMat.mainTexture = sprite.texture;
            previewMat.EnableKeyword("_ALPHATEST_ON");
            Mesh previewMesh;

            switch (type)
            {
            case TileType.Floor:
                previewMesh = SpriteTileGenerator.CreateMeshFromSprite(sprite);
                break;

            case TileType.ThinWall:
                previewMesh = SpriteTileGenerator.CreateMeshFromSprite(sprite);
                TransformMesh(previewMesh, Quaternion.Euler(270f, 90f, 90f), Vector3.up * 0.5f);
                break;

            case TileType.Block:
                previewMesh = CreateBlockMesh(sprite, additionalSprite_top);
                break;

            case TileType.Slope:
                previewMesh = CreateSlopeMesh(sprite, additionalSprite_side, additionalSprite_top, height);
                break;

            case TileType.Extrude:
                previewMesh = CreateExtrudeMesh(sprite, height);
                break;

            default:
                previewMesh = SpriteTileGenerator.CreateMeshFromSprite(sprite);
                break;
            }
            previewGO = new GameObject(tileName, typeof(MeshFilter), typeof(MeshRenderer));
            previewGO.GetComponent <MeshFilter>().mesh       = previewMesh;
            previewGO.GetComponent <MeshRenderer>().material = previewMat;
            previewGO.hideFlags = HideFlags.HideAndDontSave;
            //return previewGO;
        }
        static Mesh CreateSlopeMesh(Sprite sprite, Sprite sideSprite, Sprite backSprite, float height)
        {
            //
            Mesh main = SpriteTileGenerator.CreateMeshFromSprite(sprite);

            Vector3[] verts = main.vertices;
            for (int i = 0; i <= 1; i++)
            {
                verts[i] += Vector3.up * height;
            }
            main.SetVertices(verts);
            main.RecalculateNormals();
            main.RecalculateTangents();

            if (sideSprite)
            {
                Mesh[] partials = new Mesh[4]; // two quads, two tris
                partials[0] = main;
                partials[1] = CreatePartialQuad(backSprite ?? sideSprite, height);
                TransformMesh(partials[1],
                              Quaternion.Euler(270f, 90f, 90f),
                              new Vector3(0f, 0.5f, 0.5f));

                partials[2] = CreatePartialTris(sideSprite, height);
                TransformMesh(partials[2],
                              Quaternion.Euler(90f, 90f, 0f),
                              new Vector3(0.5f, 0.5f, 0f));

                partials[3] = CreatePartialTris(sideSprite, height);
                TransformMesh(partials[3],
                              Quaternion.Euler(90f, 90f, 0f),
                              new Vector3(-0.5f, 0.5f, 0f));

                partials[3].triangles = new int[] { partials[3].triangles[2], partials[3].triangles[1], partials[3].triangles[0] };

                return(MeshCombine.CombineMeshes(partials));
            }
            else
            {
                return(main);
            }
            //return CreatePartialQuad(sprite, height);
        }
 static Mesh CreateBlockMesh(Sprite sprite, Sprite topSprite)
 {
     Mesh[] partials = new Mesh[5];
     for (int i = 0; i <= 3; i++)
     {
         partials[i] = SpriteTileGenerator.CreateMeshFromSprite(sprite);
         TransformMesh(partials[i],
                       Quaternion.Euler(270f, 90f + 90f * i, 90f),
                       Vector3.up * 0.5f
                       + Quaternion.Euler(0f, 90f * i, 0f).normalized *Vector3.forward * 0.5f);
     }
     if (topSprite)
     {
         partials[4] = SpriteTileGenerator.CreateMeshFromSprite(topSprite);
         TransformMesh(partials[4],
                       Quaternion.Euler(0f, 0f, 0f),
                       Vector3.up * 1f);
     }
     return(MeshCombine.CombineMeshes(partials));
 }