UI
Конвенция названия объектов в UI
“Предлагаю называть объекты в UI не просто "как сгенерились имена, так и оставим их такими", а по их смыслу. Чтобы можно было глянуть на экран, потом на иерархию, и просто по названию найти нужный тебе элемент. Так же было бы хорошо приписывать в конец имени элемента его тип, например "StartButton", "CoinsText", "Bonus Panel". Под "Panel" предлагаю иметь ввиду просто компиляцию множества элементов в одном меню, которые связаны какими либо зависимостями, или имеют общий управляющий скрипт. И еще по поводу управляющих скриптов, лучше функционал UI тоже делить по SRP, не надо делать один единый класс для всей меню, а если и делать, то вписывать туда только ту логику, которую нельзя сделать самостоятельной” - Из стандартизации
Оптимизация UI
Всегда:
Контроль за контейнером текста. Контейнер с текстом не должен занимать большее место, чем сам текст в нём. Применяется для максимизации кол-ва батчей в UI
Если хотите отключить большую группу UI элементов, и все под общим канвасом (если нет, то можно сделать для них вложенный канвас), то лучше отключайте только этот канвас, а не сами объекты. Этим можно избежать перерисовки этих объектов
Флаг Raycast Target снимаем с компонентов (ставим false), которые не нуждаются в нажатии по ним. По дефолту юнити выставляет этот флаг в true
При создании компонента TMP, в extra settings выключайте rich text и raycast если не надо. Также включите is scale static, если размер текста не меняется
При растягивании UI элемента, не нужно изменять scale объекта, гораздо лучше вытягивать его ширину и высоту. Это исключает воздействие на дочерние объекты. Hotkey "T".
На этапе TTM:
Создание вложенных канвасов в UI у родителей динамических объектов
Создание атласа спрайтов и его настройка (с исключениями в виде больших по размеру спрайтов)
Если камера переключается на сплошную непрозрачную меню в UI, то надо отключать у камеры рендер. Это делается с помощью изменения фильтра рендера по слоям, из него надо удалить все слои (UI всё равно останется, т.к. она рендерится всегда поверх)
Скейл спрайтов (особенно в UI) везде должен быть 1, если он не меняется динамически. Спрайты с разным скейлом не батчатся
Замечания:
Прозрачность UI элементов не влияет на производительность. Unity всегда отрисовывает любой UI элемент с альфа каналом
При обновлении материала, конфигуряции рендера или трансформа UI элемента, весь канвас, в котором он находится, перерендривается заново
Элементы разных канвасов не батчатся друг с другом
Не забывайте создавать raycaster компонент для вложенных канвасов, если внутри есть на что нажимать
Last updated