Привет. Маски можно увидеть в большинстве фото и видеоредакторов. В Фотошопе закругления, обрезки и другие подобные задачи и вовсе принято делать только с их помощью. Ведь так мы можем получить отредактированное изображение сохранив оригинал.
В Unity маски используются аналогично. В документации они описаны так:
Маска ограничивает (т. е. «маскирует») дочерние элементы формой родителя. Таким образом, если ребенок больше родителя, то будет видна только та часть ребенка, которая вписывается в родителя.
И сегодня мы рассмотрим пару стандартных масок для UI, один бесплатный ассет, который делает это немного лучше стандартных и маски для спрайтов.
Идея взята из этого видео: Unity MASKING — Ultimate Guide | Unity UI & Sprite Tutorial
Rect Mask 2D
Эта маска чётко обрезает всё, что находится за пределами родителя. Представим такую ситуацию, где в родительском прямоугольнике находится дочерний Image.
![](https://geekstand.top/wp-content/uploads/2021/10/image-8.png)
Как видите, родитель намного меньше изображения. Добавляем родителю компонент Rect Mask 2D.
![](https://geekstand.top/wp-content/uploads/2021/10/image-9.png)
Результат увидим сразу же:
![](https://geekstand.top/wp-content/uploads/2021/10/image-10.png)
Более интересный эффект можно получить, меняя параметр Softness:
![](https://geekstand.top/wp-content/uploads/2021/10/image-11.png)
![](https://geekstand.top/wp-content/uploads/2021/10/image-12.png)
А если добавить родителю свой Image, то вместо прозрачного фона мы получим плавный переход между изображениями:
![](https://geekstand.top/wp-content/uploads/2021/10/image-13.png)
Но в данном случае мы всяк получаем прямоугольную форму, что не всегда подходит. Переходим к следующему решению.
Mask
Далее нам нужен родитель с компонентом Image, который определит вид маски, и оставим тот же дочерний элемент.
Родитель:
![](https://geekstand.top/wp-content/uploads/2021/10/image-14.png)
Ребёнок:
![](https://geekstand.top/wp-content/uploads/2021/10/image-15.png)
Добавляем родителю компонент Mask:
![](https://geekstand.top/wp-content/uploads/2021/10/image-16.png)
И смотрим на более интересный результат:
![](https://geekstand.top/wp-content/uploads/2021/10/image-17.png)
Но, можно заметить, что появились очень острые углы.
![](https://geekstand.top/wp-content/uploads/2021/10/image-18.png)
Проблема этой маски в том, что результат выглядит достаточно небрежно. Помогут с этим народные умельцы. А именно mob-sakai, который сделал свою версию этой маски, но с опциями сглаживания. Об этом далее.
SoftMaskForUGUI
Найти этот ассет можно по ссылке: https://github.com/mob-sakai/SoftMaskForUGUI
Добавляем его в проект при помощи Package Manager по этой URL.
![](https://geekstand.top/wp-content/uploads/2021/10/image-19.png)
Заменяем дефолтную Mask на Soft Mask.
![](https://geekstand.top/wp-content/uploads/2021/10/image-20.png)
Дочерние элементы теперь должны наследовать Soft Maskable:
![](https://geekstand.top/wp-content/uploads/2021/10/image-21.png)
Результат вот, но появилась обводка от маски.
![](https://geekstand.top/wp-content/uploads/2021/10/image-22.png)
Это можно легко скрыть в настройках:
![](https://geekstand.top/wp-content/uploads/2021/10/image-23.png)
И теперь сравним вид без сглаживания, и с ним:
![](https://geekstand.top/wp-content/uploads/2021/10/image-24.png)
![](https://geekstand.top/wp-content/uploads/2021/10/image-25.png)
Сглаживание тоже относительное, конечно. Но мне кажется, что на камере второй вариант выглядит куда приятнее.
Sprite Mask
Варианты выше предусмотрены для UI, а вот эту можно спокойно использовать с обычными спрайтами на сцене. К примеру, для создания головоломок, где обзор ограничен. Или для игр, где нужно искать какие-то предметы.
Для наглядного теста добавим на сцену две картинки:
![](https://geekstand.top/wp-content/uploads/2021/10/image-26.png)
![](https://geekstand.top/wp-content/uploads/2021/10/image-27.png)
И пустой объект, куда добавим компонент Sprite Mask:
![](https://geekstand.top/wp-content/uploads/2021/10/image-28.png)
Теперь у нас есть маска, но нужно указать поведения для спрайтов.
Первому укажем, что его нужно рисовать снаружи маски:
![](https://geekstand.top/wp-content/uploads/2021/10/image-29.png)
А второму – внутри:
![](https://geekstand.top/wp-content/uploads/2021/10/image-30.png)
Результат:
![](https://geekstand.top/wp-content/uploads/2021/10/image-31.png)
Да, лого тут не лучшее решение. Что-то круглое будет выглядеть интереснее:
Итак. На этом с масками у меня всё. Благодаря им можно достаточно просто создать UI элементы самых разных форм, а также использовать многократно одни и те же ресурсы с разным результатом.
Очень удобно!