Search Unity

Sprite packer and compression

Discussion in '2D' started by Vibs_appit, Mar 25, 2015.

  1. Vibs_appit

    Vibs_appit

    Joined:
    Feb 16, 2014
    Posts:
    53
    Hi guys,

    I am importing some sprites which I want to pack using unity's sprite packer. But As soon as I mention the packing tag and apply the settings, the compression (RGBA PVRTC 4bit) changes to ARGB 32 bit. I want to maintain the compression as I am building for iOS, but it reverts to the true colour settings when I use a packing tag. Is this by design or bug? If by design, how would I specify the compression for packed sprite atlas??

    Thanks,
    Rohan
     
  2. rakkarage

    rakkarage

    Joined:
    Feb 3, 2014
    Posts:
    683
    check out the code for the custom packer policy

    http://docs.unity3d.com/Manual/SpritePacker.html

    i got this working to set all to argb32 but you could set compression too

    Code (CSharp):
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using UnityEditor;
    5. using UnityEditor.Sprites;
    6. using UnityEngine;
    7. class CustomPackerPolicy : IPackerPolicy
    8. {
    9.     protected class Entry
    10.     {
    11.         public Sprite sprite;
    12.         public AtlasSettings settings;
    13.         public string atlasName;
    14.         public SpritePackingMode packingMode;
    15.         public int anisoLevel;
    16.     }
    17.     private const uint kDefaultPaddingPower = 2;
    18.     public virtual int GetVersion() { return 1; }
    19.     protected virtual string TagPrefix { get { return "[TIGHT]"; } }
    20.     protected virtual bool AllowTightWhenTagged { get { return true; } }
    21.     public void OnGroupAtlases(BuildTarget target, PackerJob job, int[] textureImporterInstanceIDs)
    22.     {
    23.         List<Entry> entries = new List<Entry>();
    24.         foreach (int instanceID in textureImporterInstanceIDs)
    25.         {
    26.             TextureImporter ti = EditorUtility.InstanceIDToObject(instanceID) as TextureImporter;
    27.             TextureFormat format;
    28.             ColorSpace space;
    29.             int quality;
    30.             ti.ReadTextureImportInstructions(target, out format, out space, out quality);
    31.             TextureImporterSettings tis = new TextureImporterSettings();
    32.             ti.ReadTextureSettings(tis);
    33.             Sprite[] sprites = AssetDatabase.LoadAllAssetRepresentationsAtPath(ti.assetPath).Select(x => x as Sprite).Where(x => x != null).ToArray();
    34.             foreach (Sprite sprite in sprites)
    35.             {
    36.                 Entry entry = new Entry();
    37.                 entry.sprite = sprite;
    38.                 entry.settings.format = TextureFormat.RGBA32;
    39.                 entry.settings.colorSpace = space;
    40.                 entry.settings.compressionQuality = quality;
    41.                 entry.settings.filterMode = Enum.IsDefined(typeof(FilterMode), ti.filterMode) ? ti.filterMode : FilterMode.Bilinear;
    42.                 entry.settings.maxWidth = 2048;
    43.                 entry.settings.maxHeight = 2048;
    44.                 entry.settings.generateMipMaps = ti.mipmapEnabled;
    45.                 if (ti.mipmapEnabled)
    46.                     entry.settings.paddingPower = kDefaultPaddingPower;
    47.                 entry.atlasName = ParseAtlasName(ti.spritePackingTag);
    48.                 entry.packingMode = GetPackingMode(ti.spritePackingTag, tis.spriteMeshType);
    49.                 entry.anisoLevel = ti.anisoLevel;
    50.                 entries.Add(entry);
    51.             }
    52.             Resources.UnloadAsset(ti);
    53.         }
    54.         var atlasGroups =
    55.             from e in entries
    56.             group e by e.atlasName;
    57.         foreach (var atlasGroup in atlasGroups)
    58.         {
    59.             int page = 0;
    60.             var settingsGroups =
    61.                 from t in atlasGroup
    62.                 group t by t.settings;
    63.             foreach (var settingsGroup in settingsGroups)
    64.             {
    65.                 string atlasName = atlasGroup.Key;
    66.                 if (settingsGroups.Count() > 1)
    67.                     atlasName += string.Format(" (Group {0})", page);
    68.                 AtlasSettings settings = settingsGroup.Key;
    69.                 settings.anisoLevel = 1;
    70.                 if (settings.generateMipMaps)
    71.                     foreach (Entry entry in settingsGroup)
    72.                         if (entry.anisoLevel > settings.anisoLevel)
    73.                             settings.anisoLevel = entry.anisoLevel;
    74.                 job.AddAtlas(atlasName, settings);
    75.                 foreach (Entry entry in settingsGroup)
    76.                 {
    77.                     job.AssignToAtlas(atlasName, entry.sprite, entry.packingMode, SpritePackingRotation.None);
    78.                 }
    79.                 ++page;
    80.             }
    81.         }
    82.     }
    83.     protected bool IsTagPrefixed(string packingTag)
    84.     {
    85.         packingTag = packingTag.Trim();
    86.         if (packingTag.Length < TagPrefix.Length)
    87.             return false;
    88.         return (packingTag.Substring(0, TagPrefix.Length) == TagPrefix);
    89.     }
    90.     private string ParseAtlasName(string packingTag)
    91.     {
    92.         string name = packingTag.Trim();
    93.         if (IsTagPrefixed(name))
    94.             name = name.Substring(TagPrefix.Length).Trim();
    95.         return (name.Length == 0) ? "(unnamed)" : name;
    96.     }
    97.     private SpritePackingMode GetPackingMode(string packingTag, SpriteMeshType meshType)
    98.     {
    99.         if (meshType == SpriteMeshType.Tight)
    100.             if (IsTagPrefixed(packingTag) == AllowTightWhenTagged)
    101.                 return SpritePackingMode.Tight;
    102.         return SpritePackingMode.Rectangle;
    103.     }
    104. }
    105.  
     
    theANMATOR2b and Vibs_appit like this.
  3. tzivaeris

    tzivaeris

    Joined:
    Mar 21, 2018
    Posts:
    4
    I am getting this:

    Assets/SpritePacker/CustomPackerPolicy.cs(7,7): error CS0535: `CustomPackerPolicy' does not implement interface member `UnityEditor.Sprites.IPackerPolicy.AllowSequentialPacking.get'

    Needs something else?

    Unity 2018.2.0f2
     
  4. rakkarage

    rakkarage

    Joined:
    Feb 3, 2014
    Posts:
    683