当设计精灵图形,可以很方便的对每个字符的一个单独的纹理文件工作。然而,一个精灵的纹理的很大一部分会被空的空间图形元素和之间的空间会产生浪费的内存在运行时。为获得最佳性能,最好是包几个雪碧纹理紧密结合在一起的图形在一个单一的纹理称为阿特拉斯。提供一个统一的雪碧封隔器公用事业自动化从个体精神生成过程纹理地图集。 统一处理雪碧阿特拉斯纹理幕后的生成和使用,用户需要做的没有手动分配。阿特拉斯可以被包装进入播放模式或在建和Sprite对象的图形将从阿特拉斯一旦生成了。 用户需要指定要启用,纹理精灵包装的纹理导入包装标签。 使用精灵封隔器精灵封隔器默认是禁用的,你可以配置它从编辑器设置(菜单:Edit -> Project Settings -> Editor)。雪碧的包装模式是可以改变的残疾人到启用的建立(即包装用于建立但不播放模式)或始终启用(即包装is enabled and builds都播放模式)。 如果你打开雪碧封隔器窗口(菜单:Window -> Sprite Packer) 和 点击 的包裹在左上角的按钮,你会看到纹理填充在阿特拉斯的安排。
如果你选择在项目面板的雪碧,这还将突出显示其在阿特拉斯的位置。提纲实际上是渲染网格轮廓,它还定义了用于包装严密的地区。 在精灵的封隔器窗口顶部的工具栏有许多影响包装和查看控件。这个包裹按钮启动包装操作但不会强迫任何更新,如果阿特拉斯没有因为它是最后的包装变了。(相关改装按钮会出现当你实现一个自定义包装政策解释定制的雪碧封隔器below)。the阿特拉斯的观点和#页菜单,允许你选择哪一页,阿特拉斯在窗口中显示(单阿特拉斯可以被分为多个“页面”如果没有在最大纹理尺寸所有精灵们足够的空间)。旁边的页码选择“包装策略”用于阿特拉斯菜单(见下图)。在工具栏的右两控制缩放视图并为阿特拉斯颜色和alpha显示之间切换。 包装策略精灵封隔器使用包装策略决定如何分配的精灵到地图集。可以创建自己的包装政策(见下文)但默认的封隔器政策,紧封隔器政策和紧旋转使雪碧包装政策选择总是可用。这些政策的包装标签财产的纹理导入器直接选择名称的阿特拉斯,雪碧将包装等所有精灵一样的包装的标签将被包装在同一阿特拉斯。图谱进一步按纹理导入设置让他们比赛无论源纹理的用户集。具有相同的纹理压缩设置精灵将被分成相同的阿特拉斯可能在哪里。 - defaultpackerpolicy将使用默认的矩形包装除非“[紧张]”中指定的包装标签(即你的包装标签”[紧张]字符”将允许密封包装)。
- tightpackerpolicy将默认使用密封包装如果雪碧有紧密的网格。如果“[矩形]”中指定的包装标签,矩形包装会做(即你的包装标签”[矩形] ui_elements”将迫使矩形包装)。
- tightrotateenabledspritepackerpolicy将默认使用密封包装如果雪碧有紧密的网格将使旋转的精灵。如果“[矩形]”中指定的包装标签,矩形包装会做(即你的包装标签”[矩形] ui_elements”将迫使矩形包装)。
定制的雪碧封隔器这个defaultpackerpolicy期权是最充分的目的,但你也可以实现自己的自定义包装政策如果你需要。要做到这一点,你需要在编辑脚本实现一个类的unityeditor.sprites.ipackerpolicy接口。这个接口需要以下方法: - 获取版本返回你的封隔器政策的版本价值。版本应该撞如果修改做策略脚本和这个政策是保存到版本控制。
- ongroupatlases实施你的包装逻辑在这里。定义在packerjob地图集和从给定的textureimporters分配精灵。
defaultpackerpolicy使用正确的包装(见spritepackingmode)默认。如果你做的空间肌理效果或想要使用不同的网格渲染的精灵这是有用的。自定义策略可以重写此而使用密封包装。 - 改装按钮时只启用自定义策略选择。
- ongroupatlases否则textureimporter元数据或选定的packerpolicy版本值的变化称为。
- 使用改装按钮在您的自定义策略工作时。
- 精灵可以装tightrotateenabledspritepackerpolicy自动旋转。
- spritepackingrotation是保留型未来统一版本。
其他- 地图缓存在项目库atlascache。
- 删除此文件夹,然后启动统一意志力图谱被改装。统一必须关闭时。
- 阿特拉斯是不是在开始加载缓存。
- 所有的纹理必须检查包装时首次统一后重新启动。此操作可能需要一些时间,取决于项目的总数量的纹理。
- 只需要地图加载。
- 默认最大大小阿特拉斯是2048x2048。
- 当packingtag设置,纹理不会被压缩,spritepacker可以抓住原始像素值然后进行压缩的阿特拉斯。
defaultpackerpolicy
- using System;
- using System.Linq;
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- public class DefaultPackerPolicySample : UnityEditor.Sprites.IPackerPolicy
- {
- protected class Entry
- {
- public Sprite sprite;
- public UnityEditor.Sprites.AtlasSettings settings;
- public string atlasName;
- public SpritePackingMode packingMode;
- public int anisoLevel;
- }
- private const uint kDefaultPaddingPower = 3; // Good for base and two mip levels.
- public virtual int GetVersion() { return 1; }
- protected virtual string TagPrefix { get { return "[TIGHT]"; } }
- protected virtual bool AllowTightWhenTagged { get { return true; } }
- protected virtual bool AllowRotationFlipping { get { return false; } }
- public static bool IsCompressedFormat(TextureFormat fmt)
- {
- if (fmt >= TextureFormat.DXT1 && fmt <= TextureFormat.DXT5)
- return true;
- if (fmt >= TextureFormat.DXT1Crunched && fmt <= TextureFormat.DXT5Crunched)
- return true;
- if (fmt >= TextureFormat.PVRTC_RGB2 && fmt <= TextureFormat.PVRTC_RGBA4)
- return true;
- if (fmt == TextureFormat.ETC_RGB4)
- return true;
- if (fmt >= TextureFormat.ATC_RGB4 && fmt <= TextureFormat.ATC_RGBA8)
- return true;
- if (fmt >= TextureFormat.EAC_R && fmt <= TextureFormat.EAC_RG_SIGNED)
- return true;
- if (fmt >= TextureFormat.ETC2_RGB && fmt <= TextureFormat.ETC2_RGBA8)
- return true;
- if (fmt >= TextureFormat.ASTC_RGB_4x4 && fmt <= TextureFormat.ASTC_RGBA_12x12)
- return true;
- if (fmt >= TextureFormat.DXT1Crunched && fmt <= TextureFormat.DXT5Crunched)
- return true;
- return false;
- }
- public void OnGroupAtlases(BuildTarget target, UnityEditor.Sprites.PackerJob job, int[] textureImporterInstanceIDs)
- {
- List<Entry> entries = new List<Entry>();
- foreach (int instanceID in textureImporterInstanceIDs)
- {
- TextureImporter ti = EditorUtility.InstanceIDToObject(instanceID) as TextureImporter;
- TextureFormat desiredFormat;
- ColorSpace colorSpace;
- int compressionQuality;
- ti.ReadTextureImportInstructions(target, out desiredFormat, out colorSpace, out compressionQuality);
- 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 = desiredFormat;
- entry.settings.colorSpace = colorSpace;
- // Use Compression Quality for Grouping later only for Compressed Formats. Otherwise leave it Empty.
- entry.settings.compressionQuality = IsCompressedFormat(desiredFormat) compressionQuality : 0;
- entry.settings.filterMode = Enum.IsDefined(typeof(FilterMode), ti.filterMode)
- ti.filterMode
- : FilterMode.Bilinear;
- entry.settings.maxWidth = 2048;
- entry.settings.maxHeight = 2048;
- entry.settings.generateMipMaps = ti.mipmapEnabled;
- entry.settings.enableRotation = AllowRotationFlipping;
- if (ti.mipmapEnabled)
- entry.settings.paddingPower = kDefaultPaddingPower;
- else
- entry.settings.paddingPower = (uint)EditorSettings.spritePackerPaddingPower;
- #if ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION
- entry.settings.allowsAlphaSplitting = ti.GetAllowsAlphaSplitting ();
- #endif //ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION
- entry.atlasName = ParseAtlasName(ti.spritePackingTag);
- entry.packingMode = GetPackingMode(ti.spritePackingTag, tis.spriteMeshType);
- entry.anisoLevel = ti.anisoLevel;
- 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);
- UnityEditor.Sprites.AtlasSettings settings = settingsGroup.Key;
- settings.anisoLevel = 1;
- // Use the highest aniso level from all entries in this atlas
- if (settings.generateMipMaps)
- foreach (Entry entry in settingsGroup)
- if (entry.anisoLevel > settings.anisoLevel)
- settings.anisoLevel = entry.anisoLevel;
- job.AddAtlas(atlasName, settings);
- 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;
- }
- }
复制代码 tightpackerpolicy- using System;
- using System.Linq;
- using UnityEngine;
- using UnityEditor;
- using UnityEditor.Sprites;
- using System.Collections.Generic;
- // TightPackerPolicy will tightly pack non-rectangle Sprites unless their packing tag contains "[RECT]".
- class TightPackerPolicySample : DefaultPackerPolicySample
- {
- protected override string TagPrefix { get { return "[RECT]"; } }
- protected override bool AllowTightWhenTagged { get { return false; } }
- protected override bool AllowRotationFlipping { get { return false; } }
- }
复制代码 TightRotateEnabledSpritePackerPolicy- using System;
- using System.Linq;
- using UnityEngine;
- using UnityEditor;
- using UnityEditor.Sprites;
- using System.Collections.Generic;
- // TightPackerPolicy will tightly pack non-rectangle Sprites unless their packing tag contains "[RECT]".
- class TightRotateEnabledSpritePackerPolicySample : DefaultPackerPolicySample
- {
- protected override string TagPrefix { get { return "[RECT]"; } }
- protected override bool AllowTightWhenTagged { get { return false; } }
- protected override bool AllowRotationFlipping { get { return true; } }
- }
复制代码
|