예제 #1
0
 static void RefreshAtlas(AtlasMonitor monitor)
 {
     if (!dirtyAtlas.Contains(monitor))
     {
         dirtyAtlas.Enqueue(monitor);
     }
     EditorApplication.update -= UpdateAtlas;
     EditorApplication.update += UpdateAtlas;
 }
예제 #2
0
    static void UpdateAtlas()
    {
        if (dirtyAtlas.Count == 0)
        {
            EditorApplication.update -= UpdateAtlas;
            return;
        }

        AtlasMonitor monitor = dirtyAtlas.Dequeue();

        if (monitor != null && monitor.data != null)
        {
            Texture2D[] textures = AssetDatabase.FindAssets("t:Texture2D", new string[] { monitor.path })
                                   .Select(guid => AssetDatabase.GUIDToAssetPath(guid))
                                   .Select(path =>
            {
                Texture2D t2d = AssetDatabase.LoadAssetAtPath <Texture2D>(path);
                var t         = new Texture2D(t2d.width, t2d.height, t2d.format, false);
                Graphics.CopyTexture(t2d, t);
                t.name = t2d.name;
                return(t);
            }).ToArray();

            Texture2D atlas = new Texture2D(2, 2, TextureFormat.ARGB32, false);
            Rect[]    rects = atlas.PackTextures(textures, 0);

            monitor.data.myImageDatas.Clear();
            for (int i = 0; i < textures.Length; i++)
            {
                ImageData data = new ImageData();
                data.name = textures[i].name;
                data.size = new Vector2(textures[i].width, textures[i].height);
                data.uv   = rects[i];
                monitor.data.myImageDatas.Add(data);
            }
            monitor.data.OnAfterDeserialize();

            string atlasPath = AssetDatabase.GetAssetPath(monitor.data);
            atlasPath = Path.ChangeExtension(atlasPath, ".png");
            if (File.Exists(atlasPath))
            {
                File.Delete(atlasPath);
            }
            File.WriteAllBytes(atlasPath, atlas.EncodeToPNG());
            AssetDatabase.Refresh();
            monitor.data.myAtlas       = AssetDatabase.LoadAssetAtPath <Texture2D>(atlasPath);
            monitor.data.myAtlasWidth  = monitor.data.myAtlas.width;
            monitor.data.myAtlasHeight = monitor.data.myAtlas.height;

            EditorUtility.SetDirty(monitor.data);
            AssetDatabase.SaveAssets();

            Debug.Log("更新图集:" + monitor.data.name);
        }
    }