Обновление: 31 декабря, 2018 года
Содержание статьи устарело. У Unity, с момента написания статьи, вышло огромное количество обновлений. И теперь можно настраивать SortingLayer во многих местах, включая системы частиц, например.
В Unity3D версии 4.3 появился долгожданный 2D фреймворк, принесший с собой механизм работы со спрайтами, за отображение которых отвечает “Sprite Renderer”. Как работать со спрайтами есть множество туториалов и видео в сети, я же хочу остановиться на двух важных настройках, которые есть в “Sprite Renderer”, и проблеме использования 3D объектов Unity в 2D играх.
Важные настройки это: “Sorting Layer” и “Order in Layer”:
Зачем нужны эти два параметра? Если кратко, в 2D фреймворке не используется z-координата, она никак не влияет на порядок отображения объектов в сцене. За порядок отображения отвечает другой механизм – механизм слоев. Можно управлять порядком отображения спрайтов в сцене путем назначения спрайту определенного слоя (“Sorting Layer”), а так же, при необходимости, порядок отображения внутри конкретного слоя можно настраивать с помощью параметра “Order in Layer”.
Порядок отображения же самих слоев в сцене настраивается в окне редактирования слоев:
Но Unity3D содержит в себе массу интересного функционала, который был сделан для 3D, и который хочется использовать в 2D. К примеру, систему частиц. Допустим, в 2D сцене вы захотите использовать эффекты из системы частиц и поместите один из эффектов на 2D сцену. Тут вы получите проблему некорректного отображения эффекта (может выражаться в разном – частичное отображение эффекта, мерцание, полная невидимость и другое). Манипуляции с z-координатой не приведут к нужному результату, так как при отображении 2D сцен z-координата никак не влияет на порядок отображения.
Эта проблема легко решается. Свойства “Sorting Layer” и “Order in Layer” были добавлены не классу “SpriteRenderer”, а базовому классу “Renderer”, от которого наследуются другие классы, отвечающие за отображение, но в качестве настроек были вынесены только для класса “SpriteRenderer”, а в других не доступны. Поэтому, нам нужно написать собственный компонент, который будет устанавливать слой и порядок в слое для любого рендера.
Для себя я написал такой компонент, который можно взять по ссылкам: SortingLayerSettings (сам компонент) и SortingLayerSettingsEditor (расширение редактора для установки параметров).
Добавив оба скрипта в проект, можно на любой объект добавить компонент “SortingLayerSettings” и настроить порядок отображения объекта в 2D сцене. Например для “3D Text”:
И легко управлять порядком отображения:
Таким образом, мы можем легко использовать объекты Unity3D в 2D сценах. Механизм прекрасно работает! На личном опыте я использовал систему частиц и 3D текст в нескольких проектах. Предполагаю, что и с другими типами объектов не будет проблем.
Практически, компонент “SortingLayerSettings” не нужен после того, как мы указали нужный слой для объекта. Но на момент разработки приложения в нем есть необходимость, так как может понадобиться во время работы игры поэкспериментировать со слоями или посмотреть, какому слою принадлежит тот или иной объект. Но когда игра релизится есть смысл удалить все “SortingLayerSettings” со всех объектов.
Чел спасибо за статью! Оч помогло!!