Упаковщик спрайтов устарел
Обратите внимание, что Упаковщик спрайтов устарел для Unity 2020.1 и более поздних версий и больше не будет доступен в качестве опции в Режимы упаковки спрайтов. Существующие проекты, уже использующие Sprite Packer, по-прежнему смогут использовать его, однако любой новый проект, созданный в 2020.1 и более поздних версиях, по умолчанию будет использовать Атлас спрайтовТекстура, состоящая из нескольких меньших текстур. Также называется атласом текстуры, спрайтом изображения, листом спрайта или упакованной текстурой. Подробнее
См. в Словарь при упаковке текстур.
Введение
При разработке Spriteдвухмерных графических объектов. Если вы привыкли работать в 3D, спрайты — это, по сути, просто стандартные текстуры, но есть специальные приемы комбинирования текстур спрайтов и управления ими для повышения эффективности и удобства во время разработки. Подробнее
Посмотрите в Словарь графику, удобно работать с отдельным файлом Текстуры для каждый персонаж. Однако значительная часть текстуры спрайта часто будет занимать пустое пространство между графическими элементами, и это пространство приведет к трате видеопамяти во время выполнения. Для оптимальной производительности лучше всего упаковать графику из нескольких текстур Sprite вместе в одну текстуру, известную как атлас. Unity предоставляет утилиту Sprite Packer для автоматизации процесса создания атласов из отдельных текстур Sprite.
Unity обрабатывает создание и использование текстур атласа Sprite за сценамиСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь, чтобы пользователю не приходилось выполнять назначение вручную. При желании атлас можно упаковать при входе в режим воспроизведения или во время сборки, а графика для объекта Sprite будет получена из атласа после его создания.
Пользователям необходимо указать тег упаковки в средстве импорта текстур, чтобы разрешить упаковку спрайтов этой текстуры.
Использование упаковщика спрайтов
Упаковщик спрайтов по умолчанию отключен, но его можно настроить в окне Редактора (меню: Правка > Настройки проектаБольшой набор настроек, которые позволяют настраивать физику, звук, сеть, графику, ввод и многие другие области поведение вашего проекта. Подробнее
См. Словарь, затем выберите категорию Редактор ). Режим упаковки спрайтов можно изменить с Отключено на Включено для сборок (упаковка используется для сборок, но не в режиме воспроизведения) или Всегда включена (упаковка включен как для игрового режима, так и для сборок).
Если открыть окно "Упаковщик спрайтов" (меню: Окно > 2D > Упаковщик спрайтов) и нажать кнопку Упаковать в верхнем левом углу вы увидите расположение текстур, упакованных в атлас.
Если вы выберете спрайт на панели «Проект», он также будет выделен, чтобы показать его положение в атласе. Контур на самом деле является визуализацией сеткиосновного графического примитива Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в схеме Словарь, где также определяется область, используемая для плотной упаковки.
панель инструментовряд кнопок и основных элементов управления в верхней части редактора Unity, позволяющий взаимодействовать с редактором. различными способами (например, масштабирование, перевод). Подробнее
См. в Словарь в верхней части окна Sprite Packer имеет ряд элементов управления которые влияют на упаковку и просмотр. Кнопки Упаковать инициируют операцию упаковки, но не будут принудительно обновляться, если атлас не изменился с момента последней упаковки. (Соответствующая кнопка Переупаковать появится, когда вы реализуете пользовательскую политику упаковки, как описано в разделе Настройка упаковщика спрайтов ниже). Меню Просмотр атласа и Страница # позволяют выбрать, какая страница какого атласа отображается в окне (один атлас может быть разделен на несколько «страниц», если не хватает места для всех Спрайтов в максимальном размере Текстуры). Меню рядом с номером страницы выбирает, какая «политика упаковки» используется для атласа (см. ниже). Справа от панели инструментов находятся два элемента управления для масштабирования вида и переключения между цветным и альфа-каналом для атласа.
Политика упаковки
Упаковщик спрайтов использует политику упаковки, чтобы решить, как назначать спрайты в атласы. Можно создать свои собственные политики упаковки (см. ниже), но Политика упаковщика по умолчанию, Политика плотного упаковщика и Политика упаковщика спрайтов с плотным вращением варианты всегда есть. С помощью этих политик свойство Packing Tag в средстве импорта текстур напрямую выбирает имя атласа, в котором будет упакован спрайт, и, следовательно, все спрайты. с одинаковыми упаковочными бирками будут упакованы в один и тот же атлас. Затем атласы сортируются по настройкам импорта текстур, чтобы они соответствовали тем, что пользователь устанавливает для исходных текстур. Спрайты с одинаковой текстурой сжатиеМетод хранения данных, уменьшающий требуемый объем памяти. См. Сжатие текстур, Сжатие анимации, Сжатие звука, Сжатие компоновки.
См. в Словарь, настройки будут по возможности сгруппированы в один атлас.р>
- DefaultPackerPolicy по умолчанию будет использовать прямоугольную упаковку, если только в теге упаковки не указано «[TIGHT]» (т. е. установка для тега упаковки значения «[TIGHT]Character» разрешит плотную упаковку). ли>
- TightPackerPolicy будет использовать плотную упаковку по умолчанию, если Sprite имеет плотную сетку. Если в теге Packing Tag указано «[RECT]», будет выполнена прямоугольная упаковка (т. е. установка для тега упаковки значения «[RECT]UI_Elements» приведет к прямоугольной упаковке).
- TightRotateEnabledSpritePackerPolicy будет использовать плотную упаковку по умолчанию, если спрайт имеет плотную сетку, и позволит вращение спрайтов. Если в теге Packing Tag указано «[RECT]», будет выполнена прямоугольная упаковка (т. е. установка для тега упаковки значения «[RECT]UI_Elements» приведет к прямоугольной упаковке).
Настройка упаковщика спрайтов
Параметр DefaultPackerPolicy достаточен для большинства целей, но при необходимости вы также можете реализовать свою собственную политику упаковки. Для этого вам нужно реализовать интерфейс UnityEditor.Sprites.IPackerPolicy для класса в скрипте редактора. Для этого интерфейса требуются следующие методы:
- GetVersion — возвращает значение версии вашей политики упаковщика. Версия должна быть увеличена, если в сценарий политики внесены изменения, и эта политика сохраняется в системе управления версиямисистемы для управления изменениями файлов. Вы можете использовать Unity в сочетании с наиболее распространенными инструментами контроля версий, включая Perforce, Git, Mercurial и PlasticSCM. Дополнительная информация
См. в Словарь. - OnGroupAtlases — здесь реализуйте логику упаковки. Определите атласы в PackerJob и назначьте спрайты из заданных TextureImporters.
DefaultPackerPolicy по умолчанию использует прямоугольную упаковку (см. SpritePackingMode). Это полезно, если вы создаете эффекты текстурного пространства или хотите использовать другую сетку для рендерингапроцесса рисования графики на экран (или в текстуру рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь спрайт. Пользовательские политики могут переопределить это и вместо этого использовать плотную упаковку.
- Кнопка «Переупаковать» активна, только если выбрана пользовательская политика.
- OnGroupAtlases не будет вызываться, пока не изменятся метаданные TextureImporter или выбранные значения версии PackerPolicy.
- Используйте кнопку «Переупаковать» при работе с пользовательской политикой.
- Спрайты могут быть автоматически упакованы с поворотом с помощью TightRotateEnabledSpritePackerPolicy.
- SpritePackingRotation — это зарезервированный тип для будущих версий Unity.
Другое
- Атласы кэшируются в Project\Library\AtlasCache.
- Если удалить эту папку, а затем запустить Unity, атласы будут переупакованы. При этом Unity должен быть закрыт.
- Кэш Atlas не загружается при запуске.
- Все текстуры должны быть проверены при упаковке в первый раз после перезапуска Unity. Эта операция может занять некоторое время в зависимости от общего количества текстур в проекте.
- Загружаются только необходимые атласы.
- Максимальный размер атласа по умолчанию – 2048 x 2048.
- Если установлен PackingTag, текстура не будет сжиматься, чтобы SpritePacker мог захватить исходный пиксельнаименьшую единицу в компьютере. изображение. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
Посмотрите в Словарь значения, а затем выполните сжатие по атласу.
Политика упаковки по умолчанию
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 entries = new List();
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; } }
}
- Sprite Packer устарел в 2020.1