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; } }
/*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; } } } } }
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); } }
public void SetPivot(Vector2 _vecPivot) { this.pivot = _vecPivot; this.alignment = ImportTextureUtil.GetAlignment(this.pivot); }
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); }