Меня зовут Максим Полстяной, я UI/UX Designer в Plarium Kharkiv. В этой статье я поделюсь опытом создания дизайн-системы для нашей браузерной стратегии «Войны Престолов», расскажу с чего все начиналось и какие этапы мы проходили.
![](https://habrastorage.org/r/w1560/webt/t7/wc/u7/t7wcu7xkbpjeh2mgdx86nb5utk4.png)
Перед командой стояла задача оптимизировать графические элементы и разработать удобную структуру проекта.
Игра вышла в 2012 году, со временем в нее постоянно добавлялся контент и функциональности, появлялись новые графические элементы. Тогда у каждого члена команды был свой подход к созданию дизайн-макетов, работа велась без использования гайдлайнов и библиотеки элементов.
Проанализировав проект, мы выявили ряд проблем:
Всё это негативно влияло на общий стиль игры, размер написанного кода разрастался, а это затрудняло работу над развитием проекта.
Мы решили систематизировать графический контент. Для этого нужно было обработать весь UI, а это более 1000 экранов плюс их различные состояния. В итоге путем проб и ошибок мы пришли к системе атомарного дизайна.
Перебрав UI игры, мы выделили базовые неделимые частицы интерфейса, из которых составили основные группы.
1) Элемент – базовая (неделимая) частица системы интерфейса, которая используется для создания остальных функциональных групп элементов. Может выполнять различные задачи.
![](https://habrastorage.org/r/w780q1/webt/a2/zo/ll/a2zollkrrvtpwlfbxjsc4icfv1w.jpeg)
Примеры элементов: кнопки, табы, слайдеры, текст и прочее.
2) Контрол – группа элементов, которые могут выполнять функцию управления, навигации, визуализации данных.
![](https://habrastorage.org/r/w780q1/webt/ev/ix/if/evixifolv_mspn9alr1w7_ii1cy.jpeg)
Примеры контролов: награда, пейджер, поиск по координатам и прочее.
3) Блок – логически сгруппированный набор элементов и контролов. Цель блока – группировка этих частей интерфейса для выполнения определенных задач.
![](https://habrastorage.org/r/w780q1/webt/9m/dr/om/9mdrommulvqbqawc1xpsxy1aa8o.jpeg)
![](https://habrastorage.org/r/w780q1/webt/aw/sn/tp/awsntp3u2okvgwc826z3pz1vrym.jpeg)
Примеры блоков.
4) Шаблон – это группа блоков, из которых формируются экраны для различных задач. У шаблонов может быть своя система и правила построения. Цель шаблона – хранение логики поведения для контента внутри шаблона.
![](https://habrastorage.org/r/w780q1/webt/et/y5/0l/ety50lmlegt4vhlwaffhhzdxgme.jpeg)
Пример шаблона.
5) Экран – это группы шаблонов, а также часть окна, которую мы видим в данный момент.
6) Окно – может состоять из одного или нескольких экранов.
Названия частей интерфейса подбирались так, чтобы и дизайнеры, и программисты использовали одинаковые понятия и не возникало недопониманий, которые могут привести к ошибкам. Для ваших проектов названия могут отличаться. Названия групп не так важны, как их цель и функции.
В игре было много окон всевозможных размеров, в которых слабо прослеживалась структура и иерархия. Их форматы не были стандартизированы и могли иметь нечетные размеры, что вносило трудности в работу с контентом. Это существенно осложняло или вовсе не позволяло использовать шаблоны, поэтому на разработку уходило больше времени.
Собрав все существующие окна, мы решили разделить их на три типа и прописали для каждого из них статическую ширину, а также минимальную и максимальную высоту. При выборе размеров нужно было учитывать, что одно и то же окно используется в соцсетях, браузере и десктопном приложении Plarium Play, но при этом область под игровой контент везде разная. Мы определили максимально возможный размер для окна, исходя из самой маленькой игровой области (для «ВКонтакте»).
Первый тип окна – основной. Это самые большие окна, которые являются стартовыми для любой фичи, а также открываются при взаимодействии с элементами главного экрана, включая постройки. Окна других типов открываются внутри него – они второстепенные. Это разделение отразилось на дизайне: чтобы лучше прослеживалась иерархия, дизайн рамки окон второго и третьего типа мы сделали более легким. Второй тип был разделен на два подтипа для контента разной ширины. Обычно ширину задавал блок с уже существующим артом или самый загруженный информацией. Размеры и предназначения окон можно увидеть на изображении ниже:
![](https://habrastorage.org/r/w780q1/webt/qj/m8/31/qjm831ojdmhsdzln59g3rewhl08.jpeg)
Три типа окон: главное, внутренние окна и алерт.
Мы выбрали сетку с клеткой 4х4 пикселя (один модуль) – она лучше всего подходила под наши требования. С такой сеткой можно быстро перемещать элементы на расстояния, кратные четырем, и делать нужные отступы. Например, сделать отступ на 4 клетки визуально проще, чем отсчитывать 16 пикселей. Все наши элементы и блоки имели размеры, кратные одному модулю. Функция привязки к сетке – еще один плюс такого подхода.
Для удобства верстки контента мы создали вспомогательную 12-колоночную сетку. Она позволяла гармонично располагать блоки и не высчитывать каждый раз горизонтальные расстояния. Сетка из 12 колонок очень гибкая, так как 12 делится на 1, 2, 3, 4, 6 и 12 частей. Параметры сетки: 12 колонок шириной 52 пикселя, межколонник – 12 пикселей, «уши» – по 16 пикселей.
![](https://habrastorage.org/r/w780q1/webt/qv/al/ui/qvalui-bhupiiubjfsy5oldrvuk.jpeg)
Сетка 4x4 пикселя и 12-колоночная сетка.
Для удобства работы всей команды мы решили сделать систему отступов, чтобы не задумываться, где и какие отступы/расстояния использовать. Эта система также помогла поддерживать единый стиль и иерархию контента внутри окна. Программистам было проще следовать гайдлайнам и не допускать ошибок в верстке.
Мы вывели четыре размера отступов: 4, 3, 2, 1 модуль (16, 12, 8, 4 пикселя соответственно).
4 модуля являются «охранным полем» окна, а также самым большим отступом. С добавлением новых блоков в макет (речь идет о вложенности) их охранное поле и отступ уменьшаются. Самое маленькое расстояние между контентом не должно быть меньше одного модуля, то есть самое маленькое расстояние – это 1 клетка 4x4 пикселя. Таким образом контент внутри окна подчиняется правилу близости. Пример такой структуры:
![](https://habrastorage.org/r/w780q1/webt/5a/aw/zo/5aawzos9wg9qmlxxiq_biidonvo.jpeg)
Система отступов.
![](https://habrastorage.org/r/w780q1/webt/05/ne/2h/05ne2hb2-9g2ndl30d6sajlhyvw.jpeg)
Система отступов на примере экрана «Боевой отчет».
Но в любой системе есть минусы: не всегда возможно следовать отступам на 100% из-за определенных ограничений проекта. Например, мы не могли использовать скролл в высоконагруженных окнах из-за большого пересчета данных при прокрутке. Поэтому в некоторых ситуациях приходилось отступать от системы, чтобы вместить необходимый объем контента в один экран. Но принцип близости всё равно сохраняли.
Приведем пример одного из шаблонов, для которого были написаны правила построения. Рассмотрим списки – они используются по всей игре и имеют очень разнообразное наполнение.
![](https://habrastorage.org/r/w780q1/webt/xh/3s/-r/xh3s-rj7kb9eicd3rcu0rj52p9u.jpeg)
Примеры блоков, из которых состоят списки.
Собрав все разновидности, мы разделили контент на группы с общими характеристиками:
Для каждой группы мы задали правила построения, стили, размеры элементов и модели поведения. В итоге блоки набирались из этих групп, как конструктор. Программисты создали пресеты, и скорость создания списков увеличилась в разы.
Основные правила для групп приведены ниже:
![](https://habrastorage.org/r/w780q1/webt/sd/et/zr/sdetzrguqle6sim91a5r5pxisre.jpeg)
Правила построения блоков.
![](https://habrastorage.org/r/w780q1/webt/pq/gl/yu/pqglyuvgsizcaoric0pu_venulc.jpeg)
Разновидности групп и правила размещения элементов.
В проекте было огромное количество стилей текста без какой-либо понятной иерархии. Например, мы насчитали около 10 оттенков красного для обозначения одного и того же статуса игрового объекта.
Основной шрифт игры – Korinna Normal – трудно читался в маленьком кегле. Мы решили эту проблему, добавив шрифт Roboto Medium для мелкого текста.
Мы выделили несколько текстовых стилей, разбили их на группы и задали цветовое кодирование. Благодаря этому мы смогли добавить определенные характеристики тексту, который использовался для одной и той же цели. Получилась удобная таблица:
![](https://habrastorage.org/r/w780q1/webt/un/jc/po/unjcponf8um6ueayqzrrvznmqc0.jpeg)
Таблица со стилями текста.
Также мы разработали правила сборки, построения и использования для:
Для создания такой дизайн-системы потребуется довольно много времени и ресурсов, поэтому она больше подойдет для крупных развивающихся проектов, которые будут обрастать функциональностями и дополнениями.
Из-за большого количества документации и гайдлайнов возрастает порог вступления в систему, новым членам команды требуется время на ее изучение, но результат, который дает такой подход, оправдывает все потраченные на него ресурсы.
Мы создали понятную и удобную структуру всех составляющих графических элементов проекта в Confluence.
С помощью гайдлайнов и библиотеки элементов удалось:
Наша команда осталась довольна результатами – дизайн-система оправдала возложенные на нее надежды. Она помогла решить все наши проблемы в проекте, заодно мы «освежили» графику и в некоторых случаях улучшили UX.
![](https://habrastorage.org/r/w780q1/webt/cv/7l/n7/cv7ln7xc6sonft9ts3dc0nlfg_0.jpeg)
Окно боевого отчета (до/после).
![](https://habrastorage.org/r/w780q1/webt/4d/pn/ax/4dpnaxiutzlsdtjvu_gljyiwdza.jpeg)
Окно квестов (до/после).
![](https://habrastorage.org/r/w780q1/webt/zc/eg/2r/zceg2rdfpna9lyfnqz1ppeoyhcm.jpeg)
Окно «Обитель» (до/после).
![](https://habrastorage.org/r/w780q1/webt/ef/pl/q5/efplq5yn9nxju82frlhnpazxthw.jpeg)
Окно «Альянсы» (до/после).
![](https://habrastorage.org/r/w780q1/webt/i7/f4/i7/i7f4i77t7ny3krnugrmbm4mmcbq.jpeg)
Окно «Теневой рынок» (до/после).
![](https://habrastorage.org/r/w780q1/webt/ly/hp/6n/lyhp6nwyvar6mmgbojftamce4cy.jpeg)
Окно «Магистрат» (до/после).
![](https://habrastorage.org/r/w780q1/webt/ig/a_/rt/iga_rtajrazirva9spifwppmcya.jpeg)
Окно «Магистрат», просмотр очереди постройки войск (до/после).
Copyright [2020] Plarium Global Ltd.
All rights reserved. You are not permitted to copy, reproduce, or make any use
of this article, including any images therein, without Plarium’s written permission.
![](https://habrastorage.org/webt/t7/wc/u7/t7wcu7xkbpjeh2mgdx86nb5utk4.png)
Перед командой стояла задача оптимизировать графические элементы и разработать удобную структуру проекта.
Игра вышла в 2012 году, со временем в нее постоянно добавлялся контент и функциональности, появлялись новые графические элементы. Тогда у каждого члена команды был свой подход к созданию дизайн-макетов, работа велась без использования гайдлайнов и библиотеки элементов.
Проанализировав проект, мы выявили ряд проблем:
- множественное дублирование элементов интерфейса с использованием различного дизайна для одних и тех же объектов;
- чрезмерный объем графического контента, что приводило к долгим загрузкам окон;
- отсутствие прозрачной структуры хранения контента (например, сейчас у каждой кнопки есть свое логичное название, а раньше приходилось указывать существующий экран, из которого была взята кнопка для нового макета);
- низкая скорость и точность сборки окон.
Всё это негативно влияло на общий стиль игры, размер написанного кода разрастался, а это затрудняло работу над развитием проекта.
Мы решили систематизировать графический контент. Для этого нужно было обработать весь UI, а это более 1000 экранов плюс их различные состояния. В итоге путем проб и ошибок мы пришли к системе атомарного дизайна.
Перебрав UI игры, мы выделили базовые неделимые частицы интерфейса, из которых составили основные группы.
1) Элемент – базовая (неделимая) частица системы интерфейса, которая используется для создания остальных функциональных групп элементов. Может выполнять различные задачи.
![](https://habrastorage.org/webt/a2/zo/ll/a2zollkrrvtpwlfbxjsc4icfv1w.jpeg)
Примеры элементов: кнопки, табы, слайдеры, текст и прочее.
2) Контрол – группа элементов, которые могут выполнять функцию управления, навигации, визуализации данных.
![](https://habrastorage.org/webt/ev/ix/if/evixifolv_mspn9alr1w7_ii1cy.jpeg)
Примеры контролов: награда, пейджер, поиск по координатам и прочее.
3) Блок – логически сгруппированный набор элементов и контролов. Цель блока – группировка этих частей интерфейса для выполнения определенных задач.
![](https://habrastorage.org/webt/9m/dr/om/9mdrommulvqbqawc1xpsxy1aa8o.jpeg)
![](https://habrastorage.org/webt/aw/sn/tp/awsntp3u2okvgwc826z3pz1vrym.jpeg)
Примеры блоков.
4) Шаблон – это группа блоков, из которых формируются экраны для различных задач. У шаблонов может быть своя система и правила построения. Цель шаблона – хранение логики поведения для контента внутри шаблона.
![](https://habrastorage.org/webt/et/y5/0l/ety50lmlegt4vhlwaffhhzdxgme.jpeg)
Пример шаблона.
5) Экран – это группы шаблонов, а также часть окна, которую мы видим в данный момент.
6) Окно – может состоять из одного или нескольких экранов.
Названия частей интерфейса подбирались так, чтобы и дизайнеры, и программисты использовали одинаковые понятия и не возникало недопониманий, которые могут привести к ошибкам. Для ваших проектов названия могут отличаться. Названия групп не так важны, как их цель и функции.
Окна
В игре было много окон всевозможных размеров, в которых слабо прослеживалась структура и иерархия. Их форматы не были стандартизированы и могли иметь нечетные размеры, что вносило трудности в работу с контентом. Это существенно осложняло или вовсе не позволяло использовать шаблоны, поэтому на разработку уходило больше времени.
Собрав все существующие окна, мы решили разделить их на три типа и прописали для каждого из них статическую ширину, а также минимальную и максимальную высоту. При выборе размеров нужно было учитывать, что одно и то же окно используется в соцсетях, браузере и десктопном приложении Plarium Play, но при этом область под игровой контент везде разная. Мы определили максимально возможный размер для окна, исходя из самой маленькой игровой области (для «ВКонтакте»).
Первый тип окна – основной. Это самые большие окна, которые являются стартовыми для любой фичи, а также открываются при взаимодействии с элементами главного экрана, включая постройки. Окна других типов открываются внутри него – они второстепенные. Это разделение отразилось на дизайне: чтобы лучше прослеживалась иерархия, дизайн рамки окон второго и третьего типа мы сделали более легким. Второй тип был разделен на два подтипа для контента разной ширины. Обычно ширину задавал блок с уже существующим артом или самый загруженный информацией. Размеры и предназначения окон можно увидеть на изображении ниже:
![](https://habrastorage.org/webt/qj/m8/31/qjm831ojdmhsdzln59g3rewhl08.jpeg)
Три типа окон: главное, внутренние окна и алерт.
Сетка
Мы выбрали сетку с клеткой 4х4 пикселя (один модуль) – она лучше всего подходила под наши требования. С такой сеткой можно быстро перемещать элементы на расстояния, кратные четырем, и делать нужные отступы. Например, сделать отступ на 4 клетки визуально проще, чем отсчитывать 16 пикселей. Все наши элементы и блоки имели размеры, кратные одному модулю. Функция привязки к сетке – еще один плюс такого подхода.
Для удобства верстки контента мы создали вспомогательную 12-колоночную сетку. Она позволяла гармонично располагать блоки и не высчитывать каждый раз горизонтальные расстояния. Сетка из 12 колонок очень гибкая, так как 12 делится на 1, 2, 3, 4, 6 и 12 частей. Параметры сетки: 12 колонок шириной 52 пикселя, межколонник – 12 пикселей, «уши» – по 16 пикселей.
![](https://habrastorage.org/webt/qv/al/ui/qvalui-bhupiiubjfsy5oldrvuk.jpeg)
Сетка 4x4 пикселя и 12-колоночная сетка.
Система отступов
Для удобства работы всей команды мы решили сделать систему отступов, чтобы не задумываться, где и какие отступы/расстояния использовать. Эта система также помогла поддерживать единый стиль и иерархию контента внутри окна. Программистам было проще следовать гайдлайнам и не допускать ошибок в верстке.
Мы вывели четыре размера отступов: 4, 3, 2, 1 модуль (16, 12, 8, 4 пикселя соответственно).
4 модуля являются «охранным полем» окна, а также самым большим отступом. С добавлением новых блоков в макет (речь идет о вложенности) их охранное поле и отступ уменьшаются. Самое маленькое расстояние между контентом не должно быть меньше одного модуля, то есть самое маленькое расстояние – это 1 клетка 4x4 пикселя. Таким образом контент внутри окна подчиняется правилу близости. Пример такой структуры:
![](https://habrastorage.org/webt/5a/aw/zo/5aawzos9wg9qmlxxiq_biidonvo.jpeg)
Система отступов.
![](https://habrastorage.org/webt/05/ne/2h/05ne2hb2-9g2ndl30d6sajlhyvw.jpeg)
Система отступов на примере экрана «Боевой отчет».
Но в любой системе есть минусы: не всегда возможно следовать отступам на 100% из-за определенных ограничений проекта. Например, мы не могли использовать скролл в высоконагруженных окнах из-за большого пересчета данных при прокрутке. Поэтому в некоторых ситуациях приходилось отступать от системы, чтобы вместить необходимый объем контента в один экран. Но принцип близости всё равно сохраняли.
Подробнее о шаблонах
Приведем пример одного из шаблонов, для которого были написаны правила построения. Рассмотрим списки – они используются по всей игре и имеют очень разнообразное наполнение.
![](https://habrastorage.org/webt/xh/3s/-r/xh3s-rj7kb9eicd3rcu0rj52p9u.jpeg)
Примеры блоков, из которых состоят списки.
Собрав все разновидности, мы разделили контент на группы с общими характеристиками:
- с иконками;
- с прогресс-барами;
- текстовые;
- с кнопками;
- группы с User control (контроль взаимодействия с игроком);
- mix-группа, в которой может быть несколько элементов из предыдущих групп.
Для каждой группы мы задали правила построения, стили, размеры элементов и модели поведения. В итоге блоки набирались из этих групп, как конструктор. Программисты создали пресеты, и скорость создания списков увеличилась в разы.
Основные правила для групп приведены ниже:
![](https://habrastorage.org/webt/sd/et/zr/sdetzrguqle6sim91a5r5pxisre.jpeg)
Правила построения блоков.
![](https://habrastorage.org/webt/pq/gl/yu/pqglyuvgsizcaoric0pu_venulc.jpeg)
Разновидности групп и правила размещения элементов.
Типографика
В проекте было огромное количество стилей текста без какой-либо понятной иерархии. Например, мы насчитали около 10 оттенков красного для обозначения одного и того же статуса игрового объекта.
Основной шрифт игры – Korinna Normal – трудно читался в маленьком кегле. Мы решили эту проблему, добавив шрифт Roboto Medium для мелкого текста.
Мы выделили несколько текстовых стилей, разбили их на группы и задали цветовое кодирование. Благодаря этому мы смогли добавить определенные характеристики тексту, который использовался для одной и той же цели. Получилась удобная таблица:
![](https://habrastorage.org/webt/un/jc/po/unjcponf8um6ueayqzrrvznmqc0.jpeg)
Таблица со стилями текста.
Также мы разработали правила сборки, построения и использования для:
- кнопок,
- всевозможных карточек (карточка покупки юнита, турнирная и прочие);
- тултипов и нотификаций;
- прогресс-баров;
- контролов;
- панелей.
Что стоит учитывать при разработке системы?
- Локализация. Наша игра доступна на семи языках. Нужно было учитывать это при выборе ширины кнопок или пространства для текста. Например, слово на немецком могло быть длиннее того же слова на английском в три раза.
- Использование одного и того же окна на разных платформах. Учитывайте это, когда будете выбирать размер окна.
- Общая терминология внутри команд разработки. Важно, чтобы гайдлайны были написаны на языке, понятном всем участникам процесса.
- Соблюдение размеров, кратных 4. Это позволит легко расставлять блоки и элементы по клеточкам модульной сетки, а также делать нужные отступы, не высчитывая пиксели.
- Большое количество контента, который нельзя будет заменить в проекте, даже если он морально устарел. Изменение дизайна некоторых элементов или UX может вызвать недовольство игроков, которые за много лет привыкли к определенному отображению интерфейса.
- Ограничения по использованию скролла в окнах.
Для создания такой дизайн-системы потребуется довольно много времени и ресурсов, поэтому она больше подойдет для крупных развивающихся проектов, которые будут обрастать функциональностями и дополнениями.
Из-за большого количества документации и гайдлайнов возрастает порог вступления в систему, новым членам команды требуется время на ее изучение, но результат, который дает такой подход, оправдывает все потраченные на него ресурсы.
Итог
Мы создали понятную и удобную структуру всех составляющих графических элементов проекта в Confluence.
С помощью гайдлайнов и библиотеки элементов удалось:
- существенно сократить время на разработку и повысить качество сборки новых фич;
- упростить новым членам UI-команды процесс создания дизайна;
- сократить количество вопросов и улучшить коммуникацию между дизайнерами и программистами.
Наша команда осталась довольна результатами – дизайн-система оправдала возложенные на нее надежды. Она помогла решить все наши проблемы в проекте, заодно мы «освежили» графику и в некоторых случаях улучшили UX.
Сравнение экранов до и после переработки
![](https://habrastorage.org/webt/cv/7l/n7/cv7ln7xc6sonft9ts3dc0nlfg_0.jpeg)
Окно боевого отчета (до/после).
![](https://habrastorage.org/webt/4d/pn/ax/4dpnaxiutzlsdtjvu_gljyiwdza.jpeg)
Окно квестов (до/после).
![](https://habrastorage.org/webt/zc/eg/2r/zceg2rdfpna9lyfnqz1ppeoyhcm.jpeg)
Окно «Обитель» (до/после).
![](https://habrastorage.org/webt/ef/pl/q5/efplq5yn9nxju82frlhnpazxthw.jpeg)
Окно «Альянсы» (до/после).
![](https://habrastorage.org/webt/i7/f4/i7/i7f4i77t7ny3krnugrmbm4mmcbq.jpeg)
Окно «Теневой рынок» (до/после).
![](https://habrastorage.org/webt/ly/hp/6n/lyhp6nwyvar6mmgbojftamce4cy.jpeg)
Окно «Магистрат» (до/после).
![](https://habrastorage.org/webt/ig/a_/rt/iga_rtajrazirva9spifwppmcya.jpeg)
Окно «Магистрат», просмотр очереди постройки войск (до/после).
Copyright [2020] Plarium Global Ltd.
All rights reserved. You are not permitted to copy, reproduce, or make any use
of this article, including any images therein, without Plarium’s written permission.