using System; 
 | 
using System.Linq; 
 | 
using UnityEngine; 
 | 
using UnityEditor; 
 | 
using UnityEditor.Sprites; 
 | 
using System.Collections.Generic; 
 | 
  
 | 
// DefaultPackerPolicy will pack rectangles no matter what Sprite mesh type is unless their packing tag contains "[TIGHT]". 
 | 
class CustomSpritePacker : UnityEditor.Sprites.IPackerPolicy 
 | 
{ 
 | 
    protected class Entry 
 | 
    { 
 | 
        public Sprite sprite; 
 | 
        public AtlasSettings settings; 
 | 
        public string atlasName; 
 | 
        public SpritePackingMode packingMode; 
 | 
    } 
 | 
  
 | 
    public virtual int GetVersion() { return 1; } 
 | 
  
 | 
    protected virtual string TagPrefix { get { return "[TIGHT]"; } } 
 | 
    protected virtual bool AllowTightWhenTagged { get { return true; } } 
 | 
  
 | 
    public void OnGroupAtlases(BuildTarget target, PackerJob job, int[] textureImporterInstanceIDs) 
 | 
    { 
 | 
        List<Entry> entries = new List<Entry>(); 
 | 
  
 | 
        foreach (int instanceID in textureImporterInstanceIDs) 
 | 
        { 
 | 
            TextureImporter ti = EditorUtility.InstanceIDToObject(instanceID) as TextureImporter; 
 | 
            TextureFormat textureFormat; 
 | 
            ColorSpace colorSpace; 
 | 
            int compressQuality; 
 | 
            ti.ReadTextureImportInstructions( target,out textureFormat,out colorSpace,out compressQuality); 
 | 
  
 | 
            TextureImporterSettings tis = new TextureImporterSettings(); 
 | 
            ti.ReadTextureSettings(tis); 
 | 
  
 | 
            Sprite[] sprites = AssetDatabase.LoadAllAssetRepresentationsAtPath(ti.assetPath).Select(x => x as Sprite).Where(x => x != null).ToArray(); 
 | 
            foreach (Sprite sprite in sprites) 
 | 
            { 
 | 
                //在这里设置每个图集的参数 
 | 
                Entry entry = new Entry(); 
 | 
                entry.sprite = sprite; 
 | 
                entry.settings.format = textureFormat; 
 | 
                entry.settings.colorSpace = colorSpace; 
 | 
                entry.settings.compressionQuality = compressQuality; 
 | 
                entry.settings.filterMode = Enum.IsDefined(typeof(FilterMode), ti.filterMode) ? ti.filterMode : FilterMode.Bilinear; 
 | 
                entry.settings.maxWidth = 2048; 
 | 
                entry.settings.maxHeight = 2048; 
 | 
                entry.atlasName = ParseAtlasName(ti.spritePackingTag); 
 | 
                entry.packingMode = GetPackingMode(ti.spritePackingTag, tis.spriteMeshType); 
 | 
  
 | 
                entries.Add(entry); 
 | 
            } 
 | 
  
 | 
            Resources.UnloadAsset(ti); 
 | 
        } 
 | 
  
 | 
        // First split sprites into groups based on atlas name 
 | 
        var atlasGroups = 
 | 
            from e in entries 
 | 
            group e by e.atlasName; 
 | 
        foreach (var atlasGroup in atlasGroups) 
 | 
        { 
 | 
            int page = 0; 
 | 
            // Then split those groups into smaller groups based on texture settings 
 | 
            var settingsGroups = 
 | 
                from t in atlasGroup 
 | 
                group t by t.settings; 
 | 
            foreach (var settingsGroup in settingsGroups) 
 | 
            { 
 | 
                string atlasName = atlasGroup.Key; 
 | 
                if (settingsGroups.Count() > 1) 
 | 
                    atlasName += string.Format(" (Group {0})", page); 
 | 
  
 | 
                job.AddAtlas(atlasName, settingsGroup.Key); 
 | 
                foreach (Entry entry in settingsGroup) 
 | 
                { 
 | 
                    job.AssignToAtlas(atlasName, entry.sprite, entry.packingMode, SpritePackingRotation.None); 
 | 
                } 
 | 
  
 | 
                ++page; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    protected bool IsTagPrefixed(string packingTag) 
 | 
    { 
 | 
        packingTag = packingTag.Trim(); 
 | 
        if (packingTag.Length < TagPrefix.Length) 
 | 
            return false; 
 | 
        return (packingTag.Substring(0, TagPrefix.Length) == TagPrefix); 
 | 
    } 
 | 
  
 | 
    private string ParseAtlasName(string packingTag) 
 | 
    { 
 | 
        string name = packingTag.Trim(); 
 | 
        if (IsTagPrefixed(name)) 
 | 
            name = name.Substring(TagPrefix.Length).Trim(); 
 | 
        return (name.Length == 0) ? "(unnamed)" : name; 
 | 
    } 
 | 
  
 | 
    private SpritePackingMode GetPackingMode(string packingTag, SpriteMeshType meshType) 
 | 
    { 
 | 
        if (meshType == SpriteMeshType.Tight) 
 | 
            if (IsTagPrefixed(packingTag) == AllowTightWhenTagged) 
 | 
                return SpritePackingMode.Tight; 
 | 
        return SpritePackingMode.Rectangle; 
 | 
    } 
 | 
} 
 |