Daniil Kozlovsky, Art Lead, Playkot
Anton Ivichev, Playkot
Dmitry Lebedev, Playkot
Step-by-step description of the process of creating characters for a 3D mobile game in the fantasy setting. Good and bad solutions that the Age of Magic team tried while solving the problem of building an efficient and scalable production pipeline. #MadeWithUnity
5. • Новая игровая вселенная
• Эпичные герои с уникальными
способностями
• ААА графика на мобильной платформе
• Unity 3D
• Сжатые сроки разработки
• Небольшая команда
36. 3D скетч
• Быстрые итерации
• Визуальная достоверность
• Прототипирование сложных
персонажей и анимаций
• Снижение рисков при работе с
аутсорсерами
40. Финальный 3D скульпт
критерии качества
За техническими требованиями
не должны теряться
художественные ценности.
Многое, что продумывается
на стадии скетча, полезно
знать во время скульптинга
50. Из чего состоит
• 20+ миллионов полигонов
• 50+ SubTools
• 5 дней работы
Что помогает
• Outsource
• Используем заготовки
• Настройка Zbrush под себя
51. Настройка Zbrush под себя
ускорит в два раза
Zscene manager
организует сабтулы
• Удобная иерархия
• Быстрый ренейминг
• Drag&Drop групп сабтулов
• Hide&Show групп сабтулов
Zscene manager
52. Low Poly
Максимальная оптимизация с сохранением визуального качества
От 4т. до 6.5т. треугольников
на персонажа
Каждая грань должна нести пользу
или она не нужна
56. Особенности оптимизации проекта
Материал без прозрачности
моделируются:
Усы
Волосы
Дыры в ткани
Перья
Односторонний шейдер
Все плашки сдублированы
с вывернутыми нормалями
Персонаж состоит из
единого меша,
включая оружие
66. Риггинг
• ~100 костей на персонажа
• Единое наименование костей
для разных ригов
• Файл с ригом отдельно от
анимаций
• Python, вспомогательные
скрипты для построения рига
• и экспорта
Знание Python в Maya очень помогает, азы программирования это просто.
70. • Разница в дистанции х2
• Не линейная скорость перемещения
• Нужны быстрые атаки
Атаки прыжком, причины:
71.
72.
73. Оверпеинт + текст Правка сразу в Maya
Варианты обратной связи для удалённых аниматоров.
Unity + Camtasia + EpicPen
Записать себя,
кого-нибудь
на видео
83. Проблема скиннинга
Для оптимизации выбрано
влияние 2 костей на вертекс.
Хорошо на всех, кроме...
Первая проблема
в случае с крыльями.
Будем тестировать 4 кости
на производительность,
или обойдём другим способом.
85. • Точно настроенные процессы.
• Мнения принимаются от всех,
но в принятии этапа работы
участвуют только люди, ответственные за него.
• Не пытаться сразу достичь безграничного качества,
в ущерб срокам.
89. Размер – неизбежное зло
Пересылка текстурных данных по шине при
рендеринге – это энергозатратная операция
(для мобильных GPU)
• Быстро разряжается устройство
Больше размер скачиваемого и
устанавливаемого
• Не все готовы устанавливать большие игры
• Сложнее обновлять
Дольше загрузка
90. Исходные данные персонажа:
Текстуры персонажа 2К RGB: Diffuse, Specular,
Normal map, Emission
• 48 Mb
Атлас для эффектов 1К ARGB
• 4 Mb
Звуки
• 10 Mb
Модель и скелет
• 1 Mb
Итого: 73 Mb
Анимации ~ 90 фреймов (3 атаки, урон, смерть, айдл)
• 10 Mb
91. Компрессия текстур: iOS
Для непрозрачных
• PVRTC – хорошая компрессия и качество
Текстуры с альфой
• iPhone 6 и выше – ASTC (от 4х4 до 8х8)
• Младшие модели
• ARGB и меньше разрешение
• Отдельно упаковывать альфа канал, а цвет в PVRTC + шейдер
• ARGB PVRTC
92. Компрессия текстур: Android
Скрипт для сборки, который будет запускать
сборку с разными настройками:
• DXT PVRTC ATC ASTC ADRENO
Настройка в Unity/Build – Texture Compression
• Настройка манифеста для apk автоматом подставит
Unity
• Специальный Version Code для каждой платформы
0000Nxxxxx
Подготовка к фильтру в Google Play
• N == 1 – для самой простой компрессии доступной везде (ETC)
• …
• N == 6 (например) – наименее поддерживаемая
• xxxxx – версия игры
93. MipMap’ы
iPhone 6 iPad Pro
*Mipmap Visualization – plugin из Unity Asset Store
Col mipMaps 1024
Col mipMaps 512
Col mipMaps 256
94. Настройки MipMap и размера текстур
MipMap увеличивает размер текстуры ~ на 33%,
но, для 3D объектов, которые меняют положение
относительно камеры:
• Уменьшают объём данных по GPU
• Убирают шумящие текстуры
Размер текстур:
• iPhone 6 – 512 x 512
• iPad Pro – 1K x 1K
99. Игровые данные нужно уметь отделять от сборки, иметь
возможность обновлять их в уже работающем приложении.
Unity components
• Удобен только на старте, не справляется с большим объёмом данных
Excel xml таблицы
• Просто делать локальные версии
• Можно *.xml сразу «закидывать» в проект
• Сложно делать Merge и конфликты при pull, когда файл открыт в Excel
Google drive таблицы
• Простая совместная работа
• Для локальных тестов нужно создавать копию всего документа
• Версионирование сохраняется, но оно отдельно от системы контроля версий
• Утилиты для загрузки и сохранения в бинарный формат (быстро открывать в runtime)
101. Загружаем общие данные на старте приложения
• Не создавать прямых ссылок, грузим из Resources
• Разделить на части и грузить через Async
• Сперва загружать данные, нужные в первую очередь
Избегаем долгих фреймов
Создаём необходимый минимальный набор данных
• Для персонажа в меню прокачки нет смысла грузить
VFX Sound FX
• HighRes без MipMaps для меню и в два раза меньшие
для боя, но с MipMaps
При переходе между меню и игрой
• Не выгружать нужные данные персонажей, которых
загрузили в экране сбора отряда
104. Динамический ShadowMap с персонажами и всеми объектами на
арене – отбрасывание теней на себя и соседних персонажей
Shadow Map - OFF Shadow Map - ON
107. Вариация на тему «Global Illumination»
(смягчаем тени псевдо отраженным
светом от арены)
108. Color Grading + настройки освещения для
различных «погодных условий»
109. Упрощения (для более слабых платформ):
• Меньше размерность ShadowMap,
отключение сглаживающей фильтрации
• Вычисление освещённости на
вершинном шейдере вместо
фрагментарного
• …
111. Нужна система – берём и делаем
• Простота старта и быстрые первые работающие версии
• Но при развитии дизайна приходится переписывать много
методов, есть шанс забыть что-нибудь
Ретроспектива
«Наивная» система: каждая способность – это отдельная
функция, реализующая её логику:
Параметризуемая модель с универсальным («убер»)
методом:
• Все взаимодействия локализованы, удобно вносить
небольшие исправления
• Но некоторые изменения вынуждают вносить очень
сильные модификации в универсальный метод
«Взял и сделал» не работает – что дальше?
112. Игра коллекционная, т.е. надо сделать всё возможное, чтобы
игроку хотелось открывать и развивать новых персонажей:
Персонажи – главная ценность
• Интересно играть, т.к. каждый персонаж чем-то уникален
• Отрядное взаимодействие – синергия персонажей
• Возможность внесения правок в баланс (настройки и
способности)
• Развитие персонажа даёт не только количественное, но и
качественное улучшение
• Новые персонажи после выхода игры
113. Вырабатываем требования
на сейчас и «впрок»
• Не ограничиваем мысль дизайнера (расширяемая система, в
разумных пределах)
• Логика способности «стабильна» (не нужно много переделок при
добавлении новых свойств)
• «Программировать» способности в терминах близких к предметной
области (описанию)
• Механика персонажа не зашита в сборку
• Возможность обновлять «на лету»
• Можно выполнять вне игры (проверка на сервере, утилиты для
проверки баланса)
• Интегрируется с игровыми подсистемами (анимация, VFX)
114. • Нет возможности создавать уникальных персонажей
(нужно заранее предусмотреть все варианты)
Выбор основы
Табличные данные с параметрами
Описание способностей на С#
• Нет возможности обновлять и добавлять персонажей без
скачивания версии
Интерпретируемый DSL
• Нужно разработать
120. Язык способностей и Виртуальная машина
• 2 рабочие недели
Временные затраты
Игровая модель (декораторы, модификаторы,
внешние события…)
• 8 недель
Логика для 35 персонажей (+ новая система
взаимодействия)
• 4 недели + to be continued
Система прогона боёв для проверки результатов
и баланса персонажей
• 2 недели