public static string ConvertToTexturePackerFormat(string json, Vector2Int gridSize, Vector2Int padding, Vector2Int spacing)
        {
            try
            {
                //Unity cannot deserialize Dictionary, so we converted the dictionary to List using MiniJson
                json = ConvertToUnityJsonFormat(json);
                PreConvertedSpritesheetData        v_preData  = JsonUtility.FromJson <PreConvertedSpritesheetData>(json);
                TexturePackerData.SpriteDataObject v_postData = v_preData.ToTexturePacketDataObject(gridSize, padding, spacing);

                return(JsonUtility.ToJson(v_postData));
            }
            catch (System.Exception p_exception)
            {
                Debug.Log("Failed to convert to EmojiOne\n: " + p_exception);
            }

            return("");
        }
            public virtual TexturePackerData.SpriteDataObject ToTexturePacketDataObject(Vector2Int p_gridSize, Vector2 p_padding, Vector2 p_spacing)
            {
                TexturePackerData.SpriteDataObject v_postData = new TexturePackerData.SpriteDataObject();
                v_postData.frames = new List <TexturePackerData.Frame>();

                if (frames != null)
                {
                    var v_framesToCheck = new List <PreConvertedImgData>();
                    if (frames != null)
                    {
                        foreach (var v_frameToCheck in frames)
                        {
                            v_framesToCheck.Add(v_frameToCheck);
                        }
                    }

                    for (int i = 0; i < v_framesToCheck.Count; i++)
                    {
                        var v_preFrame = v_framesToCheck[i];

                        //Add all variations in list to check (after the current PreFrame)
                        var v_preFrameWithVariants = v_framesToCheck[i] as PreConvertedImgDataWithVariants;
                        if (v_preFrameWithVariants != null && v_preFrameWithVariants.skin_variations != null && v_preFrameWithVariants.skin_variations.Count > 0)
                        {
                            for (int j = v_preFrameWithVariants.skin_variations.Count - 1; j >= 0; j--)
                            {
                                var v_skinVariantFrame = v_preFrameWithVariants.skin_variations[j];
                                if (v_skinVariantFrame != null)
                                {
                                    v_framesToCheck.Insert(i + 1, v_skinVariantFrame);
                                }
                            }
                        }

                        //Create TexturePacker SpriteData
                        var v_postFrame = new TexturePackerData.Frame();

                        v_postFrame.filename   = v_preFrame.image;
                        v_postFrame.rotated    = false;
                        v_postFrame.trimmed    = false;
                        v_postFrame.sourceSize = new TexturePackerData.SpriteSize()
                        {
                            w = p_gridSize.x, h = p_gridSize.y
                        };
                        v_postFrame.spriteSourceSize = new TexturePackerData.SpriteFrame()
                        {
                            x = 0, y = 0, w = p_gridSize.x, h = p_gridSize.y
                        };
                        v_postFrame.frame = new TexturePackerData.SpriteFrame()
                        {
                            x = (v_preFrame.sheet_x * (p_gridSize.x + p_spacing.x)) + p_padding.x,
                            y = (v_preFrame.sheet_y * (p_gridSize.y + p_spacing.y)) + p_padding.y,
                            w = p_gridSize.x,
                            h = p_gridSize.y
                        };
                        v_postFrame.pivot = new Vector2(0f, 0f);

                        v_postData.frames.Add(v_postFrame);
                    }
                }

                return(v_postData);
            }