static void Main()
        {
            var args = Environment.GetCommandLineArgs();

            if (args.Length > 1)
            {
                var cmd    = args[1];
                var abPath = "";
                switch (cmd)
                {
                case "--list":
                    if (args.Length > 2)
                    {
                        abPath           = args[2];
                        enableDebugPrint = false;
                        UnityStudio.LoadBundleFile(abPath, false, "");
                        return;
                    }
                    break;

                case "--dump":
                    /*
                     *  Extract files inside assetbundle file to savePath.
                     */
                    var savePath = "";
                    if (args.Length > 2)
                    {
                        abPath = args[2];
                        if (args.Length > 3)
                        {
                            savePath = args[3];
                        }
                        UnityStudio.LoadBundleFile(abPath, true, savePath);
                        return;
                    }
                    break;

                default:
                    break;
                }
            }
            Console.WriteLine("Unrecognized command:");
            for (int i = 0; i < args.Length; i++)
            {
                Console.WriteLine("CMD[" + i + "]=" + args[i].ToString());
            }
        }
        public static void ExportAllSpriteMetas()
        {
            OpenFolderDialog openFolderDialog = new OpenFolderDialog();

            if (openFolderDialog.ShowDialog(System.Windows.Forms.Form.ActiveForm) != System.Windows.Forms.DialogResult.OK)
            {
                return;
            }
            string FolderPath = openFolderDialog.Folder.Replace("/", "\\");

            FolderPath = FolderPath.EndsWith("\\") ? FolderPath : (FolderPath + "\\");

            foreach (AssetPreloadData Texture in Sprites.Keys)
            {
                string SpriteMeta = MetaTable;
                SpriteMeta = SpriteMeta.Replace("{guid}", Guid.NewGuid().ToString());
                SpriteMeta = SpriteMeta.Replace("{timeCreated}", (DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds.ToString());

                List <Sprite> ReferencedSprites = Sprites[Texture];
                SpriteMeta = SpriteMeta.Replace("{spritePixelsToUnits}", ReferencedSprites[0].m_PixelsToUnits.ToString());

                if (ReferencedSprites.Count == 1)
                {
                    continue;
                    SpriteMeta = SpriteMeta.Replace("{spriteMode}", "1");
                    SpriteMeta = SpriteMeta.Replace("{sprites}", "    sprites: []");
                    UnityStudio.ExportTexture2D(Texture, FolderPath, true);
                    File.WriteAllText(FolderPath + Texture.Text + ".png.meta", SpriteMeta);
                    continue;
                }

                SpriteMeta = SpriteMeta.Replace("{spriteMode}", "2");
                StringBuilder spriteReplacement = new StringBuilder();
                spriteReplacement.AppendLine("    sprites:");

                foreach (Sprite sprite in ReferencedSprites)
                {
                    string Table = SpriteTable;
                    Table = Table.Replace("{name}", sprite.m_Name);
                    Table = Table.Replace("{rect_x}", sprite.m_Rect.X.ToString());
                    Table = Table.Replace("{rect_y}", sprite.m_Rect.Y.ToString());
                    Table = Table.Replace("{rect_width}", sprite.m_Rect.Width.ToString());
                    Table = Table.Replace("{rect_height}", sprite.m_Rect.Height.ToString());
                    Table = Table.Replace("{pivot_x}", sprite.m_Pivot.X.ToString());
                    Table = Table.Replace("{pivot_y}", sprite.m_Pivot.Y.ToString());
                    Table = Table.Replace("{border_x}", sprite.m_Border.x.ToString());
                    Table = Table.Replace("{border_y}", sprite.m_Border.y.ToString());
                    Table = Table.Replace("{border_z}", sprite.m_Border.z.ToString());
                    Table = Table.Replace("{border_w}", sprite.m_Border.w.ToString());

                    if (sprite.m_PhysicsShape == null)
                    {
                        Table = Table.Replace("{physicsShape}", "      physicsShape: []");
                    }
                    else
                    {
                        StringBuilder physicsShapeReplacement = new StringBuilder();
                        physicsShapeReplacement.AppendLine("      physicsShape:");
                        for (int i = 0; i < sprite.m_PhysicsShape.GetLength(0); ++i)
                        {
                            for (int j = 0; j < sprite.m_PhysicsShape.GetLength(1); ++j)
                            {
                                string pointReplacement = PhysicsShapeTable;
                                pointReplacement = pointReplacement.Replace("{-}", j == 0 ? "-" : " ");
                                pointReplacement = pointReplacement.Replace("{x}", sprite.m_PhysicsShape[i][j].X.ToString());
                                pointReplacement = pointReplacement.Replace("{y}", sprite.m_PhysicsShape[i][j].Y.ToString());
                                physicsShapeReplacement.AppendLine(pointReplacement);
                            }
                        }
                        Table = Table.Replace("{physicsShape}", physicsShapeReplacement.ToString());
                    }

                    spriteReplacement.AppendLine(Table);
                }

                SpriteMeta = SpriteMeta.Replace("{sprites}", spriteReplacement.ToString());
                UnityStudio.ExportTexture2D(Texture, FolderPath, true);
                File.WriteAllText(FolderPath + Texture.Text + ".png.meta", SpriteMeta);
            }
        }