34

Индикатор загрузки при помощи шейдеров

Привет, давайте поговорим о чем-нибудь симпатичном.


Предисловие.

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


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


Поехали.

Мне понадобился индикатор загрузки для длинного подгружаемого списка (список друзей). Уже привычным и естественным жестом для пользователей мобильных является комбинация 1) потянуть резиновый список 2) поглядеть на спиннер 3) в списке появляется новое содержимое.


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

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


Сделаем простой индикатор при помощи шейдеров. Делать будем в Unity, конечно.


Процесс.


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

Я взял за основу стандартный шейдер (взять можно здесь: https://unity3d.com/ru/get-unity/download/archive). Выберите в выпадающем меню пункт "Встроенные шейдеры".


Создадим материал, укажем в нем наш новый шейдер и применим его к картинке. (в моем случае, для UI).

Удалил из него все лишнее и оставил только общую структуру.


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


По сути, мы должны описать, каким цветом нужно закрасить каждую точку нашей картинки. В данном случае, нам нужно получить окрашенное кольцо, все остальные точки оставив прозрачными. Напишем что-то такое:

И получим кривое колечко.

Обратите внимание на конструкцию lerp(a, b, step (c, X)). Она часто встречается в шейдерах и является заменой условного выражения. Читается как: “Если X >= с, тогда b, иначе a”.

Можете почитать о ней подробнее тут (https://shadowmint.gitbooks.io/unity-material-shaders/conten...).


Теперь сосредоточимся на получении нужного нам эффекта вращения.

Будем изменять значение полупрозрачности в зависимости от угла:

И получим что-то такое:

Отмечу, что функция frac() возвращает часть числа после запятой. С отрицательными значениями может работать странно, кажется, у меня была такая проблема.

А еще мы определили число Пи.


Ну и под конец - немного магии. Добавим прямо в шейдер влияние времени:

Про _Time в шейдерах можете почитать в мануалах (https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html). Отмечу только, что я использовал _Time.y - это время в масштабе 1:1, прошедшее с запуска игры.


Для финализации результата я еще немного сгладил края и... “голову” кольца.


Ссылка на полный код в конце.

В игре получилось так (там добавлено немного свечения):

Заключение.


Ребятам, кто начинает - экспериментируйте.

Ребятам, кто разбирается - поправляйте!


Всем спасибо. Делайте хорошие игры.


P.S.

Конечный результат (немного сбилась табуляция, ну да ладно) - (https://github.com/imetelyov/unity-loading-ring-shader/blob/...)


Мои скромные поделки можете глянуть тут: https://vk.com/quasar.games

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

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

- Выдавать чужой труд за свой

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


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

2
Автор поста оценил этот комментарий
Спасибо, было полезно

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества