# 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 компонент для вложенных канвасов, если внутри есть на что нажимать
