Dtf.ru | Running shadow -Unity3D- Техно арт

10 мая 2014

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

Свет и атмосфера

Мобильное освещение это по возможности никаких Real time источников света! Поэтому в нашем проекте всё построено на Lightmap, шейдерном освещении, и динамических эмитерах.
Для каждого сеттинга настраивались сотни обычных Point light с нужным радиусом, цветом, интенсивностью и тд. Таким образом можно выстраивать атмосферу на уровне, теплее, холоднее, или простые формы на поверхности например здесь световой цилиндр в центре зала на полу.

Если использовать Directional light для направленного света и теней на поверхности, важно сортировать каждый меш на плотность Lightmap — чтобы разрешение на текстуре Lightmap не превышало допустимой текстурной памяти в кадре и визуально было очевидным. Например плотность мешей пола шесть, а все остальные меши на которых тень от объектов не так важна имеют плотность один-два.

Технология Lightmap(Beast) в Unity3D — работает хорошо и порой это единственный способ визуально разнообразить-однотипный 3д контент. Стоит добавить, что каждый отдельный меш при расчёте Lightmap получает свои координаты офсета на общем атласе и поэтому очень мало динамического батчинга для таких мешей!

Для свечений, динамических вспышек, цветовых подсветок можно использовать shuriken emitter. Эмиттеры билбордятся на камеру, имеют огромный ряд динамических параметров и что наиболее важно для производительности умеют ресайзиться в зависимости от положения камеры- поэтому в отличие от шейдерных плашек, эмиттеры никогда не покроют весь фрустум камеры! Плюс также Zсортировка на уровне эмиттера а не шейдера.

Анимация

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

Анимация игровой камеры в Running shadow начиналась просто- кодом, двигали координаты камеры по вхождению в триггеры, получалось очень однообразно, не красиво и много артефактных мест куда камера норовила проникнуть.
Ещё была альтернатива анимировать в 3д максе камеру, экспортить в движок как объект, использовать координаты этого объекта для игровой камеры, тоже не подходящий способ! Потому что большинство игрового контента создавалось внутри юнити, все префабы собирались из отдельных ассетов, с разными габаритами, свойствами итд. пример из каких мешей создавался уровень.

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

Шейдеры и эффекты

Чаще всего использовался стандартный шейдер Mobile Unlit(Supports Lightmap), также были написаны его разные версии с поддержкой CubeMap, вертексной или вершинной сортировкой в зависимости от нужд.
Интереснее дела обстояли с динамическими объектами (персонажи, динамические ловушки, анимированные декорации и тд.) Поскольку каждый префаб коридоров инстансился в пул объектов при генерации уровня и потом дублируясь расставлялся на уровне. Мы не могли использовать стандартные Unity Lightprobes потому что каждый раз уровень генерился по разному!
Поэтому написали шейдер имитирующий освещение на основе нормалей 3д модели и Litsphere, подсвечивающий её с разных сторон в зависимости от настроек в шейдере.
1 пример свет справа
2 пример свет слева

Для имитации жидких или горящих поверхностей в условиях мобильности, использовался шейдер смешивающий текстуры со смещением UV координат

Также для некоторых сэтингов был написан специфический шейдер с Rgb + Alpha каналом для масок, distortion, fresnel, CubeMap и смещением, лучше смотреть в динамике на ролике выше или в реальной игре)

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

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

Вторая плашка с непрозрачным шейдером по Z координате расположенная за первой плашкой — являясь фоном для всего что на экране.

таким способом можно располагать и сортировать любые объекты между этими двумя плашками. Частицы, 3д модели персонажей, дополнительные меши для эфектов, всё это сортируется Z координатами и альфа каналом в основной текстуре карты.

Производительность

Мобильность очень обременительна для визуала, поэтому работая с графикой в Unity3D крайне важно следить за числом Draw calls, количеством треугольников в кадре, текстурной памяти, прозрачностью(Overdraw), мобильными шейдерами. И конечно почаще пользоваться профайлером.
в проекте Running shadow в игровом режиме по возможности, мы старались не превышать 100 Draw calls(соблюдая побольше атрибутов для динамического батчинга), 10 000 треугольников,10 мегобайт текстур в кадре.

В целом хочется поблагодарить всю команду за колоссальную работу, Game Insight(Like Games) за возможность поработать над интересным проектом, и Unity3D за отличный движок!

Похожие новости