public static void Pack()
        {
            Init();
            AtlasPackerHelper.ReApplyAllSprites();
            CreateAtlasSpriteHolder();
            Packer.RebuildAtlasCacheIfNeeded(EditorUserBuildSettings.activeBuildTarget, true, Packer.Execution.ForceRegroup);

            EditorUtility.ClearProgressBar();
        }
        static void Read()
        {
            AtlasPackerHelper.Init();
            if (AtlasPackerHelper.list == null)
            {
                AtlasPackerHelper.list = new AtlasTextureFormatList();
            }
            var dirs = Directory.GetDirectories(PathConfig.localFullPath2);

            for (int i = 0; i < dirs.Length; ++i)
            {
                dirs[i] = dirs[i].Replace('\\', '/');
                dirs[i] = dirs[i].Substring(dirs[i].LastIndexOf('/') + 1);
            }
            if (AtlasPackerHelper.list.list != null)
            {
                foreach (var item in AtlasPackerHelper.list.list)
                {
                    if (dirs.First(t => t == item.atlasName) == null)
                    {
                        AtlasPackerHelper.list.dict.Remove(item.atlasName);
                    }
                }
            }

            Save();
            foreach (var dir in dirs)
            {
                if (AtlasPackerHelper.list.dict.ContainsKey(dir))
                {
                    continue;
                }
                var item = new AtlasTextureFormatItem();
                item.atlasName = dir;
                item.iosFormat = item.androidFormat = item.standaloneFormat = TextureImporterFormat.RGBA32.ToString();
                AtlasPackerHelper.list.dict.Add(dir, item);
            }
        }
        private static void CreateAtlasSpriteHolder()
        {
            string path = Application.dataPath + PathConfig.localPath;

            string[] directories = Directory.GetDirectories(path);
            Array.Sort(directories);
            System.Collections.Generic.List <string> spriteList = new System.Collections.Generic.List <string>();
            List <string> atlasNames = new List <string>();
            Dictionary <string, string> spriteNameSet = new Dictionary <string, string>();

            for (int i = 0; i < directories.Length; i++)
            {
                EditorUtility.DisplayProgressBar("打包图集", "打包中...", 1f * i / directories.Length);

                string directoryPath = directories[i];
                directoryPath = directoryPath.Replace("\\", "/");
                string       directory    = directoryPath.Substring(directoryPath.LastIndexOf('/'));
                string       AtlasName    = Path.GetFileName(directoryPath);
                string[]     files        = Directory.GetFiles(directoryPath, "*.png");
                GameObject   holder       = new GameObject(AtlasName);
                SpriteHolder spriteHolder = holder.AddComponent <SpriteHolder>();
                spriteHolder.allSprites = new Sprite[files.Length];
                var          oldGo     = AssetDatabase.LoadAssetAtPath <GameObject>(PathConfig.atlasPath + AtlasName + ".prefab");
                SpriteHolder oldHolder = null;
                if (oldGo != null)
                {
                    oldHolder = oldGo.GetComponent <SpriteHolder>();
                }
                Array.Sort(files);
                spriteHolder.atlasName = AtlasName;
                atlasNames.Add(AtlasName);
                for (int k = 0; k < files.Length; k++)
                {
                    string filePath = files[k];
                    filePath = filePath.Replace('\\', '/');
                    int    start    = filePath.LastIndexOf(directory + '/') + 1;
                    string fileName = filePath.Substring(start);
                    //AssetDatabase.ImportAsset(PathConfig.localFullPath + fileName);

                    var assetImporter = AssetImporter.GetAtPath(PathConfig.localFullPath + fileName) as TextureImporter;
                    var packingTag    = AtlasPackerHelper.GetPackingTag(AtlasName);

                    if (assetImporter != null && assetImporter.spritePackingTag != packingTag)
                    {
                        assetImporter.spritePackingTag = packingTag;
                        AtlasPackerHelper.ApplyTexture(assetImporter, AtlasName);
                        assetImporter.SaveAndReimport();
                    }

                    UnityEngine.Object[] objects = AssetDatabase.LoadAllAssetsAtPath(PathConfig.localFullPath + fileName);
                    foreach (var obj in objects)
                    {
                        var sprite = obj as Sprite;
                        if (sprite == null)
                        {
                            if (!(obj is Texture2D))
                            {
                                Debug.LogError(fileName + "is null");
                            }
                            continue;
                        }
                        var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(sprite));
                        spriteHolder.allSprites[k] = sprite;
                        start = fileName.LastIndexOf("/") + 1;
                        //fileName = sprite.name;// fileName.Substring(start, fileName.Length - start - ".png".Length);
                        if (spriteNameSet.ContainsKey(sprite.name))
                        {
                            Debug.LogErrorFormat("Sprite Name \"{0}\" Conflict in Atlas \"{1}\" and \"{2}\"", sprite.name, spriteNameSet[sprite.name], AtlasName);
                        }
                        else
                        {
                            spriteNameSet.Add(sprite.name, AtlasName);
                        }
                        spriteList.Add(guid + "." + sprite.name + "." + AtlasName);
                    }
                }
                bool changed = !(oldHolder != null && oldHolder.allSprites != null && oldHolder.allSprites.Length == spriteHolder.allSprites.Length && oldHolder.atlasName == spriteHolder.atlasName);
                if (!changed)
                {
                    for (int j = 0; j < oldHolder.allSprites.Length; ++j)
                    {
                        if (oldHolder.allSprites[j] != spriteHolder.allSprites[j])
                        {
                            changed = true;
                            break;
                        }
                    }
                }
                if (changed)
                {
                    PrefabUtility.CreatePrefab(PathConfig.atlasPath + AtlasName + ".prefab", holder);
                }
                DestroyImmediate(holder);
            }

            EditorUtility.DisplayProgressBar("打包图集", "打包中...", 1);

            GameObject         go            = new GameObject("SpritePath");
            TexturePathsHolder textureHolder = go.AddComponent <TexturePathsHolder>();

            textureHolder.files = new string[spriteList.Count];
            textureHolder.paths = new string[directories.Length];
            for (int i = 0; i < directories.Length; i++)
            {
                var holderName = directories[i].Substring(directories[i].IndexOf("ResourcesUI/") + "ResourcesUI/".Length);
                textureHolder.paths[i] = "Atlas/" + holderName;
            }
            for (int i = 0; i < spriteList.Count; ++i)
            {
                textureHolder.files[i] = spriteList[i];
            }
            var oldPaths = AssetDatabase.LoadAssetAtPath <GameObject>(PathConfig.atlasPath + "SpritePath" + ".prefab");
            TexturePathsHolder oldPathsHolder = null;

            if (oldPaths != null)
            {
                oldPathsHolder = oldPaths.GetComponent <TexturePathsHolder>();
            }
            bool pathChanged = oldPathsHolder == null ||
                               oldPathsHolder.files == null || oldPathsHolder.files.Length != textureHolder.files.Length ||
                               oldPathsHolder.paths == null || oldPathsHolder.paths.Length != textureHolder.paths.Length;

            if (!pathChanged)
            {
                for (int j = 0; j < oldPathsHolder.files.Length; ++j)
                {
                    if (oldPathsHolder.files[j] != textureHolder.files[j])
                    {
                        pathChanged = true;
                        break;
                    }
                }

                for (int i = 0; i < oldPathsHolder.paths.Length; i++)
                {
                    if (oldPathsHolder.paths[i] != textureHolder.paths[i])
                    {
                        pathChanged = true;
                        break;
                    }
                }
            }
            if (pathChanged)
            {
                PrefabUtility.CreatePrefab(PathConfig.atlasPath + "SpritePath" + ".prefab", go);
            }
            DestroyImmediate(go);
            AssetDatabase.SaveAssets();
            // Hotfire.SpriteProxy.instance.InitForEditor();
        }
 static void Save()
 {
     AtlasPackerHelper.list.list = AtlasPackerHelper.list.dict.Values.ToListFromPool();
     File.WriteAllText(AtlasPackerHelper.ATLAS_TEXTURE_FORMAT_CONFIG_PATH, JsonUtility.ToJson(AtlasPackerHelper.list));
     AtlasPackerHelper.Init();
 }