コード例 #1
0
 public void CloneFromOriginTexture()
 {
     if (this.needSetAuthority)
     {
         ImportTextureUtil.MaxImportSettings(texture);
         ImportTextureUtil.ReadAndUnScale(texture);
         Texture2D text2 = new Texture2D(texture.width, texture.height);
         text2.SetPixels(texture.GetPixels(0, 0, texture.width, texture.height));
         text2.Apply();
         this.texture = text2;
     }
 }
コード例 #2
0
 /*public SpriteElement(SpriteRawData spriteRaw,TrimType trimType)
  * {
  *      Rect rect=spriteRaw.sprite.rect;
  *      if(rect.width<1)
  *      {
  *              rect.width=1;
  *      }
  *      if(rect.height<1)
  *      {
  *              rect.height=1;
  *      }
  *      this.texture=new Texture2D((int)rect.width,(int)rect.height);
  *
  *      texture.SetPixels(spriteRaw.sprite.texture.GetPixels((int)rect.x,(int)rect.y,(int)rect.width,(int)rect.height));
  *      texture.Apply();
  *      this.name=spriteRaw.name;
  *      this.originalRect=new IntRect(0,0,(int)rect.width,(int)rect.height);
  *      this.optimizeRect=new IntRect(0,0,(int)rect.width,(int)rect.height);
  *      this.isOptimize=false;
  *      this.startX=0;
  *      this.startY=0;
  *      this.alignment=spriteRaw.alignment;
  *      this.pivot=spriteRaw.pivot;
  *      if(trimType==TrimType.Trim2nTexture||trimType==TrimType.TrimMinimum)
  *      {
  *              TrimTexture(true);
  *      }
  * }*/
 public SpriteElement(Texture2D _texture, bool _needSetAuthority = true)
 {
     this.needSetAuthority = _needSetAuthority;
     if (this.needSetAuthority)
     {
         ImportTextureUtil.MaxImportSettings(_texture);
     }
     this.texture      = _texture;
     this.name         = texture.name;
     this.originalRect = new IntRect(0, 0, texture.width, texture.height);
     this.optimizeRect = new IntRect(0, 0, texture.width, texture.height);
     this.isOptimize   = false;
     this.startX       = 0;
     this.startY       = 0;
     this.alignment    = 0;                       // o giua
     this.pivot        = new Vector2(0.5f, 0.5f); //default
     if (this.needSetAuthority)
     {
         string          path = AssetDatabase.GetAssetPath(texture);
         TextureImporter ti   = AssetImporter.GetAtPath(path) as TextureImporter;
         if (ti.textureType == TextureImporterType.Sprite)
         {
             if (ti.spriteImportMode == SpriteImportMode.Single)
             {
                 this.pivot     = ti.spritePivot;
                 this.alignment = ImportTextureUtil.GetAlignment(this.pivot);
             }
             else
             {
                 if (ti.spritesheet != null && ti.spritesheet.Length > 0)
                 {
                     this.alignment = ti.spritesheet[0].alignment;
                     this.pivot     = ti.spritesheet[0].pivot;
                 }
             }
         }
     }
 }
コード例 #3
0
        static public bool BuildAtlas(TrimType trimType, List <SpriteElement> listSprite, Dictionary <string, EAPInfoAttachment> dicPivot, string texturePath, int padingSize, bool append = false)
        {
            try
            {
                //bool checkAppend=append;
                float prog = 0.2f;
                EditorUtility.DisplayCancelableProgressBar("Creating Spritesheet", "Auto Build Atlas Sprites", prog);
                Texture2D[] textArray = new Texture2D[listSprite.Count];
                for (int i = 0; i < textArray.Length; i++)
                {
                    textArray[i] = listSprite[i].texture;
                }
                Texture2D mainTexture = new Texture2D(8192, 8192);
                Rect[]    rects       = mainTexture.PackTextures(textArray, padingSize, 8192, false);
                mainTexture.Apply();
                //ImportTextureUtil.MaxImportSettings(mainTexture);
                int xmin        = 0;
                int ymin        = 0;
                int cacheWidth  = mainTexture.width;
                int cacheHeight = mainTexture.height;

                int       optimizeWidth  = cacheWidth;
                int       optimizeHeight = cacheHeight;
                Texture2D mainTexture2   = null;
                prog = 0.4f;
                EditorUtility.DisplayCancelableProgressBar("Creating Spritesheet", "Auto Build Atlas Sprites", prog);
                #region Trim to minimum Texture
                if (trimType == TrimType.TrimMinimum && rects.Length > 0)
                {
                    float rectMinX = rects[0].xMin;
                    float rectMinY = rects[0].yMin;
                    float rectMaxX = rects[0].xMax;
                    float rectMaxY = rects[0].yMax;
                    for (int i = 1; i < rects.Length; i++)
                    {
                        if (rects[i].xMin < rectMinX)
                        {
                            rectMinX = rects[i].xMin;
                        }
                        if (rects[i].yMin < rectMinY)
                        {
                            rectMinY = rects[i].yMin;
                        }
                        if (rects[i].xMax < rectMaxX)
                        {
                            rectMaxX = rects[i].xMax;
                        }
                        if (rects[i].yMax < rectMaxY)
                        {
                            rectMaxY = rects[i].yMax;
                        }
                    }
                    int intRectMinX = (int)(rectMinX * cacheWidth);
                    int intRectMinY = (int)(rectMinY * cacheHeight);
                    int intRectMaxX = (int)(rectMaxX * cacheWidth);
                    int intRectMaxY = (int)(rectMaxY * cacheHeight);

                    Color32[] pixels = mainTexture.GetPixels32();
                    xmin = mainTexture.width;
                    int xmax = 0;
                    ymin = mainTexture.height;
                    int ymax      = 0;
                    int oldWidth  = mainTexture.width;
                    int oldHeight = mainTexture.height;

                    // Trim solid pixels
                    for (int y = 0, yw = oldHeight; y < yw; ++y)
                    {
                        for (int x = 0, xw = oldWidth; x < xw; ++x)
                        {
                            Color32 c = pixels[y * xw + x];

                            if (c.a != 0)
                            {
                                if (y < ymin)
                                {
                                    ymin = y;
                                }
                                if (y > ymax - 1)
                                {
                                    ymax = y + 1;
                                }
                                if (x < xmin)
                                {
                                    xmin = x;
                                }
                                if (x > xmax - 1)
                                {
                                    xmax = x + 1;
                                }
                            }
                        }
                    }
                    if (xmin > intRectMinX)
                    {
                        xmin = intRectMinX;
                    }
                    if (ymin > intRectMinY)
                    {
                        ymin = intRectMinY;
                    }
                    if (xmax < intRectMaxX)
                    {
                        xmax = intRectMaxX;
                    }
                    if (ymax < intRectMaxY)
                    {
                        ymax = intRectMaxY;
                    }
                    if (xmax - xmin > 0 && ymax - ymin > 0)
                    {
                        optimizeWidth  = xmax - xmin;
                        optimizeHeight = ymax - ymin;
                        mainTexture2   = new Texture2D(xmax - xmin, ymax - ymin);
                        mainTexture2.SetPixels(mainTexture.GetPixels(xmin, ymin, xmax - xmin, ymax - ymin));
                        mainTexture2.Apply();
                        GameObject.DestroyImmediate(mainTexture);
                        mainTexture = mainTexture2;
                    }
                }

                #endregion

                prog = 0.5f;
                EditorUtility.DisplayCancelableProgressBar("Creating Spritesheet", "Auto Build Atlas Sprites", prog);
                #region Write New File
                byte[] byt = mainTexture.EncodeToPNG();
                if (texturePath != "")
                {
                    System.IO.File.WriteAllBytes(texturePath, byt);
                    AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                }
                AssetDatabase.ImportAsset(texturePath);
                #endregion
                EditorUtility.ClearProgressBar();
                prog = 0.6f;
                EditorUtility.DisplayCancelableProgressBar("Creating Spritesheet", "Auto Build Atlas Sprites", prog);
                mainTexture = AssetDatabase.LoadAssetAtPath(texturePath, typeof(Texture2D)) as Texture2D;
                TextureImporter         ti       = AssetImporter.GetAtPath(texturePath) as TextureImporter;
                TextureImporterSettings settings = new TextureImporterSettings();
                ti.ReadTextureSettings(settings);
                SpriteMetaData[] lstMetaSprite = new SpriteMetaData[listSprite.Count];
                if (append)
                {
                    if (ti.spritesheet != null && ti.spritesheet.Length > 0)
                    {
                        append        = true;
                        lstMetaSprite = ti.spritesheet;
                    }
                    else
                    {
                        append = false;
                    }
                }
                for (int i = 0; i < lstMetaSprite.Length; i++)
                {
                    if (i < rects.Length)
                    {
                        SpriteMetaData metaSprite = new SpriteMetaData();
                        if (append)
                        {
                            metaSprite = lstMetaSprite[i];
                        }
                        metaSprite.name = listSprite[i].name;
                        Rect rectInfo = listSprite[i].GetSpriteRect();

                        Rect rect = new Rect(rects[i].x * cacheWidth - xmin, rects[i].y * cacheHeight - ymin, rectInfo.width, rectInfo.height);
                        if (rect.x + rect.width > optimizeWidth)
                        {
                            rect.width = optimizeWidth - rect.x;
                        }
                        if (rect.y + rect.height > optimizeHeight)
                        {
                            rect.height = optimizeHeight - rect.y;
                        }
                        metaSprite.rect = rect;
                        int oWidth  = listSprite[i].originalRect.width;
                        int oHeight = listSprite[i].originalRect.height;
                        if (oWidth < 1)
                        {
                            oWidth = 1;
                        }
                        if (oHeight < 1)
                        {
                            oHeight = 1;
                        }
                        int xLeft = listSprite[i].startX;
                        int yTop  = listSprite[i].startY;

                        if (listSprite[i].IsOptimize())
                        {
                            float pivotX = listSprite[i].pivot.x * listSprite[i].originalRect.width;
                            float pivotY = listSprite[i].pivot.y * listSprite[i].originalRect.height;
                            pivotX = pivotX - xLeft;
                            pivotY = pivotY - yTop;
                            pivotX = pivotX / listSprite[i].optimizeRect.width;
                            pivotY = pivotY / listSprite[i].optimizeRect.height;

                            listSprite[i].SetPivot(new Vector2(pivotX, pivotY));
                            metaSprite.pivot     = new Vector2(pivotX, pivotY);
                            metaSprite.alignment = ImportTextureUtil.GetAlignment(metaSprite.pivot);                          // listSprite[i].alignment;
                            if (dicPivot != null)
                            {
                                foreach (KeyValuePair <string, EAPInfoAttachment> pair in dicPivot)
                                {
                                    if (pair.Value.spriteName == metaSprite.name)
                                    {
                                        pair.Value.SetCache(xLeft, yTop, listSprite[i].originalRect, listSprite[i].optimizeRect);
                                    }
                                }
                            }
                        }
                        else
                        {
                            metaSprite.pivot     = listSprite[i].pivot;
                            metaSprite.alignment = ImportTextureUtil.GetAlignment(metaSprite.pivot);
                        }
                        lstMetaSprite[i] = metaSprite;
                    }
                }
                prog = 0.7f;
                EditorUtility.DisplayCancelableProgressBar("Creating Spritesheet", "Auto Build Atlas Sprites", prog);
                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(texturePath);
                EditorUtility.SetDirty(mainTexture);
                AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                AssetDatabase.ImportAsset(texturePath);
                prog = 1.0f;
                EditorUtility.DisplayCancelableProgressBar("Creating Spritesheet", "Auto Build Atlas Sprites", prog);
                EditorUtility.ClearProgressBar();

                // douple setting for fix Unity 5.5
                ti.textureType      = TextureImporterType.Sprite;
                ti.spriteImportMode = SpriteImportMode.Multiple;
                EditorUtility.SetDirty(mainTexture);
                AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                AssetDatabase.ImportAsset(texturePath);

                /*for(int i=0;i<listSprite.Count;i++)
                 * {
                 *      listSprite[i].FreeMemory();
                 * }*/
                System.GC.Collect();
                return(true);
            }
            catch (UnityException ex)
            {
                Debug.LogError("Error:" + ex.Message);
                EditorUtility.ClearProgressBar();
                return(false);
            }
            catch (System.Exception ex)
            {
                Debug.LogError("Error:" + ex.Message);
                EditorUtility.ClearProgressBar();
                return(false);
            }
        }
コード例 #4
0
 public void SetPivot(Vector2 _vecPivot)
 {
     this.pivot     = _vecPivot;
     this.alignment = ImportTextureUtil.GetAlignment(this.pivot);
 }
コード例 #5
0
        public bool TrimTexture(bool deleteOld = false)
        {
            if (this.needSetAuthority)
            {
                ImportTextureUtil.MakeReadable(texture);
            }
            Color32[] pixels    = texture.GetPixels32();
            int       xmin      = texture.width;
            int       xmax      = 1;
            int       ymin      = texture.height;
            int       ymax      = 1;
            int       oldWidth  = texture.width;
            int       oldHeight = texture.height;

            // Trim solid pixels
            for (int y = 0, yw = oldHeight; y < yw; y++)
            {
                for (int x = 0, xw = oldWidth; x < xw; x++)
                {
                    Color32 c = pixels[y * xw + x];

                    if (c.a != 0)
                    {
                        if (y < ymin)
                        {
                            ymin = y;
                        }
                        if (y > ymax - 1)
                        {
                            ymax = y + 1;
                        }
                        if (x < xmin)
                        {
                            xmin = x;
                        }
                        if (x > xmax - 1)
                        {
                            xmax = x + 1;
                        }
                    }
                }
            }
            if (xmin > 0 || ymin > 0 || xmax < originalRect.width || ymax < originalRect.height)
            {
                // co the optimize dc
                isOptimize = true;
                int  width      = xmax - xmin;
                int  height     = ymax - ymin;
                bool emptyImage = false;
                if (width < 0)
                {
                    xmin       = 0;
                    width      = 1;
                    emptyImage = true;
                }
                if (height < 0)
                {
                    ymin       = 0;
                    height     = 1;
                    emptyImage = true;
                }
                Texture2D text2 = new Texture2D(xmax - xmin, height);
                text2.SetPixels(texture.GetPixels(xmin, ymin, width, height));
                text2.Apply();
                if (deleteOld)
                {
                    GameObject.DestroyImmediate(texture);
                }
                this.texture = text2;
                if (!emptyImage)
                {
                    this.optimizeRect = new IntRect(0, 0, texture.width, texture.height);
                }
                else
                {
                    this.optimizeRect = new IntRect(xmin, ymin, width, height);
                }
                this.startX = xmin;
                this.startY = ymin;
                return(true);
            }
            return(false);
        }