| 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 bool AllowSequentialPacking => 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; | 
|     } | 
| } |