コード例 #1
0
        static public bool AutoBuildAtlasFromListTexture(List <Texture2D> listTexture, List <DataAnimAnalytics> listJsonAnim, TrimType trimType, string texturePath, int pading)
        {
            float prog = 0.0f;

            EditorUtility.DisplayCancelableProgressBar("Collecting Textures", "Process...", prog);
            try
            {
                Dictionary <string, EAPInfoAttachment> dicPivot = new Dictionary <string, EAPInfoAttachment>();
                for (int i = 0; i < listJsonAnim.Count; i++)
                {
                    DataAnimAnalytics dataAnalytic = listJsonAnim[i];
                    foreach (KeyValuePair <string, EAPInfoAttachment> pair in dataAnalytic.jsonFinal.dicPivot)
                    {
                        dicPivot[pair.Value.spriteName] = pair.Value;
                    }
                }

                List <SpriteElement> listSprite = new List <SpriteElement>();
                for (int i = 0; i < listTexture.Count; i++)
                {
                    Object obj = listTexture[i];
                    if (obj is Texture2D)
                    {
                        Texture2D tex = (Texture2D)obj;

                        SpriteElement element = new SpriteElement(tex);
                        if (trimType == TrimType.Trim2nTexture || trimType == TrimType.TrimMinimum)
                        {
                            if (!element.TrimTexture())
                            {
                                element.CloneFromOriginTexture();
                            }
                        }
                        else
                        {
                            element.CloneFromOriginTexture();
                        }
                        foreach (KeyValuePair <string, EAPInfoAttachment> pair in dicPivot)
                        {
                            if (pair.Value.spriteName == tex.name)
                            {
                                //Debug.LogError(pair.Value.spriteName);
                                element.SetPivot(new Vector2(pair.Value.x, pair.Value.y));
                                break;
                            }
                        }
                        listSprite.Add(element);
                        prog = (float)(i + 1) / listTexture.Count;
                        EditorUtility.DisplayCancelableProgressBar("Collecting Textures", "Process...", prog);
                    }
                }
                if (listSprite.Count > 0)
                {
                    bool result = BuildAtlas(trimType, listSprite, dicPivot, texturePath, pading);
                    // GC memory
                    for (int i = 0; i < listSprite.Count; i++)
                    {
                        GameObject.DestroyImmediate(listSprite[i].texture);
                        listSprite[i] = null;
                    }
                    return(result);
                }
                return(false);
            }
            catch (System.Exception ex)
            {
                Debug.LogError("Error:" + ex.Message);
                EditorUtility.ClearProgressBar();
                return(false);
            }
        }
コード例 #2
0
        static public bool UpdateAtlasSpriteInfo(string pathOutput, List <DataAnimAnalytics> listAnim, float scale)
        {
            //Debug.LogError(scale);
            if (listAnim.Count < 1)
            {
                return(false);
            }

            Dictionary <string, EAPInfoAttachment> dicPivotCache = new Dictionary <string, EAPInfoAttachment>();

            for (int i = 0; i < listAnim.Count; i++)
            {
                DataAnimAnalytics dataAnalytic = listAnim[i];
                //Debug.LogError(Pathfinding.Serialization.JsonFx.JsonWriter.Serialize(dataAnalytic.jsonFinal));
                foreach (KeyValuePair <string, EAPInfoAttachment> pair in dataAnalytic.jsonFinal.dicPivot)
                {
                    dicPivotCache[pair.Value.spriteName] = pair.Value;
                }
            }

            Dictionary <string, List <EAPInfoAttachment> > dicPivot = new Dictionary <string, List <EAPInfoAttachment> >();

            for (int i = 0; i < listAnim.Count; i++)
            {
                DataAnimAnalytics dataAnalytic = listAnim[i];
                foreach (KeyValuePair <string, EAPInfoAttachment> pair in dataAnalytic.jsonFinal.dicPivot)
                {
                    List <EAPInfoAttachment> list = null;
                    dicPivot.TryGetValue(pair.Value.spriteName, out list);
                    if (list == null)
                    {
                        list = new List <EAPInfoAttachment>();
                    }
                    bool haveExist = false;
                    for (int x = 0; x < list.Count; x++)
                    {
                        if (list[x].spriteName == pair.Key)
                        {
                            haveExist = true;
                            break;
                        }
                    }
                    if (!haveExist)
                    {
                        list.Add(pair.Value);
                    }
                    dicPivot[pair.Value.spriteName] = list;
                }
            }

            TextureImporter         ti       = AssetImporter.GetAtPath(pathOutput) as TextureImporter;
            TextureImporterSettings settings = new TextureImporterSettings();

            ti.ReadTextureSettings(settings);
            SpriteMetaData[] lstMetaSprite = ti.spritesheet;
            Dictionary <string, SpriteMetaData> dicSpriteMeta = new Dictionary <string, SpriteMetaData>();
            bool haveNew = false;

            for (int i = 0; i < lstMetaSprite.Length; i++)
            {
                SpriteMetaData spriteMetaData = lstMetaSprite[i];
                if (Mathf.Abs(scale - 1f) > Mathf.Epsilon)
                {
                    Rect rect = spriteMetaData.rect;
                    rect.x              = rect.x * scale;
                    rect.y              = rect.y * scale;
                    rect.width          = rect.width * scale;
                    rect.height         = rect.height * scale;
                    spriteMetaData.rect = rect;
                    haveNew             = true;
                }
                dicSpriteMeta[lstMetaSprite[i].name] = spriteMetaData;
            }
            foreach (KeyValuePair <string, List <EAPInfoAttachment> > pair in dicPivot)
            {
                List <EAPInfoAttachment> list = pair.Value;
                for (int i = 0; i < list.Count; i++)
                {
                    if (!dicSpriteMeta.ContainsKey(list[i].spriteName))                   // sprite new
                    {
                        if (dicSpriteMeta.ContainsKey(list[i].spriteName))
                        {
                            SpriteMetaData currentMeta = dicSpriteMeta[list[i].spriteName];
                            SpriteMetaData metaSprite  = new SpriteMetaData();
                            metaSprite.name      = list[i].spriteName;
                            metaSprite.rect      = currentMeta.rect;
                            metaSprite.alignment = currentMeta.alignment;

                            EAPInfoAttachment pivotCache = null;
                            dicPivotCache.TryGetValue(list[i].spriteName, out pivotCache);
                            if (pivotCache == null)
                            {
                                pivotCache = list[i];
                            }
                            //Debug.LogError(pivotCache.name+","+list[i].name+","+pivotCache.name+","+pivotCache.isOptimze);

                            if (!pivotCache.isOptimze)
                            {
                                metaSprite.pivot = new Vector2(list[i].x, list[i].y);                             //currentMeta.pivot;
                            }
                            else
                            {
                                float pivotX  = list[i].x * pivotCache.originalRect.width * scale;
                                float pivotY  = list[i].y * pivotCache.originalRect.height * scale;
                                float oWidth  = pivotCache.optimizeRect.width * scale;
                                float oHeight = pivotCache.optimizeRect.height * scale;
                                if (oWidth < 1)
                                {
                                    oWidth = 1;
                                }
                                if (oHeight < 1)
                                {
                                    oHeight = 1;
                                }
                                pivotX           = pivotX - pivotCache.startX * scale;
                                pivotY           = pivotY - pivotCache.startY * scale;
                                pivotX           = pivotX / oWidth;
                                pivotY           = pivotY / oHeight;
                                metaSprite.pivot = new Vector2(pivotX, pivotY);
                            }
                            dicSpriteMeta[metaSprite.name] = metaSprite;
                            haveNew = true;
                        }
                    }
                }
            }
            if (haveNew)
            {
                Texture2D mainTexture = AssetDatabase.LoadAssetAtPath(pathOutput, typeof(Texture2D)) as Texture2D;
                lstMetaSprite = new SpriteMetaData[dicSpriteMeta.Count];
                int count = 0;
                foreach (KeyValuePair <string, SpriteMetaData> pair in dicSpriteMeta)
                {
                    lstMetaSprite[count] = pair.Value;
                    count++;
                }
                ti.isReadable                = true;
                ti.mipmapEnabled             = false;
                ti.spritesheet               = lstMetaSprite;
                ti.textureType               = TextureImporterType.Sprite;
                ti.spriteImportMode          = SpriteImportMode.Multiple;
                ti.spritePixelsPerUnit       = 100;
                settings.textureFormat       = TextureImporterFormat.ARGB32;
                settings.npotScale           = TextureImporterNPOTScale.None;
                settings.alphaIsTransparency = true;
                ti.SetTextureSettings(settings);
                ti.maxTextureSize   = 4096;
                ti.mipmapEnabled    = false;
                ti.spriteImportMode = SpriteImportMode.Multiple;
                AssetDatabase.ImportAsset(pathOutput);
                EditorUtility.SetDirty(mainTexture);
                AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                AssetDatabase.ImportAsset(pathOutput);
            }
            return(true);
        }