Разное

Unity sprite: Unity — Creating Sprites — Tutorialspoint

Содержание

Редактор спрайтов Unity Sprite Editor, как с ним работать и чего можно добиться?

16.07.2018

Бывают такие ситуации когда текстура спрайта содержит не только один элемент, гораздо удобней объединить несколько изображений связанных друг с другом в одно изображение. Например, изображение может содержать составные части персонажа,
бег, прыжок , стрельба , состояние покоя. Для этих целей Unity предоставляет Sprite Editor, который позволяет с извлекать элементы составного изображения.

Убедитесь, что графический объект, который вы хотите отредактировать, имеет тип текстуры, заданный для Sprite (2D и UI).

Для текстур Sprite с несколькими элементами необходимо, чтобы режим Sprite был установлен на Multiple in Inector.

Откройте редактор спрайтов

1. Выберите 2D-изображение, которое вы хотите отредактировать, из Project View

Вы не можете редактировать спрайт, который находится в режиме просмотра из сцены.

2. Нажмите кнопку «Редактор спрайтов» в Инспекторе импорта и отобразится редактор спрайтов.

Установите режим Sprite в Multiple в Inspector Import Text, если ваше изображение имеет несколько элементов.

Вы можете видеть только кнопку «Редактор спрайтов», если для параметра «Тип текстуры» для выбранного изображения установлено значение «Спрайт».

Кроме составного изображения, вы увидите другие элементы управления в редакторе. Слайдер в правом верхнем углу управляет приближением, в то время как кнопка с цветными полосками слева от него изменяет отображение альфа-канала и обычного
вида изображения. Самый важный элемент управления это меню Slice в левом верхнем углу, который предоставляет опции для автоматической нарезки элементов изображения. Кнопки Apply and Revert позволяют вам сохранить или отменить сделанные
изменения.

Использование редактора

Самый простой способ использования редактора — идентифицировать элементы вручную. Если вы нажмете на изображение, вы увидите прямоугольную область выделения с ручками в углах. Вы можете перетащить ручки или края прямоугольника, чтобы
изменить его вокруг определенного элемента. Выделив элемент, вы можете добавить другой, перетащив новый прямоугольник в отдельную часть изображения. Вы заметите, что когда вы выбрали прямоугольник, в правом нижнем углу окна появится
панель:

Элементы управления на панели позволяют выбрать имя для спрайта и задать положение и размер прямоугольника по его координатам. Ширина границы, для левой, верхней, правой и нижней, может быть указана в пикселях. Существуют также настройки
для оси спрайта, которые Unity использует как начало координат и основную «опорную точку» графического объекта. Вы можете выбрать из нескольких позиций по умолчанию для прямоугольника.

Кнопка Trim рядом с пунктом меню Slice изменит размер прямоугольника так, чтобы он плотно касался края изображения на основе прозрачности. Границы поддерживаются только для системы пользовательского интерфейса, а не для 2D SpriteRenderer.

Автоматическая нарезка

Изоляция прямоугольников спрайтов работает хорошо, но во многих случаях Unity может сэкономить вам работу, обнаружив спрайты и извлекая их автоматически. Если вы нажмете на меню Slice на панели управления, вы увидите эту панель:

Если тип разреза установлен на «Автоматически», редактор попытается угадать границы элементов спрайтов по прозрачности. Вы можете установить пивот по умолчанию для каждого идентифицированного спрайта. В меню «Метод» вы можете выбрать, как
работать с существующими выборами в окне. Опция «Удалить существующий» просто заменит все, что уже выбрано, Smart попытается создать новые прямоугольники, сохранив или отредактировав существующие, и Safe добавит новые прямоугольники, не
изменив ничего уже на месте.

Параметры сетки по размеру ячейки или сетке по ячейкам также доступны для типа разреза. Это очень полезно, когда спрайты уже были выложены в обычном шаблоне во время создания:

Значения размера пикселя определяют высоту и ширину плиток в пикселях. Если вы выбрали сетку по количеству ячеек, Column & Row определяет количество столбцов и строк, используемых для нарезки. Вы также можете использовать значения
смещения, чтобы сдвинуть положение сетки в левом верхнем углу изображения и значения заполнения, чтобы немного вставить прямоугольники спрайтов из сетки. Pivot может быть настроен с одним из девяти предустановленных мест или может быть
установлено местоположение пользовательского поворота.

Обратите внимание, что после использования любого из методов автоматического разреза создаваемые прямоугольники все еще можно редактировать вручную. Вы можете позволить Unity обрабатывать грубое определение границ спрайта и шарниров, а
затем выполнять любую необходимую точную настройку самостоятельно.

2D джоинты в Unity: учимся использовать

В этой статье попробуем разобрать, что из себя представляют 2D джоинты, для чего они нужны и какие физические конструкции можно собирать с их помощью.

Джоинты

2D джоинты представляют собой обычные физические объекты, которым можно придавать силу, перемещать, бросать сталкивать и тд, в общем – делать все то, что мы обычно делаем с физическими объектами в Unity. Особенность же джоинтов в том, что с их помощью можно создавать связи с другими физическими объектами на сцене. В этом случае все действия, которые мы совершаем над одним объектом, будут также влиять на другие – связанные с ним объекты.

Все компоненты джоинтов можно найти во вкладке Component -> Physics 2D.

В отличие от джоинтов для 3D физики, джоинтов для 2D физики почти в два раза больше и каждый тип служит для своих целей, хотя принцип работы у них всех практически один и тот же.

Как это работает

Давайте взглянем на изображение ниже, где показаны общие для всех джоинтов настройки компонента.

Первое на что стоит обратить внимание это то, что все джоинты, при создании на сцене автоматически подключают компонент Rigidbody2D, без которого они не смогут работать.

Здесь, на изображении, специально не показано название компонента джоинта, так как эти настройки являются общими для них всех. Исключением является Target joint, который мы разберем в самом конце статьи.

Начнем с поля Connected Rigid Body. В это поле можно поместить любой физический объект с которым необходимо установить связь.  

Далее поле Enable Collision, которое включает и отключает коллизии между джоинтом и присоединенным объектом.

Поле Anchor, представляет собой Vector2, в котором можно указать место расположения крепления джоинта относительно его Transform’а. Обычно место расположения джоинта указывают сразу при создании на сцене и поле Anchor оставляют без изменений.

Следующее поле Connected Anchor, также представляет собой Vector2, где уже в свою очередь необходимо указать конкретно точку крепления объекта к джоинту относительно самого Transform’а джоинта.

По умолчанию поле Auto Configure Connected Anchor включено и поэтому точка крепления объекта к джоинту указывается автоматически как “центр” самого объекта. К примеру, когда нужно “зацепить” объект за какой либо край, галочку напротив поля Auto Configure Connected Anchor необходимо снять и вручную установить “место зацепления”.

Поле Break Force указывает силу, при превышении которой произойдет разрыв соединения между джоинтом и объектом. По умолчанию стоит значение Infinity, при котором разрыва соединения не произойдет.

У большинства джоинтов также имеется поле Break Torque, где можно указать силу, при которой произойдет разрыв соединения при вращении. Также как и поле Break Force – по умолчанию имеет значение Infinity.

И так ,с основными настройками джоинтов мы разобрались. Попробуем теперь более подробно разобрать некоторые джоинты, с примерами их работы.

Fixed joint

Фиксированный” джоинт – самый элементарный джоинт из всего списка, полностью фиксирует физический объект в определенном месте. В общем, можно описать работу этого джоинта, как если бы вы прибили объект гвоздем к стене – ни пошевелится, ни повернуться такой объект не может.

У этого джоинта помимо стандартных настроек Break Force и Break Torque есть новые поля Damping Ratio и Frequence, изменяя которые можно определить, как сильно объект фиксируется в точке. Оба поля принимают числовое значение, где 0 означает полную фиксацию объекта, вне зависимости от внешних воздействий на объект.

Hinge joint

Следующий Hinge joint, также фиксирует объект в точке, и в отличие от Fixed joint не прерывает “воздействия” физики на сам объект.

Этот джоинт позволяет применять силу для совершения вращения объекта, а также вводить ограничения на угол вращения. Для этого в компоненте есть поле Motor, где указаны две переменные – Motor Speed и Maximum Motor Force, для скорости вращения и максимальной силы, применяемой для совершения вращения. Ограничивать угол вращения можно в поле Angle Limits, где для этого введены две переменные – Lower и Upper Angle – нижнего и верхнего предела угла вращения.

Slider joint

Этот джоинт немного похож  на предыдущий Hinge joint, он тоже позволяет применять силу к объекту. Разница в том, что Hinge joint это делает для вращения объекта, а Slider joint применяет эту силу, чтобы двигать объект под определенным углом.

Также этот джоинт имеет новое поле Angle, где можно указать под каким углом объект будет перемещаться.

Distance joint

Следующий джоинт, как и остальные, имеет стандартный набор настроек, а также новое поле Distance, где можно указать минимальное расстояние между джоинтом и объектом.  Если собрать “цепь” из нескольких таких джоинтов, то можно получить отличный аналог веревки, которая не растягивается и не рвется.

Spring joint

Этот джоинт также имеет поле Distance, но в отличие от Distance joint – позволяет имитировать “пружину” при растягивании. Как и Fixed joint – имеет поля Damping Ratio и Frequency, где можно указать – как быстро и сильно необходимо фиксировать объект к джоинту.

 

Target joint

Особый джоинт из всего списка, которому нельзя указать объект для присоединения – у него просто нет такого поля. Дело в том что если раньше мы сначала определяли позицию джоинта на сцене и к нему уже крепили объект, то в случае с Target joint – сам объект и является джоинтом, и вместо крепления к другому джоинту, он крепится к определенной точке на сцене. Для этого у него есть новое поле – Target, представленное в виде Vector2, где можно указать локальную точку крепления относительно объекта.

По принципу работу он немного похож на Spring joint, в котором также есть поля Damping Ratio и Frequency.

Заключение

Все эти джоинты используется чаще всего, они подходят для создания самых разнообразных физических систем. Важно помнить, что джоинты – это физические объекты, поэтому обрабатывать их перемещения, вращение и другие действия необходимо в методе обработки FixedUpdate, с работой которого можно ознакомится, скачав исходник проекта, со всеми примерами джоинтов отсюда.

Unity — создание спрайтов — CoderLessons.com

Спрайты — это простые 2D-объекты, на которых есть графические изображения (так называемые текстуры ). Unity использует спрайты по умолчанию, когда движок находится в режиме 2D. При просмотре в трехмерном пространстве спрайты выглядят тонкими как бумага, потому что у них нет Z-ширины.

Спрайты всегда обращены к камере под перпендикулярным углом, если они не вращаются в трехмерном пространстве.

Всякий раз, когда Unity создает новый спрайт, он использует текстуру. Затем эта текстура применяется к свежему GameObject, и к нему прикрепляется компонент Sprite Renderer . Это делает наш gameObject видимым с нашей текстурой, а также дает ему свойства, связанные с тем, как он выглядит на экране.

Чтобы создать спрайт в Unity, мы должны снабдить движок текстурой .

Давайте сначала создадим нашу текстуру. Получите стандартный файл изображения, такой как PNG или JPG, который вы хотите использовать, сохраните его, а затем перетащите изображение в область ресурсов Unity.

Затем перетащите изображение из активов в иерархию сцен . Вы заметите, что как только вы отпустите кнопку мыши, в списке появится новый GameObject с именем вашей текстуры. Теперь вы также увидите изображение в центре экрана в режиме просмотра сцены .

Давайте рассмотрим следующие моменты при создании спрайта —

  • Перетаскивая из внешнего источника в Unity, мы добавляем актив .

  • Этот актив является изображением, поэтому он становится текстурой.

  • Перетаскивая эту текстуру в иерархию сцены, мы создаем новый GameObject с тем же именем, что и у нашей текстуры, с прикрепленным Sprite Renderer.

  • Этот рендерер спрайтов использует эту текстуру для рисования изображения в игре.

Перетаскивая из внешнего источника в Unity, мы добавляем актив .

Этот актив является изображением, поэтому он становится текстурой.

Перетаскивая эту текстуру в иерархию сцены, мы создаем новый GameObject с тем же именем, что и у нашей текстуры, с прикрепленным Sprite Renderer.

Этот рендерер спрайтов использует эту текстуру для рисования изображения в игре.

Теперь мы создали спрайт в нашей сцене.

На следующем уроке мы рассмотрим некоторые модификаторы для спрайтов, которые у нас есть.

2D текстуры — Графика в Unity 3D

Textures вселяют в ваши меши (Meshes), частицы (Particles) и интерфейсы жизнь! Это файлы изображений или видео, которые вы накладываете на объект или оборачиваете вокруг. Т.к. они очень важны, у них есть множество свойств.

Шейдеры, которые вы используете для ваших объектов, ставят некоторые требования, для которых вам нужны определённые текстуры, но основной принцип заключается в том, что вы можете поместить любое изображения в ваш проект. Если он соответствует требованиям к размеру (указан ниже), он будет импортирован и оптимизирован для использования. Это распространяется и на многослойные .psd или .tiff файлы — они будут объединены при импорте, чтобы не занимать слишком много места. Учтите, что это объединение происходит внутри Unity и может быть отключено, таким образом, вы можете продолжать сохранять и импортировать ваши PSD файлы с раздельными слоями. Объединение не затрагивает сам файл.

Свойства

Texture Inspector(инспектор текстур) выглядит несколько иначе, в отличие от большинства других:

Инспектор разделён на 2 раздела, Импортер текстур (Texture Importer и предварительный просмотр текстуры.

Texture Importer

Все текстуры исходят из файлов изображений в вашей папке проекта (Project Folder). То, как они импортируются, задаётся в импортере текстур(Texture Importer). Вы можете изменить текстуру выбрав нужный файл текстуры в оке Project View и изменивTexture Importer в инспекторе (Inspector).

Самым главным элементом инспектора является меню Texture Type, которое позволяет выбрать вам тип текстуры, которую вы хотите сделать из исходного файла изображения.

Свойство:Функция:
Texture TypeВыбор этого пункта устанавливает базовые параметры, в зависимости от предназначения вашей текстуры.
        TextureЭто самый распространённый вариант для обычных текстур.
        Normal MapВыберите это, чтобы обратить цветовые каналы в формат, подходящий для маппинга нормалей в реальном времени. См. раздел Детали в конце страницы.
        GUIИспользуйте этот вариант, если собираетесь использовать вашу текстуру для интерфейса.
        SpriteДолжен быть выбран этот вариант, если ваша текстура будет спрайтом (Sprite) в 2D игре.
        ReflectionТакже известные как Cubemaps, используются для создания отражений на текстурах. Для дополнительной информации см. Cubemap Textures.
        CookieЭтот вариант настроит вашу текстуру для использования в виде Cookie для источников освещения.
        AdvancedВыберите этот вариант, если хотите задать особые параметры для вашей текстуры и хотите получить полный контроль над текстурой.

Базовые настройки текстуры

Alpha From GrayscaleЕсли включено, то альфа-канал прозрачности будет генерироваться исходя из существующих значений света и темноты изображения.
Wrap ModeОтвечает за поведение текстуры при тайлинге:
        RepeatТекстура повторят (тайлит) саму себя
        ClampКрая текстуры растягиваются
Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях
Aniso LevelУвеличивает качество текстуры, при обзоре под большим углом. Хорошо подходит для пола и текстур земли. См. раздел Детали в конце страницы.

Normal map настройки в импортере текстур

Create from GreyscaleЕсли включено, то опции рельефности и фильтрования будут показаны.
BumpinessКонтролирует значение рельефности.
FilteringОпределяет, как рассчитывается рельефность:
        SmoothГенерирует достаточно гладкие карты нормалей.
        SharpТакже известно как Sobel-фильтр. Он генерирует карты нормалей, которые более резкие, нежели стандартные.
Wrap ModeОтвечает за поведение текстуры при тайлинге:
        RepeatТекстура повторят (тайлит) саму себя
        ClampКрая текстуры растягиваются
Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях
Aniso LevelУвеличивает качество текстуры, при обзоре под большим углом. Хорошо подходит для пола и текстур земли. См. раздел Детали в конце страницы.

Настройка GUI в импортере текстур

Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях

Настройка спрайта для импортера текстур

Sprite modeОтвечает за то, как спрайтовая графика будет извлекаться из изображения.
        SingleСпрайтовое изображение будет использоваться как единое.
        MultipleНесколько раздельных спрайтов(например, кадры анимации или раздельные элементы спрайта, которые принадлежат одному игровому персонажу) будут храниться в одном и том же изображении.
Packing TagИмя опционального атласа спрайта в который эта текстура должна быть запакована.
Pixels To UnitsКоличество пикселей ширины/высоты в изображении спрайта, которые будут соответствовать одной единицы расстояния в мировом пространстве.
PivotТочка на изображении, где определяется центр местной системы координат спрайта (центр, сверху-слева и т.д.).
Filter ModeОтвечает за способ фильтрации текстуры, когда она растягивается при трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях

Настройки курсора в импортере текстур

Wrap ModeОтвечает за поведение текстуры при тайлинге:
        RepeatТекстура повторят (тайлит) саму себя
        ClampКрая текстуры растягиваются
Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях

Настройка Reflection в импортере текстур

MappingОпределяет, как текстура будет наноситься на cubemap.
        Sphere MappedНаносит текстуру на сферический cubemap.
        CylindricalНаносит текстуру на цилиндр, используйте его, когда хотите нанести отражения на объекты, подобные цилиндру.
        Simple SphereНаносит текстуру на простую сферу, деформируя отражения, в то время как вы её вращаете.
        Nice SphereНаносит текстуру на сферу, деформируя текстуру, когда вы вращаете сферу, но вы всё ещё сможете увидеть обёртку текстуры.
        6 Frames LayoutТекстура содержит 6 изображений собранных в один из стандартных раскладок для cubemap, крестом или последовательностью (+x -x +y -y +z -z) и изображения могут быть либо в горизонтальной, либо вертикальной ориентации.
Fixup edge seamsУдаляет визуальные артефакты на границах стыка изображений, которые будут видны с небольшим бликом.
Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях
Aniso LevelУвеличивает качество текстуры, при обзоре под большим углом. Хорошо подходит для пола и текстур земли. См. раздел Детали в конце страницы.

Интересный способ добавить кучу визуальных деталей в ваши сцены, это использовать Cookies — черно-белые текстуры, которые вы можете использовать для придания освещению определённого вида. Это великолепно для создания движущихся облаков и создания впечатления густой листвы. Страница Свет содержит больше информации об этом, но главной частью этого является то, что для использования текстуры в роли куков, вам лишь надо установить Texture Type на Cookie.

Настройки Cookie в импортере текстур

Light TypeТип освещения, к которому будет применяться текстура (это могут быть Spotlight, Point или Directional). Для Directional света эта текстура будет тайлиться, так что, таким образом, в инспекторе текстур вы должны установить Edge Mode в Repeat; для SpotLights вы нужно сохранять края текстуры полностью чёрными, чтобы получить должный эффект. В импортере текстур установите Edge Mode в Clamp.
Mapping(Только для Point light) Опции для нанесения текстура на сферическую проекцию Point light источника.
        Sphere MappedНаносит текстуру на сферический cubemap.
        CylindricalНаносит текстуру на цилиндр, используйте его, когда хотите нанести отражения на объекты, подобные цилиндру.
        Simple SphereНаносит текстуру на простую сферу, деформируя отражения, в то время как вы её вращаете.
        Nice SphereНаносит текстуру на сферу, деформируя текстуру, когда вы вращаете сферу, но вы всё ещё сможете увидеть обёртку текстуры.
        6 Frames LayoutТекстура содержит 6 изображений собранных в один из стандартных раскладок для cubemap, крестом или последовательностью (+x -x +y -y +z -z) и изображения могут быть либо в горизонтальной, либо вертикальной ориентации.
Fixup edge seams(Только для Point light) Удалят визуальные артефакты на краях стыка изображений.
Alpha from GreyscaleЕсли включено, то альфа-канал прозрачности будет генерироваться исходя из существующих значений света и темноты изображения.

Настройки Lightmap в импортере текстур

Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях
Aniso LevelУвеличивает качество текстуры, при обзоре под большим углом. Хорошо подходит для пола и текстур земли. См. раздел Детали в конце страницы.

Расширенные настройки текстуры в импортере

Non Power of 2Если размер текстуры не является степенью двойки, это будет определять поведение при масштабировании во время импорта. См. раздел “Детали” в конце страницы.
        NoneРазмер текстуры останется неизменным.
        To nearestВо время импорта текстура будет масштабирована в ближайший размер являющийся степенью двойки. Например, текстуры размером 257×511 станут 256×512. Учтите, что PVRTC форматы требуют квадратные текстуры (ширина равна высоте), таким образом финальный размер будет увеличен до 512×512.
        To largerВо время импорта текстура будет масштабирована в ближайший размер являющийся степенью двойки. Например, текстуры размером 257×511 станут 512×512.
        To smallerВо время импорта текстура будет масштабирована в ближайший размер являющийся степенью двойки. Например, текстуры размером 257×511 станут 256х256.
Generate Cube MapГенерирует cubemap из текстуры используя различные методы генерации.
        SpheremapНаносит текстуру на сферический cubemap.
        CylindricalНаносит текстуру на цилиндр, используйте его, когда хотите нанести отражения на объекты, подобные цилиндру.
        SimpleSpheremapНаносит текстуру на простую сферу, деформируя отражения, в то время как вы её вращаете.
        NiceSpheremapНаносит текстуру на сферу, деформируя текстуру, когда вы вращаете сферу, но вы всё ещё сможете увидеть обёртку текстуры.
        FacesVerticalТекстура, содержащая шесть граней куба, расставленные в вертикальную полосу в порядке +x -x +y -y +z -z.
        FacesHorizontalТекстура, содержащая шесть граней куба, расставленные в горизонтальную полосу в порядке +x -x +y -y +z -z.
        CrossVerticalТекстура, содержащая шесть граней куба, расставленные в вертикально ориентированный крест.
        CrossHorizontalТекстура, содержащая шесть граней куба, расставленные в горизонтально ориентированный крест.
Read/Write EnabledВключите это, чтобы получить доступ к данным текстуры из скриптов (GetPixels, SetPixels и другиеTexture2D функции). Учтите, что, копирование данных текстуры будет проведено, удваивая необходимое количество памяти для ассета текстуры. Используйте это только в случаях крайней необходимости. Это является вариантом только для DTX сжатых текстур, другие типы сжатых текстур не являются читаемыми. По умолчанию отключено.
Import TypeСпособ интерпретации данных изображения.
        DefaultСтандартная текстура.
        Normal MapТекстура, которая считается Normal map (включает дополнительные опции)
        LightmapТекстура, которая считается Lightmap (выключает дополнительные опции)
Alpha from grayscale(Только в стандартном режиме) Генерирует альфа канал из информации о яркости из изображения.
Create from grayscale(Только в режиме Normal map) Создаёт карту, основываясь на информации о яркости изображения.
Bypass sRGB sampling(Только в режиме Default) Использует определённые цветовые значения из изображения, вместо компенсации гаммы (полезно, когда текстуры используются для интерфейса, или используются для расшифровки не графических данных)
Generate Mip MapsВключите, чтобы активировать генерацию мип-мапов. Мап мапы — это уменьшенные версии текстуры, которые используются, когда на экране текстура представлена в очень маленьком размере. См. раздел “Детали” в конце страницы.
In Linear SpaceГенерирует мип-мапы в линейном цветовом пространстве.
Border Mip MapsВыберите, чтобы избежать просачивания цветов за пределы мипмапов низкого уровня. Используется для Light cookies (см. ниже).
Mip Map FilteringДля оптимизации качества изображения доступно 2 способа фильтрации мип-мапов:
        BoxСамый простой способ это затухание мипмапов — уровни мипов становятся глаже и глаже по мере уменьшения размера.
        KaiserАлгоритм резкости Кайзера работает на мип-мапах по мере их уменьшения размера. Если на расстоянии текстуры слишком размытые, то попробуйте эту опцию.
Fade Out MipmapsВключите, чтобы мип-мапы плавно становились черно-белыми по прогрессу мип уровней. Это используется для Detail карт. Самый левый мип, это самый первый уровень мипа на переходе в серые цвета. Самый правый определяет мип уровень, где текстура будет полностью выцветшей.
Wrap ModeОтвечает за поведение текстуры при тайлинге:
        RepeatТекстура повторят (тайлит) саму себя
        ClampКрая текстуры растягиваются
Filter ModeОтвечает за то, как текстура фильтруется, если её растянуло при 3D трансформациях:
        PointВблизи текстура становится более пиксельной
        BilinearВблизи текстура становится более размытой
        TrilinearКак и Bilinear, но текстура также размывается и на разных мип уровнях
Aniso LevelУвеличивает качество текстуры, при обзоре под большим углом. Хорошо подходит для пола и текстур земли. См. раздел Детали в конце страницы.

Переопределения для разных платформ

Когда вы собираете игру для разных платформ, вам следует подумать о разрешении текстур для целевой платформы, размере и качестве. Вы можете установить стандартные настройки и затем их изменить под определённую платформу.

Стандартные настройки для всех платформ.

Max Texture SizeМаксимальный размер импортированной текстуры. Художники, зачастую, предпочитают работать с огромными текстурами — уменьшите текстуру до подходящих размеров.
Texture FormatКакое внутреннее представление используется для текстуры. Это компромисс между размером и качеством. В примерах ниже мы покажем финальный размер внутриигровой текстуры размером 256х256:
        CompressedСжатая RGB текстура. Это наиболее часто встречающийся формат для Diffuse-текстур. 4 бита на пиксель (32 КБ для 256×256 текстуры).
        16 bitTruecolor низкого качества. Имеет 16 уровней красного, зелёного, синего и альфы.
        TruecolorTruecolor высшего качества. 256 КБ на 256×256 текстуру.

Если у вас в Texture Type указан Advanced, то тогда у меню Texture Format будут разные значения.

Texture FormatКакое внутреннее представление используется для текстуры. Это компромисс между размером и качеством. В примерах ниже мы покажем финальный размер внутриигровой текстуры размером 256х256:
        RGB Compressed DXT1Сжатая RGB текстура. Это наиболее часто встречающийся формат для Diffuse-текстур. 4 бита на пиксель (32 КБ для 256×256 текстуры).
        RGBA Compressed DXT5Сжатая RGB текстура. Это главный формат для Diffuse и Specular текстур. 1 byte/пиксель (64 КБ для 256×256 текстуры).
        RGB 16 bit65 тысяч цветов без альфа канала. Сжатые DXT форматы используют меньше памяти и обычно выглядят лучше (128 КБ для 256х256 текстуры).
        RGB 24 bitTruecolor, но без альфа канала (192 КБ для 256х256 текстуры).
        Alpha 8 bitАльфа канал высокого качества, но без цветов (64 КБ для 256х256 текстуры).
        RGBA 16 bitTruecolor низкого качества. Имеет 16 уровней красного, зелёного, синего и альфы. Сжатые DXT форматы используют меньше памяти и обычно выглядят лучше (128 КБ для 256х256 текстуры).
        RGBA 32 bitTruecolor с альфа каналом — это высшее качество. 256 КБ на 256х256 текстуру. Требует достаточно много места. Большую часть времени DXT5 предлагает приемлемое качество при маленьком размере файла. Главное его применение для Normal тексту, т.к. DXT сжатие зачастую несёт с собой заметную потерю качества.

ios

Texture FormatКакое внутреннее представление используется для текстуры. Это компромисс между размером и качеством. В примерах ниже мы покажем финальный размер внутриигровой текстуры размером 256х256:
        RGB Compressed PVRTC 4 bitsСжатая RGB текстура. Это наиболее распространённый формат для Diffuse текстур. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGBA Compressed PVRTC 4 bitsСжатая RGBA текстура. Это основной формат используемый для Diffuse и Specular control текстур или Diffuse текстур с прозрачностью. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGB Compressed PVRTC 2 bitsСжатая RGB текстура. Формат более низкого качества подходящий для Diffuse-текстур. 2 бита на пиксель (16 КБ для 256х256 текстуры).
        RGBA Compressed PVRTC 2 bitsСжатая RGBA текстура. Форматы более низкого качества подходят для diffuse и specular control текстур. 2 бита на пиксель (16 КБ для 256х256 текстуры).
        RGB Compressed DXT1Сжатая RGB текстура. Этот формат не поддерживается на iOS, но сохраняет обратную совместимость с проектами стационарных платформ.
        RGBA Compressed DXT5Сжатая RGBA текстура. Этот формат не поддерживается на iOS, но сохраняет обратную совместимость с проектами стационарных платформ.
        RGB 16 bit65 тысяч цветов без альфа канала. Использует больше памяти чем PVRTC форматы, но может быть подходящим для интерфейса или чётких текстур без градиентов. 128 КБ для 256х256 текстуры.
        RGB 24 bitTruecolor, но без альфа канала (192 КБ для 256х256 текстуры).
        Alpha 8 bitАльфа канал высокого качества, но без цветов (64 КБ для 256х256 текстуры).
        RGBA 16 bitTruecolor низкого качества. Имеет 16 уровней красного, зелёного, синего и альфы. Использует больше памяти чем PVRTC форматы, но может быть удобен, если вам нужен точный альфа канал. 128 КБ для 256х256 текстуры.
        RGBA 32 bitTruecolor с альфа каналом — это высшее качество. 256 КБ для 256х256 текстуры. Требует достаточно много места. Обычно PVRTC форматы предлагают приемлемое качество с весьма маленьким размером.
Compression qualityВыберите Fast для более высокой производительности, Best для лучше качества изображения и Normal для баланса.

Android

Texture FormatКакое внутреннее представление используется для текстуры. Это компромисс между размером и качеством. В примерах ниже мы покажем финальный размер внутриигровой текстуры размером 256х256:
        RGB Compressed DXT1Сжатая RGB текстура. Поддерживается Nvidia Tegra. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGBA Compressed DXT5Сжатая RGBA текстура. Поддерживается Nvidia Tegra. 6 бит на пиксель (64 КБ для 256х256 текстуры).
        RGB Compressed ETC 4 bitsСжатая RGB текстура. Это стандартный формат текстуры для проектов на Android. ETC1 является частью OpenGL ES 2.0 и поддерживается всеми OpenGL ES 2.0 графическими процессорами. Не поддерживает альфа-каналы. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGB Compressed PVRTC 2 bitsСжатая RGB текстура. Поддерживается графическими процессорами Imagination PowerVR. 2 бита на пиксель (16 КБ для 256х256 текстуры).
        RGBA Compressed PVRTC 2 bitsСжатая RGBA текстура. Поддерживается графическими процессорами Imagination PowerVR. 2 бита на пиксель (16 КБ для 256х256 текстуры).
        RGB Compressed PVRTC 4 bitsСжатая RGB текстура. Поддерживается графическими процессорами Imagination PowerVR. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGBA Compressed PVRTC 4 bitsСжатая RGBA текстура. Поддерживается графическими процессорами Imagination PowerVR. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGB Compressed ATC 4 bitsСжатая RGB текстура. Поддерживается графическими процессорами Qualcomm Snapdragon. 4 бита на пиксель (32 КБ для 256х256 текстуры).
        RGBA Compressed ATC 8 bitsСжатая RGBA текстура. Поддерживается графическими процессорами Qualcomm Snapdragon. 6 бита на пиксель (64 КБ для 256х256 текстуры).
        RGB 16 bit65 тысяч цветов без альфа канала. Использует больше памяти чем сжатые форматы, но может быть подходящим для интерфейса или чётких текстур без градиентов. 128 КБ для 256х256 текстуры.
        RGB 24 bitTruecolor, но без альфа канала (192 КБ для 256х256 текстуры).
        Alpha 8 bitАльфа канал высокого качества, но без цветов (64 КБ для 256х256 текстуры).
        RGBA 16 bitTruecolor низкого качества. Стандартный вид сжатия для текстур с альфа-каналом. 128 КБ для 256х256 текстуры.
        RGBA 32 bitTruecolor с альфа каналом — это высшее качество сжатия для текстур с альфа каналом (256 КБ для 256х256 текстуры).
Compression qualityВыберите Fast для более высокой производительности, Best для лучше качества изображения и Normal для баланса.

Пока вы не нацелены на определённое оборудование, вроде Tegra, мы рекомендуем использовать ETC1 сжатие. Если есть надобность, вы можете хранить внешний альфа канал и в то же время извлекать пользу из отпечатка текстуры поменьше. Если вы определённо намерены хранить альфа канал в текстуре, то RGBA 16-бит — вид сжатия поддерживаемый всеми производителями оборудования.

Текстуры можно импортировать из DDS файлов, но на данный момент поддерживается только DXT или несжатый пиксельный формат.

Если ваше приложение использует сжатие текстур, текстуры будут разжаты в RGBA 32 и храниться в памяти вместе со сжатыми. Таким образом, в данном случае вы теряете время на разжатие текстур и теряете память, храня из дважды. Также может быть негативное влияние на производительность рендеринга.

Flash

FormatФормат изображения
        RGB JPG CompressedДанные RGB изображения, сжатые в JPG формат.
        RGBA JPG CompressedДанные RGBA изображения(т.е. с альфа каналом), сжатые в JPG формат.
        RGB 24-bitНесжатые данные RGB изображения, 8 бит на канал
        RGBA 32-bitНесжатые данные RGBA изображения, 8 бит на канал

Детали

Поддерживаемые форматы

Unity может прочесть следующие форматы файла: PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT. Стоит заметить, что Unity может без проблем импортировать многослойные PSD и TIFF файлы. При импорте они будут автоматически объединены, но это произойдёт в самих ассетах, таким образом, вы ничего не потеряете, если будете нативно использовать эти типы файлов. Это важно, т.к. это вам позволяет иметь по одной копии на текстуру, которую вы используете и в Photoshop, и в приложении для 3D моделирования, и в Unity.

Размеры текстур

В идеале размеры текстуры и в высоту, и в ширину должны быть степенью двойки. Вот эти размеры: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 и т.д. пикселей. Текстуры не обязаны быть квадратными, другими словами, ширина может не равняться высоте. Учтите, что каждая платформа может наложить своё ограничение на размер текстуры.

В Unity возможно использовать текстуры и других (не равных степени двойки — “NPOT”) размеров. Текстура NPOT-размера обычно использует немного больше памяти может медленнее читаться графическим процессором, так что для производительности лучше всего использовать размеры степеней двойки везде, где только можно. Если платформа или графический процессор не поддерживает текстуры NPOT размера, то тогда Unity изменит их размеры до ближайших, равных степени двойки, что потребует ещё больше памяти и сделает загрузку медленнее (на практике, это всегда случается при сборке под Flash и с некоторыми более старыми Android устройствами). Обычно надобность в использовании текстур NPOT размеров возникает только при создании интерфейса.

NPOT ассеты текстур могут быть отмасштабированы во время импорта используя опцию Non Power of 2, видимой, когда в Texture Type установлен Advanced.

UV Mapping

При нанесении(маппинге) 2D текстуры на 3D модель, проходит похожая на оборачивание операция. Это называется UV mapping и этот процесс производится в приложении для 3D моделирования. Внутри Unity вы можете изменить размер текстуры и передвинуть её используя материалы. Изменение размера Normal и Detail текстур особенно полезно.

Mip Maps

Mim Maps (мип-мипы) — список уменьшающихся по прогрессии версий изображения, используемые для оптимизации производительности в реальном времени при работе с 3D движками. Объекты, расположенные далеко от камеры, используют уменьшенные версии текстур. Использование мип мапов требует на 33% больше памяти, но если их не использовать, то тогда может быть сильное падение производительности. Вас всегда следует использовать мипмапы для внутриигровых текстур; единственные исключения — текстуры, которые никогда не будут маленькими на экране (например, GUI текстуры).

Normal Maps (карты нормалей)

Карты нормалей используются для шейдеров с их использованием, чтобы у низкополигональных моделей создать эффект, что они содержат больше деталей. Unity использует карты нормалей закодированными в виде RGB изображения. У вас также есть вариант генерации карты нормалей из черно-белой карты высот изображения.

Detail Maps (карты деталей)

Если вы хотите создать террейн, вы обычно используете главную текстуру, чтобы показать, где трава, гравий и т.п. Если вам террейн приличного размера, то всё это будет очень размытым. Detail текстуры скрывают этот факт добавлением мелких деталей к текстуре по мере приближения к ней.

При рисовании Detail текстур, нейтральный серый — невидимый, белый — делает текстуру в 2 раза ярче, а чёрный делает текстуру полностью чёрной.

Reflections (Cube Maps)

Если вы хотите использовать текстуры для карт отражения (например, использовать встроенные Reflective шейдеры), вам понадобится использовать Cubemap текстуры.

Anisotropic filtering (Анизотропная фильтрация)

Анизотропная фильтрация увеличивает качество текстуры видимой под высоким углом, немного увеличивая нагрузку рендеринга (нагрузка полностью идёт на видеокарту). Обычно увеличение уровня анизотропии является неплохой идеей для текстур земли и пола. В меню Quality Settings анизотропную фильтрацию можно применить ко всем текстурами или полностью отключить её.

Нет анизотропии (слева)/ Максимальная анизотропия (справа) применённая для текстуры земли

Оптимизация 2D игр на Unity

Этот пост будет периодически дополняться и обновляться.
Обновлено 09.10.2020

На Youtube куча уроков по созданию простейших 2D игр на Unity. Реально, сделать неплохой платформер можно за день, при наличии опыта и готовых ассетов. Но многие начинающие игроделы сделав проект и протестировать его на ПК, с ужасом наблюдают как их творение тормозит на мобильном устройстве.

В мануалах, что встречаются в сети, большинство советов собрано к версии Unity 4.6+, кроме того, они почти все на английском, что для некоторых является преградой. В этом посте, я постарался собрать те моменты, которые помогли мне избавится от лагов на iOS и Android. Но важно понимать — не все можно решить лишь настройками, очень важна и архитектура приложения, и подготовленные текстуры, и знание более оптимальных алгоритмов.

Что нужно предпринять, чтобы повысить производительность, поднять FPS, снизить CPU?

1. Кешируем все!

Все, что будет использоваться больше одного раза лучше закешировать. Операции типа GameObject.Find() или GetComponent() достаточно ресурсозатратны, а если они вызываются где-нибудь в цикле или в Update (), то производительность может упасть.

void Awake () {
	_cachedTransform = transform;
}
 
void Update () { 
	_cachedTransform.localPosition = _newPosition;		
}

Не используйте Resources.Load () каждый раз когда нужно в рантайме загрузить что либо, это тоже дорогая операция. Лучше при старте закешировать и работать с кешем. Ну и конечно, объединяйте в префабы.

2. Настройки графики

В Unity есть 6 стандартных пресетов настройки качества графики. Но так как мы говорим про оптимизацию для 2D и для мобильных устройств, то все что выше Simple нет смысла ставить. Конечно, если у вас есть какие-то специфические моменты, частицы, и т. д., то с параметры можно поэкспериментировать найдя оптимальный баланс.

3. Используем FrameRate

По-умолчанию FrameRate равен 30. И зачастую этого бывает достаточно. Но например, при создании UI где есть прокручивающие списки и движущие элементы, может появится дрожание или шлейф. Я это заметил при тестировании на iPhone, поэтому вручную повысил FrameRate. А понижая FrameRate на сценах или игровых меню, где ничего не двигается, можно значительно снизить CPU, а следовательно продлить жизнь батарее устройства. Пользователи не любят когда игра сжирает аккумулятор за час.

public int _frameRate = 60;

void Start () {
	#if UNITY_IOS
		QualitySettings.vSyncCount = 0;
	#endif
}

void Update () {
	#if UNITY_IOS
		if (_frameRate != Application.targetFrameRate)
			Application.targetFrameRate = _frameRate;
	#endif
}

4. Атлас текстур

Определенно, нужно упаковывать все свои спрайты в атласы. Для этого есть как встроенный инструмент Sprite Packer, так и продвинутый TexturePacker. Для работы встроенного упаковщика, достаточно задавать теги в настройках импорта, объединяя текстуры и спрайты по смыслу и месту использования.

Таким образом уменьшается количество вызовов отрисовок ваших спрайтов. Проверить как идет отрисовка можно с помощью встроенного инструмента Frame Debugger.

5. Используем пул объектов

GameObject.Instantiate () — очень дорогая операция! Если есть возможность не использовать ее в процессе игры — не используйте. Для большого количества однотипных объектов надо использовать пул объектов. Один раз инициализировав определенное количество, например пуль, они будут использоваться снова и снова, вместо создания и уничтожения каждый раз. Урок по пулу объектов и готовый шаблон, для начала будет достаточно.

6. Меньше Update — больше событий

Метод Update () вызывается каждый кадр, FixedUpdate () в некоторых случаях еще чаще. Если у вас в этих местах происходит много различных проверок и действий, это можно сказаться на производительности. Я использую событийную модель: вместо проверки условия в Update (), когда происходит какое-либо действие, отправляется событие, а в нужном месте это событие «слушается» и обрабатывается в зависимости от переданных параметров. Для этого можно использовать менеджер событий о котором я писал ранее.

7. Выключаем неиспользуемые компоненты

Деактивируйте объекты которые не попадают в камеру и которые не видно на сцене. Это также повысит производительность. Можно использовать вот такой хак, чтобы автоматически деактивировать объекты которые выходят за определенные границы.

8. Настройки билда

Билд под конкретную платформу, тоже можно оптимизировать. Например, если акселерометр не используется в игре, его лучше вообще отключить. Кроме того, я не использую автовыбор графического API, а задаю его сам убирая все остальные, опять же, если вы не используете какие-то специфические функции из OpenGLES 3.0, а так второй версии вполне хватает, она уже давно протестирована. Включаем статичный и динамический батчинг, а для Android многопоточный рендеринг. Для iOS включаем Script Call Optimization в Fast but no Exceptions, но тут момент — если будет какое-то исключение, то игра крашится.

9. Используем Profiler

Не стоит обделять вниманием профайлер. Обязательно протестируйте свою игру и посмотрите, в какие моменты идет максимальная нагрузка. Эти места нужно оптимизировать в первую очередь. Большинство ответов можно найти на stackoverflow.com или форуме Unity, просто загуглив название метода который тратит больше всего ресурсов.

10. Использование материала для UI Image и SpriteRenderer

Если у вас сложный интерфейс и много компонентов, особенно UI Image, то они существенно будут влиять на FPS. Чтобы повысить производительность, улучшить плавность анимаций, можно применить такой хак: там где вы не используете маски, у картинок нужно задать материал Sprites-Default. Если это сделать вместе с маской, то маска не сработает и получите примерно такой варнинг:

Material Sprites-Default doesn’t have _Stencil property

Чтобы убрать эту ошибку нужно немного изменить стандартный шейдер, сделать новый материал и применить его там где есть маска, тогда все сработает. Ссылка на измененный шейдер.
Цена плавности — повышение CPU 🙁

11. Уменьшаем размер текстур

Отличная утилита которая позволяет снизить потребления памяти для текстур до 3х раз. Как это работает и ссылка на Github, в статье на Хабре.

12. Практическое руководство по оптимизации Unity игр

Подойдет как для 2D, так и для 3D. Много полезной информации которую в документации вряд ли найдешь. Тут и про инструменты, и про опыт. Рассказывает специалист по эксплуатации из Unity Technologies — очень интересно. Узнал про memory profiler и то, что Camera.main не закеширована О_О. Обязательно смотреть всем.

13. Используем оптимизированный код

Снова хочется посоветовать набор оптимизированных скриптов от Leopotam. Коллекции, сериализация, векторы и многое другое. Настоятельное рекомендую, к изучению и использованию.

14. Используем одинаковые материалы

Если на объектах стоят разные материалы, они не будут батчится и будет больше вызовов отрисовки. Соответственно, нужно по возможности использовать как можно меньше разных шейдеров и материалов. Для понимания, как работает начальная оптимизация графики 2D, на Lynda.com есть небольшой курс.

15. Размеры атласов и спрайтов

Для применения сжатия спрайтов на мобильных устройствах нужно использовать атласы с размерами кратными степени 2, т. е. 1024х1024, 2048х2048.

16. Используйте UI Profiler

В Unity 2017 появился UI Profiler! Крутая штука, теперь можно выяснить почему в интерфейсе много вызовов отрисовки, увидеть какие материалы на объектах и всё это оптимизировать. Особенно актуально, если у вас сложные интерфейсы со множеством элементов, которые например, прокручиваются в ScrollRect.

17. Уголок оптимизатора

На сайте Unity появился специальный раздел посвященный оптимизации — Optimization corner. Там и про UI, и профайлеры, и основные ошибки, в общем, стоит ознакомиться.

18. Несколько советов по оптимизации UI

Раннее уже упоминали про Camera.main, но в новой статье описаны ещё несколько интересных особенностей оптимизации UI.

19. Сборник советов от FunCorp

Хорошая статья про оптимизацию UI. Многое уже описано тут, но есть и замечания по новым компонентам, например TextMeshPro.

20. Оптимизация UI без кода

Статья от Banzai Games про основные способы не делать неправильно Unity UI. Есть и интересные замечания. Зачем только снова про древний текстовый компоненты говорить… Думаю уже все перебрались на TMP.

21. Оптимизация мобильных 3D-проектов

Хорошая статья про оптимизацию в 3D. Многое подойдет и для 2D. Рассмотрены все аспекты и UI, и текстуры, шейдеры, батчинг и т. д.

22. Топ-10 ошибок в оптимизации Unity

Хороший вебинар от юнитеков, рассмотрены частые ошибки совершаемые при оптимизиции, обзор инструментов по оптимизации, примеры с пояснениями.

Пока все. Тут не было про физику, потому что пока я ее не использовал. Возможно, в будущем добавлю. Пишите в комментариях ваши проверенные способы оптимизации для 2D игр под Unity.

Учимся делать 2D-игры с нуля

Курсы и туториалы по созданию двумерных игр — вторая статья из цикла «Разработка».

116 508

просмотров

Автор: Дмитрий Старокожев. Начал программировать на пятом курсе университета, влюбился в Objective-C и разработку под iOS, после чего попал в Pixonic. Работает ведущим разработчиком на проекте War Robots, а в свободное время преподаёт.

Вероятно, в ближайшее время кто-то из читателей этого цикла статей напишет первую строчку кода своего будущего прототипа. Потому что с движком мы уже определились и переходим к практике.

Учить программированию в одной статье нет смысла. К тому же, руководств в интернете множество. Многие наверняка будут делать свои первые прототипы в 2D — на этой теме и сконцентрируемся сегодня.

Если вы решили делать сразу в 3D, не спешите закрывать страницу — знания всё равно пригодятся. Приступим.

2D. Звучит олдскульно, правда? В наши дни разработка двумерных игр приобретает какой-то особый шарм. Чувствуешь себя ценителем, которому открылась недоступная другим истина. Но одного чувства прекрасного недостаточно — у разработки в 2D есть множество нюансов.

Очевидно, что главная особенность двухмерных игр — отсутствие третьего измерения. Как определить, кто ближе к зрителю: машина, куст или огромный боевой робот? Чтобы решить эту проблему, во всех 2D-движках предусмотрен механизм сортировки спрайтов — то есть двумерных графических объектов — по оси Z. Он может называться Z-order или Sorting Layers — в любом случае, с его помощью можно перемещать объекты со слоя на слой.

Другими словами, проблема уже решена за нас. Можно не тратить силы на изобретение велосипеда, а обратить свое внимание на особенности конкретных движков и жанров.

Звук и анимация

Для разработки прототипа звуки и анимация в большинстве случаев не так важны. Но нужно понимать, что работа с ними в 2D значительно отличается от 3D. В трёхмерном мире анимация скелетная: у каждой модели есть «скелет» (rig). Двигая его участки, разработчик анимирует модель.

А в 2D анимация создаётся покадрово: нужно создать атлас изображений, чтобы они стали последовательностью кадров анимации (sprite sheet). Уолт Дисней всё делал кистью и роллером, и это были шедевры (с). Этим же способом можно создавать очень красивых рисованных персонажей. Как в Cuphead, которая разрабатывалась на Unity.

Cuphead

А вот со звуком в 2D всё проще. Если при отрисовке мира отсутствие третьего измерения накладывает ограничения, то работа со звуком, наоборот, упрощается. Не нужно учитывать расстояние от слушателя (персонажа в игре) до источника звука — слушателем всегда будет выступать сам игрок.

Но нужна ли вообще прототипу музыка? Не думаю, что можно дать однозначный ответ (как и с анимацией). Давайте посмотрим на Hidden Folks. Это не просто 2D-игра, а настоящее произведение искусства.

Весь звук в Hidden Folks состоит из странных похрюкиваний и притопываний её разработчика, что само по себе USP — уникальное торговое предложение игры. Каждое прикосновение к экрану смартфона заставляет улыбнуться. Ладно, если запись похрюкиваний вам не подходит, в Asset Store Unity можно найти огромное количество платных и бесплатных ассетов для прототипа, а иногда и для релизной версии игры.

С чего начать

Рекомендации по выбору жанра можно прочитать в статье прошлого цикла. Здесь же мы будем говорить о некоторых путях, по которым можно пойти начинающему разработчику. Кому-то кажется, что вариантов не так много и обязательно надо закончить профильный университет с хорошей профессурой. Но если копнуть глубже, то обнаруживается бесконечный океан знаний, которые лежат прямо перед носом — остается только ухватиться за предоставленную интернетом возможность. Из доступного на ум сразу приходят:

  • Туториалы.
  • Онлайн-курсы.

Туториалы (tutorial) отличаются от курсов тем, что дают чёткий алгоритм действий для воспроизведения результата. Они не выходят за рамки поставленной задачи и отлично подходят, когда нужно сделать что-то конкретное, пока не пропал энтузиазм.

Туториалы

При первом поиске браузер выдаст миллионы ссылок с видеоуроками, статьями и готовыми проектами. Я подобрал несколько хороших вариантов по разным игровым жанрам. К тому же, среди других работ авторов можно найти ещё больше годного контента.

Есть YouTube-канал Brackeys. На нём — отличное вводное видео о том, с чего начать разработку платформера с плиточной графикой (tile based). Если сложно воспринимать на слух, можно включить английские субтитры.

Автор ролика приводит много примеров существующих проектов и объясняет, чем отличаются два различных подхода к созданию двумерных игр: sprite и tile based. В плейлистах канала можно найти староватый, но не потерявший актуальность туториал по созданию полноценного 2D-платформера с нуля — пошагово и со всем кодом, который можно повторить у себя и получить такой же результат.

На канале интересно практически каждое видео: даже если вы не планируете прямо сейчас врываться в разработку, стоит посмотреть хотя бы ролики о том, что нового появляется в Unity от версии к версии. Кстати, некоторые выпуски спонсирует сама Unity Technologies.

Еще один канал от энтузиаста — N3K EN. Можно найти ролики как по отдельным механикам или основам C # и Unity, так и плейлисты по разработке проектов с нуля. Например, создание прототипа Fruit Ninja за четыре часа в режиме реального времени со всем кодом.

Если учиться по видеороликам не очень нравится, есть хороший туториал в виде полноценной книги на английском языке. Она проведёт вас от установки Unity пятой версии до конца разработки двумерного скролл-шутера.

Наконец, есть официальные туториалы от Unity. Видео сопровождаются текстовыми описаниями и даже листингами программного кода. В процессе обучения создаётся roguelike RPG в tile based мире.

Чтобы в точности повторить результат, Unity сразу предлагает бесплатно скачать все ассеты этого проекта. Очень удобно и не надо ломать голову над тем, где взять симпатичные спрайты, а не разноцветные прямоугольники. В последнем ролике вы даже научитесь реализовывать управление персонажем под сенсорные экраны мобильных устройств.

Принимаясь за изучение нового туториала, не стоит волноваться о том, какую версию движка использует автор.

Unity везде ведёт себя похожим образом, а функции движка пятой версии доступны и в самой последней. Конечно, инструменты совершенствуются, но авторы обучающих материалов редко копают настолько глубоко, так что об этом можно не беспокоиться.

Курсы

Если нужно подтянуть навыки программирования, то на арену выходит старый и проверенный игрок — Code School. Всё происходит прямо в интерфейсе сайта, который выглядит свежо и удобно. И не чувствуешь на затылке укоризненный взгляд Лобачевского со старого портрета над доской с графиком дежурств. Точно стоит обратить внимание хотя бы на бесплатные курсы, чтобы понять, насколько удобен такой формат обучения.

Есть официальные курсы от Unity, не надо далеко ходить. Кажется, что они и дальше готовы инвестировать в это направление (а после курсов можно еще получить сертификат).

У GeekBrains есть два отличных курса, разбитых по уровням сложности. Раз уж мы говорим о 2D-играх, нас интересует первый. Оба курса требуют определенной алгоритмической подготовки, программированию там не учат, только разработке на Unity.

Вы научитесь делать игры в 2D буквально с нуля: на первом уроке установите движок, а на восьмом уже запустите проект на Android. Вы даже можете заметить меня в списке преподавателей и случайно попасть на мой поток.

Хотите узнать, насколько глубока кроличья нора? Я падаю, стул тоже падает, здесь всё в 2D, и мне это очень нравится. Присоединяйтесь.

Домашнее задание

Наступает время самостоятельной работы. Пора писать код своей первой игры!

  • Определите главную механику. Например, у Tower Defence это строительство башен и волны врагов.
  • Найдите туториал по главной механике или по жанру в целом.
  • Реализуйте главную механику на практике, используя примитивную графику.

О нюансах 3D-игр и туториалах для них поговорим отдельно — в следующей статье.

Это статья из нашего большого проекта с vc.ru. Если выполнять все задания, можно — ни много ни мало — научиться делать видеоигры. И выиграть лимитированное издание PS4 Pro в конце каждого цикла статей.

Цикл «Разработка»:

Как создать 2D-платфомер на Unity с нуля. Курс для инди-разработчиков.

Melee и разрушаемые объекты.
Реализуем механику холодного оружия. Дополняем код и соответствующие контейнеры в префабе персонажа. Реализуем механику разрушаемых пропсов.

Домашка: самостоятельное повторение этапов лекции, сборка уровня с новой механикой
Время: 1 час лекция, 30 минут домашка

Модель данных игрока и текущей сессии.
Рассказываем о ScriptableObject как о хранилище данных и настроек. Проектируем и реализуем модель данных игрока, привязываем эти данные к игре. Реализуем бочку со взрывчаткой, которая ранит персонажа при ее взрыве. Дополнительное задание: на основе материалов с этой и предыдущей лекции реализовать механику аптечки.

Домашка: самостоятельное повторение этапов лекции, реализовать механику собираемого зелья здоровья
Время: 1 час лекция, 30 минут домашка

Мобы и базовый AI.
Рассказываем о неигровых персонажах и добавляем простой контроллер моба который который ранит персонажа при приближении. Рассказываем об агро рэнже и базовых поведениях.

Домашка: самостоятельное повторение этапов лекции, сборка уровня с новой механикой
Время: 1 час лекция, 30 минут домашка

Range атаки.
Рассказываем что такое проджектайл и настройки Bullet в разрезе физики и детекции коллизий. Реализуем рэнж оружие игрока (пистолет). Доп. задание: реализовать дробовик.

Домашка: самостоятельное повторение этапов лекции, реализация спецатаки «буря клинков»
Время: 1 час лекция, 30 минут домашка

Стреляющие противники и стратегии ИИ.
На основе компонентов и предыдущей лекции реализуем стреляющего моба. Рассказываем о стратегиях и стэйт машинах для AI. Реализуем простую модель поведения моба.
Дополнительное задание: реализовать такое поведение моба, чтобы стреляющий переходил в рукопашную при приближении персонажа.

Домашка: самостоятельное повторение этапов лекции, реализовать моба которым обладает melee и range атаками
Время: 1 час лекция, 30 минут домашка

Инвентарь. Модель данных и связывание.
Создаем модель данных инвентаря и ячеек быстрого доступа. Реализуем собирабельные ресурсы и механики патронов, ключей.
Доп. задание: собирабельная аптечка.

Домашка: самостоятельное повторение этапов лекции, реализовать механику собираемого зелья здоровья
Время: 1 час лекция, 30 минут домашка

Звук.
Обзор звуковой подсистемы Unity, реализация эмбиента уровня, программное воспроизведение звуков, компонент воспроизведения звука.

Домашка: самостоятельное повторение этапов лекции, добавить недостающие звуки в игру
Время: 1 час лекция, 30 минут домашка

Чистый код, связность, зацепление.
Лекция на тему хорошего кода: какие есть признаки, чего нужно придерживаться. Рефакторим созданные классы.
Дополнительное задание: отрефакторить один из старых классов.

Домашка: самостоятельное повторение этапов лекции, попробовать отрефакторить уже написанный код
Время: 1 час лекция, 30 минут домашка

Оптимизация листов спрайтов для Unity

Почему вам следует использовать оптимизированные спрайты

Думаю, вы уже знаете, что листы спрайтов повышают производительность вашей игры. Но с TexturePacker
вы можете сделать даже больше.

Unity создает для вас сетки спрайтов — они уменьшают количество перерисовки, просто не отрисовывая
прозрачные пиксели. Единственная проблема — качество сгенерированной сетки:

Unity 5.2.2.f1 против TexturePacker 4.0.0

TexturePacker поставляется с новым алгоритмом для создания лучших сеток.Как вы видите выше:

  • Количество треугольников уменьшено на 69% — дополнительная мощность процессора
  • Overdraw уменьшен на 30% — дает дополнительную мощность графического процессора

Что вы узнаете в этом руководстве

TexturePacker вместе с бесплатным TexturePackerImporter создает ресурсы таблицы спрайтов, которые можно напрямую использовать из Unity.
графический редактор или через скрипты.

Спрайты доступны через стандартный API Unity с использованием
Класс спрайтов —
дополнительный код выполнения не требуется ! Таблицы спрайтов также работают с классами пользовательского интерфейса Unity, но не поддерживают оптимизированные сетки спрайтов..

Это то, что вы получите:

  • Повышенная производительность благодаря оптимизированным сеткам спрайтов
  • Простое управление спрайтами
  • Импорт / экспорт в 1 клик
  • Никакого дополнительного кода времени выполнения или библиотеки не требуется
  • Полностью автоматизированная нарезка спрайтов
  • Экономит время

Создание листов спрайтов

Чтобы создать новый лист спрайтов, просто запустите TexturePacker и перетащите каталоги .
содержащий ваши спрайты
в область спрайтов.TexturePacker сохраняет структуру каталогов в добавленном вами каталоге, что позволяет группировать и сортировать спрайты.
Новые спрайты в каталоге добавляются на лист, как только вы повторно входите в TexturePacker.

Выберите формат данных Unity — Texture2d в настройках справа.

Щелкните значок папки рядом с именем файла данных и выберите расположение в
Каталог Assets вашего проекта Unity —
сценарий TexturePackerImporter будет повторно импортировать лист спрайтов в ваш проект каждый раз, когда вы публикуете
обновленный лист с TexturePacker.

По умолчанию

TexturePacker 4 использует алгоритм упаковки «Многоугольник».
Он также хорошо работает с пользовательским интерфейсом . Изображение , но вы должны установить
useSpriteMesh до true .
Вы также можете попробовать MaxRects при упаковке многоугольных спрайтов, это может обеспечить лучшие результаты упаковки в зависимости от ваших данных спрайта.

Упаковка полигонов — сложный процесс и требует времени. Вы можете ускорить процесс двумя способами:

  • Увеличьте допуск трассировщика — это создаст менее сложные полигоны
  • Use MaxRects — TexturePacker использует прямоугольники для упаковки, но по-прежнему использует оптимизированные сетки

Unity Importer в настоящее время несовместим с функцией Multipack TexturePacker.Если спрайт упакован на другой лист, связь с текстурой разрывается.

Наконец, нажмите «Опубликовать», чтобы создать лист спрайтов.

Оптимизация полигональных сеток

Вы можете влиять на качество сеток с помощью Tracer Tolerance. Более высокие результаты толерантности
меньше вершин, но больше перерисовки.

Наилучшая ценность для вашего проекта зависит от одного фактора: использования вашего процессора и графического процессора. Каждая вершина
для расчета требуется мощность процессора. С другой стороны: каждый дополнительный пиксель увеличивает рабочую нагрузку на графический процессор.

Если ваш проект имеет высокий уровень вычислений (ЦП) (ЦП) , но у вас все еще есть ресурсы на стороне графического процессора, выберите меньшее количество вершин
увеличить допуск трассера .

Если ваш проект имеет высокий уровень графической подсистемы (GPU) , но у вас все еще есть ресурсы на стороне процессора, выберите более низкий перерасход.
уменьшить допуск индикатора .

Следите за значениями, которые TexturePacker отображает в нижней части таблицы спрайтов. В следующем примере вы видите
что уменьшение перерисовки на дополнительные 2% дает больше, чем просто дублирование количества вершин.

Настройка допуска трассировщика: количество треугольников и перерисовка

Использование спрайтов

Чтобы включить импорт листов спрайтов TexturePacker в Unity, необходимо установить TexturePacker Importer,
которую вы можете бесплатно скачать из Unity Asset Store :

Импортер TexturePacker

Сценарий расширяет возможности Unity для чтения данных таблицы спрайтов, созданных с помощью TexturePacker, и для автоматического создания собственных ресурсов Unity, которые вы можете использовать с редактором Unity.
Код скрипта запускается только во время разработки.Он не становится частью вашего продукта или игры.

Импортируйте этот пакет в свой проект Unity, открыв ссылку сверху в Unity:

Плагин поставляется с некоторыми демонстрационными активами, но он идеален, если вы установите только TexturePackerImporter.dll.

Важно, чтобы dll находилась в папке Editor, чтобы гарантировать ее автоматическую загрузку редактором Unity.

TexturePackerImporter проверяет для каждого файла текстуры наличие соответствующего файла.tpsheet файл существует.
Это файл данных, написанный TexturePacker — он используется импортером Unity для разделения текстуры на отдельные спрайты.

Ресурсы и таблицы спрайтов автоматически обновляются в Unity при обнаружении изменений. Никакого ручного вмешательства не требуется!

Используйте символ рядом с элементом текстуры для отображения отдельных спрайтов.
Чтобы создать анимацию, просто выберите кадры и перетащите их на сцену.

Теперь вы можете использовать свои спрайты как обычно, прямо из редактора.

Конечно, вы также можете получить доступ к спрайту через API сценариев:

Редактор точек поворота

TexturePacker содержит простой в использовании редактор точек поворота с предварительным просмотром анимации в реальном времени.

Выберите свои спрайты на левой панели и нажмите Настройки спрайта вверху.
панель инструментов.
Точки поворота представлены кружком. Вы можете выбрать несколько фигур и переместить все точки поворота
сразу.

Используйте предварительный просмотр Anim на верхней панели инструментов, чтобы увидеть анимацию выбранных
спрайты.Изменения в точках поворота обновляются, пока вы их редактируете.

Правая панель содержит изменения для установки абсолютных и абсолютных точек поворота.
относительные координаты. Относительные координаты используют диапазон 0 — 1, где
0/0 находится в нижнем левом углу спрайта.

Поле со списком Predefined позволяет вам выбирать из стандартных позиций в
углы и центр спрайта.

Вы также можете установить значения по умолчанию для новых спрайтов, нажав кнопку со стрелкой на правой панели.

Редактор границ (9-патч, 3-патч)

TexturePacker также поддерживает редактирование границ спрайтов — также известных как спрайты с 9 или 3 фрагментами.

Вы можете использовать эту функцию для создания масштабируемых кнопок, полос и других объектов с определенным растяжением.

Спрайт разрезается на 3 (x или y направление) или 9 частей (x и y направление).
Части спрайта по углам закреплены. Остальные растягиваются при изменении размера спрайта.

Вы можете включить настройку границы для отдельных спрайтов в настройках Sprite.
на верхней панели инструментов.

Перетащите зеленые линии, чтобы разделить 9 сегментов спрайта с 9 участками.
Переместите неиспользуемые линии вверх / вниз или влево / вправо, чтобы создать спрайты с 3 участками.

Unity UI

Классы пользовательского интерфейса Unity по умолчанию игнорируют информацию о многоугольной сетке и просто используют прямоугольные спрайты.
В результате вы можете видеть некоторые артефакты от других спрайтов с включенной упаковкой полигонов.

Простое решение избавиться от этих артефактов — установить
useSpriteMesh до true .

Применение точек поворота и размеров к объектам изображения пользовательского интерфейса

Unity автоматически копирует части свойств спрайта в изображение пользовательского интерфейса при создании.
Проблема в том, что Unity не копирует все значения и, что еще хуже, копирует
не обновлять значения при изменении таких деталей спрайта, как точка поворота или размер.

Мы добавили небольшой инструмент, который поможет вам обновить объекты UI Image.
Вы можете найти его в контекстном меню пользовательского интерфейса. Это называется Set Native Size + Pivot:

Обновление объектов изображения пользовательского интерфейса с помощью точек поворота и размеров изображения

Как мне получить доступ к спрайту на листе спрайтов из кода?

Если вы разместите спрайт на листе спрайтов, его нельзя будет загрузить отдельно, как Resources.Загрузите ("sprite01") .
Одним из преимуществ таблицы спрайтов является повышение скорости за счет загрузки всех спрайтов в кучу вместо чтения каждого файла по отдельности.
Поэтому вызов Resources.LoadAll ("my_spritesheet") — это правильный способ загрузить спрайт.
лист и получить доступ ко всем спрайтам, которые на нем находятся.

Недостатком Unity API является то, что Resources.LoadAll возвращает массив вместо словаря.
Поэтому вам нужно перебрать Sprite [] и сравнить имена спрайтов, чтобы найти конкретный спрайт.

Еще лучшим решением было бы составить словарь самостоятельно:

Как импортировать таблицы спрайтов — Unity

Настройки по умолчанию для импорта спрайтов часто делают графику размытой. Я собираюсь поговорить о том, как импортировать 2D-пиксельное искусство, чтобы ваша графика была красивой и четкой, а затем покажу вам, как нарезать листы спрайтов.

Импорт 2D-спрайтов

Создайте новый 2D-проект. Если у вас есть 3D-проект, вы все равно можете это сделать, но Unity использует лучшие настройки по умолчанию для 2D-проекта, когда вы импортируете графику, если это 2D-проект.

Создайте новую папку в папке Assets с именем Sprites . В Project Explorer щелкните правой кнопкой мыши и выберите Create> Folder .

Если у вас большой проект с большим количеством папок, я предлагаю пронумеровать папки так, чтобы ваши наиболее часто используемые были в первую очередь, и чтобы вы разработали систему. Тогда ваш мозг привыкает к порядку, в котором расположены папки, и вы тратите меньше времени на поиск файлов и папок — это помогает иметь такую ​​систему и в команде: если люди создают новые папки, это предотвращает потерю вещей.

Затем добавьте свои спрайты в новую папку Sprite .

Выберите только что импортированный спрайт. Вы увидите Import Settings в Inspector .

Выше приведены настройки импорта по умолчанию, которые вы увидите, если ваш проект — 2D. Ниже я установил свой:

Я кратко рассмотрю различные моменты и способы их установки:

  • Тип текстуры — всегда используйте спрайт для 2D-пиксельной графики
  • Sprite mode — если это одиночный спрайт, используйте Single. Если это лист спрайтов, используйте Несколько
  • Pixels Per Unit — Установите ширину и высоту вашего спрайта. Если ваш спрайт 14 x 14, установите его на 14. Если это лист спрайта, установите его на ширину и высоту одной плитки на листе. Если вы экспортировали свой спрайт больше, чем его собственный размер, скажем, в 2x или 3x, тогда вам нужно будет указать размер, который вы экспортировали, а не собственный размер.

    Ваша жизнь будет намного проще, если ваши спрайты будут квадратными.Я только один раз пробовал с прямоугольником, и в этом случае это сработало, когда я установил количество пикселей на единицу равным ширине спрайта, но не считаю это правилом, которое будет работать каждый раз, только один опыт.

  • Тип сетки — оставляю в покое
  • Extrude Edges — я оставлю это в покое
  • Pivot — Здесь расположен ваш объект. Если вы оставите точку поворота в центре и переместите спрайт на 0, 0, центр вашего спрайта будет в 0, 0
  • Generate Physics Shape — Честно говоря, я никогда не смотрел на это.В документации говорится, что он предназначен для использования с компонентом Tilemap Collider и Physics 2D . Я всегда оставлял его в покое, но вы можете попробовать отключить его, это, вероятно, оптимизирует вашу игру, если вам это действительно не нужно.
  • Advanced — Расширенные настройки никогда не трогал
  • Wrap Mode — Оставьте как есть
  • Фильтр Режим — Билинейный сделает пиксель-арт размытым. Вы хотите использовать баллов (без фильтра).
  • Максимальный размер — Уменьшение размера позволяет оптимизировать текстуры для игры и значительно повысить производительность, особенно для текстур в трехмерных играх. Я взял 3D-игру, которая почти не запускалась на PS3 из-за низкой частоты кадров, и заставил ее работать с высокой частотой кадров, просто уменьшив размеры текстур. Обычно я советую использовать как можно меньшее количество. Речь идет о буквальном размере текстуры в пикселях. Если лист спрайтов сжат, возможно, вам придется увеличить его.
  • Алгоритм изменения размера — я не трогаю
  • Формат — этого не трогаю
  • Сжатие — Установите значение «Нет» для пиксельной графики.В 3D-игре, если вы хотите оптимизировать, вы можете попробовать сжатие, если оно не оказывает заметного влияния на внешний вид вашей игры. Конечно, это частично будет зависеть от ракурса вашей камеры. Сверху вниз / от третьего лица вы меньше заметите сжатие текстур. От первого лица вы заметите это намного больше.

Если это один спрайт, все готово. Если это таблица спрайтов, читайте дальше.

Разделка листа спрайтов

Итак, вы хотите нарезать лист спрайтов. Предположим, вы правильно установили Import Settings , как указано выше, в том числе Sprite Mode , установленным на Multiple.

Затем вы хотите щелкнуть Sprite Editor в разделе Import Settings .

Появится такой экран:

Теперь нам нужно нарезать этот лист спрайтов. Щелкните вверху, где написано Slice.

Для типа проще всего использовать сетку по количеству ячеек . Просто укажите количество строк и столбцов.

Мне нравится делать мои листы спрайтов плотными, поэтому я никогда особо не использовал смещения или отступы.Я полагаю, что заполнение — это если вы добавите пустое пространство вокруг ваших плиток в листе спрайтов, и я предполагаю, что вы хотите, чтобы этот интервал был равномерным вокруг каждой плитки. Если у вас есть отступ в 1 пиксель на листе спрайтов, поместите его туда.

Наконец, как только вы установили точку поворота , нажмите срез. Имейте в виду, что вы, вероятно, захотите использовать один и тот же стиль поворота для каждого спрайта в вашей игре, иначе вы можете получить странные ошибки, так что имейте это в виду.

После того, как вы нарежете, вы должны увидеть слабые линии сетки вокруг ваших спрайтов.

Если вас устраивает сетка, нажмите Применить. Если нет, просто нарежьте его снова.

Если вы посмотрите на обозреватель проекта , где находится ваш спрайт, вы заметите маленькую стрелку рядом со своим спрайтом. Нажмите стрелку.

Вы увидите, что все ваши индивидуальные спрайты разложены. Теперь вы можете перемещать их по отдельности в свою сцену, чтобы создавать анимацию и настраивать игру.

Нравится:

Нравится Загрузка…

Unity 2D Sprite Sheet — Javatpoint

Вкратце, таблица спрайтов — это способ упаковки изображений в одно изображение, которое затем используется для создания анимации и графики спрайтов, поскольку при этом используется мало памяти и повышается производительность игр.

Создание GameObject и добавление компонентов

  • Прежде всего, нам нужен GameObject в нашей сцене. Для этого щелкните правой кнопкой мыши вкладку «Иерархия» и выберите «Создать пустой».
  • Переименуйте новый GameObject. Здесь мы переименовали его в Player.
  • Выберите GameObject Player и перейдите на вкладку Inspector. На вкладке «Инспектор» нажмите кнопку «Добавить компонент». Выберите разное -> Аниматор. Обязательно выберите «Аниматор» или «Анимация».
  • Добавьте еще один компонент, RigidBody2D. Для этого нажмите кнопку «Добавить компонент» и выберите «Physics 2D -> Rigidbody 2D».
  • Теперь в компоненте Rigidbody 2D установите Gravity Scale на ноль.

Импорт листа спрайтов

  • Прежде всего, загрузите таблицу спрайтов, которая содержит все кадры анимации для простой анимации ходьбы. Ниже приведена ссылка, откуда вы можете скачать: ken-sprite-sheet.png
  • Щелкните Активы правой кнопкой мыши и выберите Импортировать новый актив …
  • Перейдите к загруженному изображению таблицы спрайтов и нажмите кнопку импорта.
  • Выберите этот импортированный актив и в окне «Инспектор» измените параметр режима спрайтов с «Один» на «Несколько».Нажмите кнопку «Применить» на вкладке «Инспектор».

Теперь Unity будет обрабатывать ken-sprite-sheet.png как лист спрайтов с несколькими кадрами анимации.

Нарезка листа спрайтов

  • Перейдите в меню Windows и выберите 2D -> Sprite Editor.
  • Перетащите окно редактора спрайтов и закрепите его. Я закрепил свой рядом с вкладкой «Консоль».
  • Щелкните раскрывающийся список «Срез», и здесь мы видим, что по умолчанию выбраны параметры «Автоматически», «Центрировать» и «Удалить существующее».В некоторых спрайт-листах изображения упорядочены по-разному. Вот почему есть несколько вариантов на выбор.

Здесь я изменил значение Pivot с Center на Bottom. Когда вы изменяете Pivot на Bottom, это означает, что точка поворота устанавливается в центре нижней части спрайта, а тип нарезки в этом конкретном случае должен быть установлен автоматически.

  • Затем нажмите кнопку «Срез». Unity теперь разделил все спрайты. Каждый спрайт должен иметь свою ограничивающую рамку, щелкнув по ним, вы получите информацию о каждом спрайте и сможете точно настроить размеры и точки поворота.
  • Теперь нажмите «Применить» в правом верхнем углу окна редактора спрайтов.
  • Выберите объект Player на вкладке Hierarchy, а затем на вкладке Inspector нажмите кнопку Add Component. Затем выберите Rendering -> Sprite Renderer.
  • Наконец, вы сможете увидеть все свои спрайты как отдельный объект в Project -> Assets Folder.

Elringus / SpriteDicing: расширение Unity для повторного использования областей текстуры спрайтов

Этот плагин используется в Naninovel — расширении движка визуальных новинок для Unity.Проверьте это в Asset Store!

Установка

Используйте UPM для установки пакета по следующему URL-адресу git: https://github.com/Elringus/SpriteDicing.git#package или загрузите и импортируйте SpriteDicing.unitypackage вручную.

Минимальная поддерживаемая версия Unity: 2019.3

Описание

Sprite Dicing — это расширение редактора для игрового движка Unity, которое позволяет разбивать набор больших текстур спрайтов на небольшие части, отбрасывать идентичные, запекать их в текстуры атласа, а затем плавно реконструировать исходные спрайты во время выполнения для рендеринга.

Этот прием позволяет значительно уменьшить размер сборки в случаях, когда используется несколько текстур с одинаковыми областями. Рассмотрим тип игры визуального романа, где у вас есть несколько текстур для каждого персонажа, каждая из которых отображает разные эмоции; большая часть пространства текстур будет занята идентичными данными, и только небольшая область будет отличаться:

Эти исходные пять текстур имеют общий размер 17,5 МБ . После нарезания кубиками результирующая текстура атласа будет содержать только уникальные фрагменты размером всего 2.4 МБ . Теперь мы можем отказаться от пяти исходных текстур и использовать атлас для рендеринга исходных спрайтов, эффективно сжимая данные исходных текстур на 86,3% .

Как использовать

  1. Создайте актив DicedSpriteAtlas , используя команду меню Assets -> Create -> Diced Sprite Atlas , выберите его;
  2. Укажите Входную папку — каталог проекта, содержащий исходные текстуры для обработки. Вы можете просто перетащить папку из окна иерархии проекта в поле;
  3. Нажмите кнопку Build Atlas и дождитесь завершения процедуры генерации;
  4. Сгенерированные спрайты появятся внутри актива атласа; выберите любой из них и перейдите на сцену.

Опции поколения Atlas

Вы можете дополнительно настроить параметры создания атласа через окно инспектора редактора.

Опция Описание
Размер сгенерированных данных Общий объем данных сгенерированных спрайтов (вершины, UV и треугольники). Уменьшить за счет увеличения размера блока кубиков.
Поворот по умолчанию Относительное положение точки поворота в диапазоне от 0 до 1, считая от нижнего левого угла.Можно изменить после сборки для каждого спрайта индивидуально.
Сохранить оригинал Сохранять ли исходный поворот спрайтов (можно использовать для анимации).
Разделение данных спрайтов Следует ли сохранять ресурсы спрайтов в отдельной папке вместо добавления их в качестве дочерних элементов объекта атласа.
Предельный размер Atlas Максимальный размер одной сгенерированной текстуры атласа; будет генерировать несколько текстур при достижении лимита.
Силовой квадрат Сгенерированные текстуры атласа всегда будут квадратными. Менее эффективен, но необходим для сжатия PVRTC.
пикселей на блок Сколько пикселей в спрайте соответствует единице измерения в мире.
Размер кубика Размер одной нарезанной кубиками единицы.
Прокладка Размер границы пикселей, добавляемой между соседними нарезанными кубиками единицами внутри атласа.Увеличьте, чтобы предотвратить артефакты размытия текстуры (обычно появляются в виде тонких промежутков между нарезанными кубиками единицами). Большие значения потребуют больше места для текстуры, но дадут лучшие результаты по борьбе с просачиванием. В большинстве случаев рекомендуется минимальное значение 2. Когда 2 недостаточно, чтобы предотвратить кровотечение, рассмотрите возможность добавления немного UV Inset перед увеличением заполнения.
УФ-вставка Относительная вставка UV-координат нарезанных кубиками единиц. Может использоваться в дополнение к (или вместо) Padding для предотвращения артефактов размытия текстуры.Не будет занимать пространство текстуры, но более высокие значения могут визуально исказить конечный результат.
Папка ввода Папка ресурсов с исходными текстурами спрайтов.
Включить вложенные папки Следует ли рекурсивно искать текстуры во входной папке.
Добавить имена Добавлять ли имена спрайтов к имени подпапки; например: SubfolderName.SpriteName .

Все приведенные выше описания доступны в виде всплывающих подсказок при наведении курсора на соответствующие параметры конфигурации в редакторе.

UI

Чтобы использовать нарезанные кубиками спрайты в пользовательском интерфейсе (например, компонент Image ), включите Use Sprite Mesh .

Анимация

Для анимации можно использовать нарезанные кубиками спрайты. Не забудьте включить Keep Original Pivot при создании атласа, чтобы сохранить относительные положения сгенерированных спрайтов. Пример анимации нарезанных кубиками спрайтов доступен в проекте в сцене «Анимация».

Unity Addressables и SpriteAtlas: как эффективно использовать спрайты

Используете ли вы в игре Unity UI или Sprite Renderers ?

Тогда вы, возможно, слышали о функции Unity SpriteAtlas…

SpriteAtlas помогает сократить количество вызовов отрисовки в игре при рендеринге пользовательского интерфейса или спрайтов в Unity.

Тем не менее, атласы спрайтов трудно приручить, они могут откусить вам руку.

Например, одна ссылка на спрайт SpriteAtlas заставит вас загрузить весь атлас в память , даже если вам нужен только один спрайт… или даже если вы не используете активно сам спрайт.

Просто ссылка может резко увеличить использование памяти и время загрузки.

Вы хотите, чтобы высказать свое мнение о том, как Unity управляет памятью вашего атласа спрайтов, чтобы вы не ограничивали бюджет производительности игры.

Что ж, вы можете сделать именно это, используя super Unity Addressables и SpriteAtlas wombo combo .

Могут ли они работать вместе?

Вы уверены, что могут.

TL; DR :

  • Отметьте только свой SpriteAtlas как адресный актив
  • Используйте AssetLoadAsync для загрузки определенного спрайта из адресуемого атласа спрайтов…
    • Через AssetReferenceAtlasedSprite , ИЛИ
    • Через жестко закодированную переменную путь, например « myspriteatlaskey [myspritename]
  • Использовать адресацию.Отпустите, чтобы выгрузить спрайт.

Кто такой Ральф и почему Ральф в ярости?

Летом солнечный вторник.

Вы просыпаетесь и по какой-то причине чувствуете себя очень счастливым.

Вы так счастливы, что начинаете петь придуманную песню о том, как сегодня вы собираетесь улучшить архитектуру своей игры.

Решение принято. Вы больше не принимаете дерьмо.

Итак, вы читаете документацию и решаете, что делать дальше: вы собираетесь поместить тяжелые спрайты в один SpriteAtlas.

Вы думаете, что это, должно быть, отличная идея .

Как и ожидалось, вам удастся сократить:

  • Вызовы Draw на 10x
  • Использование памяти (RAM + Flash).

Итак, вы нажимаете кнопку отправить и прекращаете работу.

Это был отличный день… и вы награждаете себя пиццей с ананасами *.

* Моя итальянская подруга этого не одобряет.

Однако, когда вы собираетесь спать, ваш телефон звонит… громко.

«Чт… Кто это?» , спросите вы дрожащим голосом.

«Я твой босс, Ральф. Ты провалился в игру. Вы консервированы навсегда ».

Эти слова оглушают вас на очень долгие 5 секунд, теряя при этом одно очко выносливости.

«Ч… ай что ..?» Вы едва успеваете спросить, как по спине пробегает зловещий холод, а по лбу стекает холодный пот.

«Нет, шучу, тебя еще не уволили. Но давай сюда и исправь сбой, который происходит на экране счета », — говорит Ральф перед отключением.

Сильно трясясь с симптомами сибирской лихорадки, вы загружаете свой компьютер и ждете 10 минут, пока Unity загрузит ваш проект.

Нетерпеливый, вы попадаете на экран счета и БАМ.

Использование памяти резко возросло…

, потому что Unity загрузила весь атлас спрайтов в самый неподходящий момент.

После некоторой отладки вы поняли, что упустили единственную ссылку на спрайт, который даже не нарисовали.

Эта ссылка на спрайт была как раз там.

Улыбаясь вам.

Жду подходящего момента, чтобы навлечь на тебя неприятности.

И… тот спрайт действительно получил .

Но вы исправили это и усвоили БОЛЬШОЙ урок:

Проблема: поведение по умолчанию для Unity SpriteAtlas

Когда вы ссылаетесь на спрайт, который живет в SpriteAtlas, вы загружаете весь атлас в память, а затем используете конкретную область своего спрайта. берет.

Неоптимальная упаковка спрайтов и ссылки на них могут иметь неприятные побочные эффекты, такие как сбои и увеличение времени загрузки.

Первое, что вы захотите сделать в Unity при работе с атласами спрайтов, — это спроектировать ваши атласы спрайтов таким образом, чтобы максимизировала экономию ваших спрайтов .

Это означает, что вы хотите упаковать спрайты, которые вы используете одновременно.

Но даже если вы идеально упакуетесь спрайтами, у вас все равно могут возникнуть проблемы.

Например, вы можете загрузить весь атлас спрайтов слишком рано… когда вы действительно не можете себе этого позволить.

Представьте, что у вас есть сложная система пользовательского интерфейса с ТОННАМИ спрайтов и атласов спрайтов… такая игра, как The Sims с более чем 4000 расширений и миллионами различных спрайтов предварительного просмотра предметов.

Вот правда: вы не можете заплатить цену за одновременную загрузку всех этих атласов спрайтов в память. И все же вам нужно загружать их при определенных взаимодействиях с пользователем.

Плохие новости: простое обращение к ним на потом («на всякий случай») фактически сразу загрузит их в память, в результате чего злой финальный босс Ральф уволит вас.

Но вы можете сохранить свою зарплату: мы можем использовать Addressables для загрузки / выгрузки ваших спрайтов в атласы спрайтов по запросу , независимо от того, какие ссылки у вас есть.

Вкратце: позвольте вам выбрать, когда и как загружать эти атласы спрайтов.

Повышение уровня: Unity SpriteAtlas & Addressables

[Сначала проверьте преимущества Unity Addressables, если вы мало знаете об адресных объектах]

Загрузка / выгрузка спрайтов из атласов спрайтов становится простой с Addressables.

Просто отметьте SpriteAtlas (а не отдельные спрайты) как адресный актив.

Это комбинация wombo , которую вы ищете:

  public class AddressableImage: MonoBehaviour
{
    общедоступный AssetReferenceAtlasedSprite addressableSprite;
    IEnumerator Start ()
    {
        var image = GetComponent  ();
        yield return new WaitForSeconds (6);
        
        
        var asyncOperationHandle = addressableSprite.LoadAssetAsync  ();
        
        
        
        
        yield return asyncOperationHandle;
        изображение.спрайт = asyncOperationHandle.Result;
        
        
        yield return new WaitForSeconds (6);
        image.sprite = null;
        Addressables.Release (asyncOperationHandle);
    }
}  

Позвольте мне перевести это с C # на английский…

Он гласит:

Письмо в Unity

Уважаемый Unity,

Спасибо, что не загружаете этот атлас спрайтов автоматически, как по умолчанию.

Я знаю, что вы всегда говорите мне использовать Addressables, если я хочу контролировать жизненный цикл его памяти, так что именно это я и сделал (строка 3).

Теперь время пришло. Загрузите этот спрайт асинхронно (строки 11/14) и назначьте его этому благословенному изображению пользовательского интерфейса (строка 17).

Но не забывайте: через несколько секунд я попрошу вас выгрузить все это из памяти, когда она мне больше не понадобится (строка 22).

Спасибо,

Ваш счастливый подписчик на Unity Pro

Результат?

Вы, , платите цену только , когда она вам действительно нужна, потому что Addressables позволяет вам управлять этой памятью самостоятельно.

Сделать это теперь проще, чем когда-либо, благодаря возможности ссылки на подактив (как в инспекторе, так и в коде).

Используя адресацию со спрайтовыми атласами, вы сократите количество вызовов отрисовки и время загрузки.

Более высокая производительность, в свою очередь, привлечет ваших игроков к вашей игре.

Что дальше?

Если вы хотите узнать больше о разработке высокопроизводительных игр, которые уважают границы вашей памяти, прочтите мою публикацию Unity Addressables Tutorial.

Отличный, обещаю.

Happy #gamedev

~ Ruben

спрайтов, документация TextMesh Pro

TextMesh Pro позволяет включать спрайты в текст с помощью тегов форматированного текста. Спрайты представляют собой обычные растровые текстуры, поэтому убедитесь, что их разрешение достаточно высокое.

Sprite Asset

Для использования спрайтов необходим атлас текстур. TextMesh Pro использует собственные ресурсы для управления ими. Вы можете использовать столько атласов спрайтов, сколько захотите, но имейте в виду, что использование нескольких атласов для каждого текстового объекта приводит к множественным вызовам отрисовки для этого объекта.Таким образом, вы обычно используете один атлас.

Создание объекта-спрайта

Во-первых, вы должны предоставить текстуру атласа спрайтов. Его тип текстуры должен быть Sprite (2D и UI) , а его Sprite Mode должен быть Multiple .

Атлас спрайтов.

Используйте Unity Sprite Editor , чтобы разделить текстуру на отдельные спрайты.

Импортируйте настройки ресурса спрайта по умолчанию.

Затем вы можете создать новый актив через Asset / Create / TextMeshPro — Sprite Asset .Вы должны сделать это при выбранном атласе текстуры. Это создает новый актив спрайта на основе выбранной текстуры. Вы должны сохранить эту исходную текстуру, но вы можете изменить ее тип обратно на обычную текстуру, потому что данные спрайта Unity больше не нужны.

Использование спрайтов

Чтобы использовать ресурс спрайта, поместите его в папку Resources / Sprites . Это позволяет TextMesh Pro найти его. Вы также можете настроить один ресурс спрайта в качестве источника по умолчанию для спрайтов.

Актив Sprite.

Ресурс спрайта сохраняет ссылку на свою исходную текстуру. У него также есть собственный материал, который используется для рендеринга спрайтов.

Список спрайтов

Здесь вы можете просмотреть данные каждого спрайта в атласе и при необходимости скорректировать их. Список спрайтов разделен на страницы, по которым вы можете перемещаться с помощью кнопок вверху и внизу. Вы также можете отфильтровать список по именам спрайтов. Щелкните запись, чтобы сделать ее активной.Это позволяет редактировать, копировать и удалять его.

Актив спрайта по умолчанию.

Имя спрайтов сгенерировано автоматически. Вы можете изменить их на все, что захотите, но обязательно сделайте их уникальными. Вы можете использовать эти имена для идентификации спрайтов с помощью тегов форматированного текста, помимо их идентификатора.

Значения X , Y , W и H определяют прямоугольную область персонажа в атласе спрайтов. Смещения OX и OY управляют размещением спрайта, определяемым в его верхнем левом углу относительно его исходной точки на базовой линии.Значение ADV определяет, как далеко продвинуться вдоль базовой линии перед размещением следующего глифа. Наконец, SF — это масштабный коэффициент, который вы можете использовать для регулировки размера спрайта.

Гамасутра: Блог Рубена Торреса Бонета


Следующее сообщение в блоге, если не указано иное, было написано членом сообщества Гамасутры.
Высказанные мысли и мнения принадлежат автору, а не Gamasutra или ее материнской компании.


[Прочтите исходное сообщение в блоге на Unity Sprites: плотно прилегающие или полностью прямоугольные?]

Что выбрать для спрайтов в Unity: плотно прилегающий или полный прямоугольник ?

Вы знаете, эти графические элементы вы используете во ВСЕХ своих играх …

В конце концов, вы, скорее всего, используете рендереры спрайтов. Или, по крайней мере, изображения пользовательского интерфейса.

В этом посте вы узнаете разницу между этими двумя типами сеток.И когда использовать каждый.

Больше никаких предположений. Точно знайте, что делаете.

СОДЕРЖАНИЕ

1 Что такое тип сетки спрайтов?

2 Почему полно-прямоугольные спрайты Unity не так уж хороши

3Are Tight Sprites Superior?

4 (Несколько) причин для использования полно-прямоугольных спрайтов

5Что дальше?

Что такое тип сетки спрайтов?

Прежде чем мы начнем, я говорю об этом:

Unity Sprite Mesh Тип

Я знаю, это вариант, на который легко не обращать внимания.В конце концов, у вас есть много опций в настройках импорта спрайтов.

Тип сетки спрайта — это то, как Unity будет отображать ваш спрайт в вашей игре.

Традиционный способ их рендеринга — full rect mode. Это означает, что ваши спрайты визуализируются как полный четырехугольник с прозрачными областями.

Unity Sprite: прямоугольная сетка

Однако более эффективный подход — это построить более плотную сетку вокруг вашего спрайта .

Это означает, что вы будете визуализировать свой спрайт не как прямоугольник, а как двумерный многоугольник.

Итак, зачем вам создавать более сложные формы?

Посмотрим, почему.

Почему полно-прямоугольные спрайты Unity не так уж хороши

Хорошо, первое самое большое преимущество рендеринга полных четырехугольников …

Рисовать квад так же легко, как дышать. И для вашего процессора, и для вашего графического процессора.

Но вот самый большой недостаток …

При рисовании полных квадратов вы визуализируете обширную поверхность, полную прозрачных фрагментов .См. Предыдущее изображение: все, что находится вне круга, прозрачно … но также визуализировано.

Проблема?

Рендеринг большой поверхности влечет за собой серьезную перерисовку.

И перерисовка — один из самых серьезных убийц производительности.

Overdraw всегда охотится за невинными играми, чтобы убить их частоту кадров. Особенно опасно это на мобильном телефоне.

Что может быть лучше, чем рендеринг полного прямоугольника?

Ну, рендеринг многоугольника, который лучше соответствует вашему спрайту.Другими словами, делаем нашу форму немного более плотной 🠙 ‚

Являются ли плотные спрайты лучше?

Вы можете установить тип сетки как плотный в любом из ваших спрайтов.

Фактически, в настоящее время это должно быть значение по умолчанию.

Когда вы это сделаете, Unity нарежет ваши спрайты, чтобы вы минимизировали прозрачную область, которую вы визуализируете.

Unity Sprite: плотная сетка

Вы визуализируете меньше пикселей. Ваша графическая карта благодарит вас за более высокую частоту кадров.

Отличная сделка.

Примечание: чтобы использовать плотные сетки в изображениях пользовательского интерфейса, вам необходимо активировать опцию « Use sprite mesh » в компоненте изображения пользовательского интерфейса (кредиты yasirkula). Доступно с 2018.3.

(Несколько) причин для использования полноразмерных спрайтов

Обычно бывает ОЧЕНЬ немного случаев, когда вы должны использовать полные протезы.

Но вот несколько:

  • Производительность вашей игры составляет с привязкой к вершинам , и у вас много спрайтов на экране.
  • Ваша платформа практически не страдает от проблем с отрисовкой.

Это окупается, если отрезает прозрачные области от ваших спрайтов настолько сильно, насколько это возможно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *