Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!

Как создать эффекты огня, взрыва, ледяных шипов и летящих пил.

Создание визуальных эффектов — это тонкая работа: разработчик должен сделать их правдоподобными, понятными и впечатляющими.

DTF поговорил с ведущим художником по 3D и эффектам из студии Highcore Games Владимиром Тихановым и выяснил, какие принципы должны лежать в основе визуальных эффектов.

Художник подробно описал процесс создания нескольких анимаций для Tanks A Lot! — он рассказал про огнемёт, огненную стену, ледяные шипы, взрыв и циркулярные пилы. Если вы хотите воссоздать эти эффекты в Unity, то можете использовать этот текст в качестве туториала.

Визуальные эффекты, про которые пойдёт речь в этом тексте

Оглавление

Общие принципы создания эффектов

Все эффекты в игре должны соответствовать нескольким ключевым правилам.

С визуальной точки зрения эффекты не должны быть слишком сложными — следите за тем, чтобы их форма и цвет были лаконичными. Также учитывайте, что они должны легко читаться на экране любого мобильного устройства. Постарайтесь избавиться от любого визуального шума — сразу выделите в эффекте главное и делайте упор на этом.

Избегайте слишком резких переходов, появлений и исчезновений. Используйте 12 принципов анимации, особенно «смягчение начала и завершения движения» (slow in & slow out), «расчёт времени» (Timing), «преувеличение и утрирование» (Exaggeration). Это хорошо сказывается на динамике эффекта, делает его более выразительным и убедительным.

Силуэты спрайтов должны быть максимально простыми. Это нужно, чтобы общая композиция выглядела стилизованно, а форма легко читалась даже на небольшом экране. Один и тот же спрайт можно многократно использовать в разных эффектах, поэтому его цвет лучше настраивать в Particle System. Также постарайтесь не использовать более двух цветов.

Удачные примеры по форме и цвету
Удачные примеры по форме и цвету

В дизайне эффектов отдавайте предпочтение крупным и средним формам — мелкие можно использовать в качестве акцентов. Например, эффект выстрела может состоять из крупной формы вспышки со свечением, двух-трёх клубов дыма среднего размера и пяти-шести маленьких искр.

Когда вы вносите правки в эффект, ориентируйтесь на динамику самой игры и на объекты, с которыми он связан. Также следите, как он выглядит через игровую камеру.

Теперь затронем техническую сторону. В Highcore Games все эффекты создаются при помощи Particle System в Unity — стандартных средств почти всегда достаточно. Кастомные шейдеры используйте с осторожностью — только если это действительно нужно для решения задачи. Код в таких ситуациях лучше писать собственноручно, чтобы отсечь всё лишнее.

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

Обычно в Highcore Games используют три шейдера для эффектов: Mobile Additive, Mobile Alpha Blended и Unlit Shader для мешей с текстурой.

Чем больше материалов используется, тем больше draw-calls и тем меньше fps в игре. Поэтому постарайтесь ограничиться тремя материалами для каждого типа шейдеров. Все спрайты и текстуры для эффектов храните в отдельном атласе. Чтобы выбрать нужный спрайт, используйте блок Texture Sheet Animation как показано в примере ниже.

Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!

Также художники из Highcore Games стараются не делать слишком много систем частиц. Их количество сильно зависит от конкретного эффекта: если это выстрел или попадание, то достаточно двух-трёх, если это летящий проджектайл, то можно применить от двух до четырёх, а взрыв может состоять из четырёх-пяти. Каждая система занимает определённое количество оперативной памяти устройства. Это касается даже тех систем, в которых ничего не происходит.

Когда эффект готов, разработчики выделяют в нём критически важные системы, а остальное отключают для low-end устройств — для этого есть специальный скрипт.

Огнемёт и стена огня

У огнемёта есть две ключевые атаки, для каждой из которых нужен отдельный эффект:

  • обычная атака — струя пламени из ствола орудия;
  • дополнительная атака — стена огня, которая наносит урон по области.

Первый шаг при создании эффекта — собрать и исследовать референсы, чтобы понять, как он должен выглядеть. Вы можете искать референсы, например, на Pinterest (вот пример поиска для огнемёта).

Затем нарисуйте скетч. Набросок должен быть простым и грубым, но при этом передавать суть задумки. Это черновой вариант, поэтому используйте только упрощённые формы для изображения объектов. И не тратьте слишком много времени на проработку наброска. Постарайтесь сделать так, чтобы на эту задачу у вас уходило не более 20 минут.

Эскиз для огнемёта
Эскиз для огнемёта

Следующий важный шаг — рисование частиц (спрайтов), из которых будет состоять эффект. Проще всего нарисовать их в Photoshop. Для эффекта огнемёта понадобится три вида частиц. Первые нужны для создания следа дыма. В реальности дым состоит из частиц, появившихся в результате горения, и пара, поэтому его поведение и физическая природа очень похожи на газообразное вещество.

Чтобы дым в игре был правдоподобным, разработчики использовали только закруглённые формы без углов и резких переходов. В результате частицы дыма похожи на неровный четырёхлистник.

Спрайты для этого эффекта нарисованы в Photoshop
Спрайты для этого эффекта нарисованы в Photoshop

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

Второй тип частиц — огонь. В реальности он ассоциируется с остроконечными всполохами. Однако в этом случае эффект выглядит лучше, если все частицы имеют похожую форму — это позволяет добиться единства и цельности всех элементов композиции.

Чтобы сделать их больше похожими на огонь, художники подобрали подходящие цвета и разукрасили спрайты. Также они добавили небольшой жёлтый блик внутри частицы, чтобы создать эффект огненных всполохов.

Третий тип частиц нужен для создания ореола свечения, который характерен для огня. Спрайт — обычный круговой градиент белого, который становится прозрачным по краям. По словам Тиханова, при правильном масштабе и аддитивном шейдере это выглядит не хуже эффектов пост-процессинга, которые слишком ресурсозатратны для мобильных устройств.

Когда спрайты нарисованы, разработчики собирают их в атлас, который используется в Unity. В своей работе стоит использовать атласинг текстур для эффектов, потому что у такого подхода есть несколько больших преимуществ:

  • оптимизация — вместо множества текстур у вас остаётся одна для всех эффектов, кроме тех, для которых используется покадровая анимация. Это существенно сокращает размер билда;
  • это позволяет удобно редактировать текстуры и следить за тем, чтобы они соответствовали стилю проекта;
  • можно использовать ограниченное число материалов, что важно для поддержания высокой производительности рендеринга.

Атласы удобно собирать в Substance Designer: там можно легко определить размер атласа и количество ячеек для будущих спрайтов. Всё зависит от проекта, но обычно хватает 2048 пикселей и 12х12 ячеек: в такой атлас можно поместить 144 текстуры — этого должно хватить для мобильного проекта. Также для Substance Designer есть бесплатный плагин, который позволяет легко управлять атласом.

Принцип работы плагина

Следующий важный этап — создание и настройка систем частиц в Unity.

Эффект огнемёта состоит из трёх систем частиц:

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

Каждая система частиц создаётся отдельно, хотя у них есть некоторые общие черты.

Всё начинается с создания Particle System
Всё начинается с создания Particle System
Нужно настроить форму таким образом, чтобы вылетающие из ствола частицы постепенно расходились в стороны
Нужно настроить форму таким образом, чтобы вылетающие из ствола частицы постепенно расходились в стороны
Затем задаём основные параметры системы: время жизни частицы, её скорость, пространство симуляции. Параметры можно взять со скриншота
Затем задаём основные параметры системы: время жизни частицы, её скорость, пространство симуляции. Параметры можно взять со скриншота

Лучше задавать не конкретное значение, а диапазон, чтобы система брала случайные числа из выбранного промежутка. Это сделает эффект более живым и вариативным.

Чтобы определить, сколько частиц будет создаваться в единицу времени, нужно ввести значение в поле Emission
Чтобы определить, сколько частиц будет создаваться в единицу времени, нужно ввести значение в поле Emission
Далее настраиваем график изменения размера частиц в течение времени их жизни. Благодаря этому самые крупные частицы будут появляться где-то в середине пути частиц
Далее настраиваем график изменения размера частиц в течение времени их жизни. Благодаря этому самые крупные частицы будут появляться где-то в середине пути частиц

Теперь можно заняться визуальной частью эффекта и заменить стандартные спрайты на ранее отрисованные. Для этого в поле Render назначаем нужный материал — так как он лежит в атласе, надо указать номер в поле Texture Sheet Animation. После этого эффект должен выглядеть примерно так.

Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!

Из-за того, что все спрайты повёрнуты в одну сторону, эффект выглядит неестественным. Исправить это можно с помощью поля Start Rotation в основных настройках системы — достаточно заменить значение на случайное от 0 до 360. Также настройте цвет частиц в поле Color Over Lifetime.

Вот такой градиент хорошо подойдёт: сверху задаётся прозрачность, снизу — цвета
Вот такой градиент хорошо подойдёт: сверху задаётся прозрачность, снизу — цвета

Следующая система частиц — сам огонь. Чтобы создать его, нужно скопировать уже созданную систему дыма, заменить градиент в поле Color Over Lifetime и выбрать нужный спрайт в поле Texture Sheet Animation.

Это уже похоже на огнемёт
Это уже похоже на огнемёт

Третья система частиц, глоу, нужна, чтобы подчеркнуть свечение. Для этого используем спрайт с размытыми краями в аддитивном шейдере.

Вот так выглядит градиент для третьей системы
Вот так выглядит градиент для третьей системы

Свечение наиболее активно только в начале эффекта, но постепенно теряет интенсивность. Также эти частицы становятся намного крупнее к концу жизни.

Финальный вид огнемёта
Финальный вид огнемёта

С основной атакой закончили. Теперь можно переходить к дополнительной.

Чтобы создать эффект, понадобятся три подобных спрайта
Чтобы создать эффект, понадобятся три подобных спрайта

Опять начинаем со скетча.

Проджектайл летит по прямой и поджигает землю. Через некоторое время огонь плавно затухает
Проджектайл летит по прямой и поджигает землю. Через некоторое время огонь плавно затухает

Полёт проджектайла определяется кодом, а с визуальной точки зрения эффект состоит из трёх систем частиц:

  • след дыма с World Simulation Space;
  • глоу с Local Simulation Space;
  • пламя с World Simulation Space.
Для каждой системы нужен свой вариант Simulation Space
Для каждой системы нужен свой вариант Simulation Space

Ключевая особенность таких эффектов в том, что они привязаны к объекту который находится в движении. Само перемещение зависит от анимации, которая настраивается в редакторе или при помощи кода.

В этом случае движение снаряда влияет на геймплей и зависит от баланса игры. Но для тестирования эффекта всегда можно повесить на его родительский объект простую анимацию из Unity Animation Editor. Так вы сможете быстро увидеть все изменения, не создавая дополнительной логики.

Так выглядит основной проджектайл (каждая система включается с задержкой для наглядности)

Эффект горящей земли сделан из спрайтов, которые использовались для создания основной атаки. На самом деле он очень похож на обычный огонь, который встречается во многих играх. Чтобы сделать «стену огня», нужно создать несколько префабов огня через равные промежутки. Главное отличие «стены огня» от огнемёта в том, что частицы поднимаются вверх по оси Y c помощью параметра Gravity Modifier.

Достаточно выставить значение «-1»
Достаточно выставить значение «-1»
Так выглядит эффект стены огня без поджигающего проджектайла
Финальная версия эффекта

Ледяная пушка

У ледяной пушки тоже есть две атаки, но особого внимания заслуживает дополнительная — она создаёт ледяные шипы, вырастающие из-под земли.

Так выглядит финальная версия эффекта

С точки зрения реализации эффекты ледяной пушки и огня похожи, но главное отличие в том, что шипы совмещают 2D-спрайты и 3D-модели.

Для начала нужно смоделить ледяные шипы, так как они — центр композиции. Сделать это можно в любом 3D-редакторе — в Highcore используют Maya, но этого же можно добиться в Blender или в любом другом приложении для 3D-моделирования. Так как этих шипов будет много, а игра мобильная, то нужно использовать как можно меньше точек и полигонов. В модели Тиханова получилось 62 вершины.

Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!

Затем нужно добавить материал, который сделает шипы похожими на лёд. Для этого можно использовать всё тот же аддитивный мобильный шейдер, чтобы не просаживать fps игры чем-то сложным. Этот шейдер поддерживает Vertex Color, благодаря чему можно достичь нужного эффекта. Также цвет можно задать в 3D-редакторе.

Процесс покраски модели

После моделинга и покраски можно экспортировать готовый FBX-файл в Unity и начинать настраивать эффект.

Создаём Particle system и в поле Renderer выбираем Render Mode — Mesh. Находим нужный меш, а потом назначаем материал с аддитивным шейдером.

Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!

Далее меняем Shape на Circle, а в основных параметрах системы убираем скорость, делаем рандом по цвету и размеру (в пределах указанного диапазона), снижаем время жизни частиц. Получается что-то такое.

Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!

Теперь настроим базовую динамику. Нужно, чтобы шипы резко появлялись из-под земли и плавно исчезали. Затем этот цикл повторяется пока не истечёт время жизни системы.

Чтобы достичь этого, можно использовать банальный скейл по оси Y. Во вкладке Size Over Lifetime нужно настроить кривые по трём осям: переменная для X и Z всегда равна единице, а график по оси Y должен выглядеть следующим образом.

В нижней части картинки более детально показан график по оси Y
В нижней части картинки более детально показан график по оси Y
В динамике получается примерно такой результат

Выглядит неплохо, но недостаточно вариативности.

Добавим небольшие углы поворота для шипов
Добавим небольшие углы поворота для шипов
Затем сделаем так, чтобы градиенты немного отличались друг от друга
Затем сделаем так, чтобы градиенты немного отличались друг от друга
Также можно добавить ещё одну кривую, которая немного отличается от первой
Также можно добавить ещё одну кривую, которая немного отличается от первой
Получается такой результат

Далее можно создать дополнительные системы частиц. Добавим что-то вроде морозной дымки, чтобы подчеркнуть, что воздух вокруг шипов очень холодный — это сделает эффект более убедительным.

<p>Для этого можно набросать подобный спрайт мягкой кистью в Photoshop</p>

Для этого можно набросать подобный спрайт мягкой кистью в Photoshop

Далее создаём новую систему, снижаем до нуля скорость частиц, во вкладке Shape ставим Circle и подгоняем размер под радиус шипов. Во всех эффектах старайтесь сочетать аддитивные элементы с элементами в режиме смешивания Alpha Blend. Благодаря этому эффект будет хорошо выглядеть на любом фоне — он не будет слишком пересвеченным или затемнённым. Полученную систему нужно выставить на слой ниже, чем шипы.

Настройки Renderer
Настройки Renderer
Затем настраиваем основные параметры
Затем настраиваем основные параметры
Также добавим градиент, чтобы частицы плавно появлялись и плавно исчезали
Также добавим градиент, чтобы частицы плавно появлялись и плавно исчезали
Результат должен выглядеть примерно так

Также можно добавить меши, имитирующие плоскую корку льда — для этого нужно применить тот же подход, что и при создании шипов. Ещё можно добавить снежинки.

Финальный эффект выглядит так
Так эффект смотрится в Tanks A Lot!

Дисковая пила

Разберём ещё один интересный кейс на примере пушки, стреляющей дисками от пилы.

Вот так выглядит эффект ультимейт атаки этой пушки

Как и в случае с шипами, для начала нужно смоделировать и текстурировать центральный объект композиции — пилу. Сделать это можно в любом 3D-редакторе. Тиханов советует завести папку в проекте для моделей, которые используются в эффектах. Постепенно у вас сложится целая библиотека подобных ассетов, которые всегда можно использовать в других эффектах и играх.

Меш пилы
Меш пилы

Теперь создадим систему частиц: сразу же нужно назначить меш пилы в качестве частиц, а также выбрать такой материал, который применяется для динамических 3D-объектов — это может быть Unlit Shader или шейдер, который принимает свет, например, Diffuse или Specular.

Ещё нужно выставить Local в поле Render Alignment, чтобы управлять поворотами частиц
Ещё нужно выставить Local в поле Render Alignment, чтобы управлять поворотами частиц
Теперь нужно правильно настроить Shape- и Emission-системы. Самое важное — выставить Arc Mode в Burst Spread, чтобы частицы появлялись через равные отрезки круга
Теперь нужно правильно настроить Shape- и Emission-системы. Самое важное — выставить Arc Mode в Burst Spread, чтобы частицы появлялись через равные отрезки круга
Настроим сразу и Velocity Over Lifetime: здесь есть параметр, позволяющий запускать частицы в орбитальное вращение, что отлично подходит для этого эффекта
Настроим сразу и Velocity Over Lifetime: здесь есть параметр, позволяющий запускать частицы в орбитальное вращение, что отлично подходит для этого эффекта
Чтобы каждая пила вращалась, нужно выставить значение в соответствующей оси в Rotation Over Lifetime
Чтобы каждая пила вращалась, нужно выставить значение в соответствующей оси в Rotation Over Lifetime
Промежуточный результат

Когда само вращение пил готово, можно сделать стилизованный трейл вращения — он представляет собой полоску полигонов, на которую наложен простой спрайт в виде кругового градиента. Чтобы сделать такой эффект, нужно воспользоваться Custom Mesh и импортировать его из Maya.

Используя эту модель в качестве частицы, создадим новую систему. Снимаем галочку с вкладки Shape, потому что частицы должны всегда появляться в центре координат. Также задаём вращение во вкладке Rotation Over Lifetime.

Должно получиться примерно так

Теперь можно добавить лёгкое свечение и искры.

Можно заменить цвет пилы, чтобы игрокам было легче различать дружественные и вражеские атаки

Когда пилы сталкиваются с препятствием, они распадаются на несколько частей. Этот эффект состоит из небольшой вспышки и разлетающихся фрагментов диска.

Меш фрагмента пилы. Именно он разлетается в стороны, когда диск сталкивается с препятствием
Меш фрагмента пилы. Именно он разлетается в стороны, когда диск сталкивается с препятствием

Меш нужно импортировать, чтобы использовать в качестве частицы. Также нужно изменить некоторые настройки системы: параметры начальной скорости, гравитации и коллизии с окружением.

Вот главные параметры, на которые нужно обратить внимание
Вот главные параметры, на которые нужно обратить внимание

Чтобы осколки исчезли, нужно применить к ним обратное масштабирование.

Учимся делать визуальные эффекты: подробный туториал от разработчиков Tanks A Lot!
График в поле Size Over Lifetime должен выглядеть примерно так
График в поле Size Over Lifetime должен выглядеть примерно так

Похожий эффект можно делать с любыми разлетающимися 3D-элементами: осколками, кусками земли и так далее.

Финальный результат

Эффект взрыва

Экшены сложно представить себе без взрывов. И в Tanks A Lot! их тоже достаточно. Даже простой эффект взрыва состоит из нескольких систем частиц.

Здесь сочетаются все техники, о которых шла речь ранее

Взрывы появляются почти мгновенно, а после себя оставляют тёмный след на земле. Также должны присутствовать разлетающиеся искры, куски земли и дым. Но сначала нужно сделать базовый эффект — центр взрыва. Для этого Тиханов собрал в Substance Designer вот такую схему.

Здесь одновременно задействовано множество шумов
Здесь одновременно задействовано множество шумов
В итоге получилось что-то похожее на основу взрыва

Результат нужно преобразовать в 3D-модель, прогнать через оптимизатор геометрии в Maya и запечь цвет в текстуру. Полученную текстуру следует поместить в атлас эффектов, а меш импортировать в Unity. Такую модель можно сделать и более традиционными средствами: например, слепить в Blender или ZBrush.

После импорта создаём систему, добавляем модель в качестве частицы и настраиваем динамику появления в Size Over Lifetime.

Должно получиться нечто подобное

Пока это мало похоже на взрыв. Чтобы это исправить, добавим вспышку — свечение, немного искр и ударную волну.

Уже выглядит интереснее

Расходящиеся круги ударной волны делают эффект динамичным. Теперь добавим расходящиеся стилизованные клубы дыма.

Для этого нужен подобный спрайт
Для этого нужен подобный спрайт
В системе частиц дыма важно ограничить скорость движения во вкладке Limit Velocity Over Lifetime
В системе частиц дыма важно ограничить скорость движения во вкладке Limit Velocity Over Lifetime
Расходясь, частицы образуют круг, в центре которого произошёл взрыв
Расходясь, частицы образуют круг, в центре которого произошёл взрыв
Затем нарисуем декаль следа от взрыва
Затем нарисуем декаль следа от взрыва

Добавим ещё одну систему без Shape и сделаем очень быстрое появление через Size Over Lifetime. Декаль должна находиться параллельно земле. Для этого нужно в поле Renderer — Render Alignment поставить вариант Local.

В результате получается такой эффект

Теперь можно добавить полупрозрачный дым — для него Тиханов использовал спрайт, который рисовал для эффектов огня.

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

Должен получиться такой дым

Теперь можно добавить дымящиеся осколки, разлетающиеся в стороны.

Они будут выглядеть примерно так
Они будут выглядеть примерно так

Для этого создадим систему частиц — в качестве частиц подойдёт круговой градиент в аддитивном шейдере. Настроим движение так, чтобы частицы вылетали вверх и плавно падали вниз, постепенно затухая.

Основные настройки такой системы
Основные настройки такой системы

Теперь сделаем след дыма для этих частиц.

Для этого нужно перейти во вкладку Sub Emitters и создать ещё одну систему
Для этого нужно перейти во вкладку Sub Emitters и создать ещё одну систему

В качестве частиц можно использовать нарисованные ранее спрайты стилизованного дыма.

Основные параметры этой системы
Основные параметры этой системы
Должно получится примерно так

Теперь можно добавить разлетающиеся куски земли. Здесь та же логика, что и с фрагментами пилы: сперва их нужно смоделировать, а затем импортировать в качестве частиц.

Куски земли можно представить в виде простой модели со скошенными гранями
Куски земли можно представить в виде простой модели со скошенными гранями

Чтобы камни падали на землю, нужно настроить Gravity Modifier и Collision.

Здесь выставлены все необходимые параметры
Здесь выставлены все необходимые параметры

Также можно добавить вращение камней вокруг свой оси, пока они не достигнут земли. После этого они исчезают с помощью графика Size Over Lifetime.

Финальная версия эффекта выглядит так

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

Обычно эффекты создаются в четыре этапа:

  • поиск референсов;
  • рисование эскиза;
  • создание самих частиц (это могут быть 2D-спрайты или 3D-модели);
  • создание систем частиц.

В заключение повторим несколько общих советов при создании визуальных эффектов:

  • они должны быть лаконичными и читаемыми;
  • убирайте все лишние элементы, которые мешают общей композиции;
  • не забывайте про 12 принципов анимации;
  • у всех спрайтов должна быть простая и понятная форма;
  • не используйте слишком много цветов;
  • эффект должен сочетать крупные, средние и мелкие элементы;
  • собирайте спрайты в атлас, чтобы повторно использовать их в будущем.

Описанные принципы помогут вам улучшить качество своих эффектов. Также вы можете использовать примеры из текста, чтобы создать нечто подобное для своей игры.

9999 показов
38K38K открытий
1313 репостов
43 комментария

Комментарий недоступен

Ответить

Потому что на ДТФ кто-то наконец-то решил выложить туториал на уровне старого 80lvl, а не то как нарисовать сову?

Ответить

Круто, спасибо

Ответить

Отличная статья. Спасибо :3

Ответить

Как лучик солнца среди ялублуигоры!!1! и прочей скорби по батям

Ответить

То, чего я так давно ждал, спасибо!

Ответить

Зачем ждать, если на ютубе есть всякие челики)

Ответить