Русский
Русский
English
Статистика
Реклама

Unreal engine

Подкаст Хочу в геймдев 10

27.07.2020 14:05:23 | Автор: admin

Это подкаст "Хочу в геймдев", и у нас вышел уже 10-й, юбилейный выпуск, в котором мы рассказываем о профессии разработчик игр (программист) на Unreal Engine.


Что это за подкаст? Подкаст Хочу в геймдев это инструмент для тех, кто хочет попасть в игровую индустрию, но не знает как, куда и зачем, с чего начать и как действовать.


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



Подробную информацию о подкасте, о всех вышедших на сегодня выпусках вы можете посмотреть на сайте подкаста>>>
Все выпуски вы можете послушать на ресурсах (тайминг есть в описании каждого выпуска):
Youtube, Вконтакте, Яндекс Музыка, Itunes, Google Podcasts, Castbox, Spotify
Приятного прослушивания!


А для тех, кто больше любит читать, публикуем далее текстовую версию 10-го выпуска.


Ведущие выпуска и приглашенный эксперт:



Вячеслав Уточкин, Олег Доброштан, Александр Мураш и Владимир Алямкин


Путь эксперта
Разрабатывать свои игры, рассказывать свои истории Владимир захотел с 10 лет, вдохновляясь такими играми, как, Diablo, DOOM. Starcraft


Выход Gothic послужил катализатором, и наш эксперт решил сделать свою Готику с вампирами и духами смерти. Опыта разработки не было, а основные прикладные навыки развивались в сфере создании трехмерной графики и анимации.
Общение с единомышленниками происходило на форуме gamedev.ru, там, пообщавшись с программистами, Владимир понял, что ему нужно вникнуть во всевсё сферы самому и разобраться в программировании.
Попытки игровой разработки завершились уходом из индустрии в сферу заказного софта, работу по техническим заданиям.
Возвращение в геймдев произошло в 2009-10 годах, на данный момент Владимир имеет за плечами 9 лет опыта разработки в Unreal Engine и является Tech Lead Pushkin Studio в My.Games.




С чего начать тем, кто пока ничего не умеет, но хочет стать программистом игр?


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


Если есть желание начать именно программистом, то стоит получить академическое образование: изучить либо C# или C++, эти языки практически одинаковы в освоении (в геймдев разработке), нужно читать специализированную литературу, причем, прочитав половину книги можно приступать к написанию кода.




Полезные источники информации для начинающего программиста, где искать информацию?


  • Специализированные сообщества. Общайтесь, развивайтесь вместе с другими людьми, это очень важно для быстрого роста в любом деле.
  • Определившись с движком изучайте опыт других, делитесь своим. У Unreal Engine есть замечательный Telegram канал и сообщество Вконтакте. В этих сообществах обитает большое число грамотных специалистов, которые помогут и подскажут. Также, до сих пор существует форум GameDev.ru.
  • В англоязычном сегменте можно посоветовать форум Epic Games, канал в discord.
  • Учебные курсы, например Udemy, в сжатой и удобной форме подаются основы разработки на C++. Главное изучать не только повторяя тот материал, который вам подается, но пробовать сделать что-то свое, заимствуя некоторые механики из только что усвоенного материала.

Какие качества характера (и не только) программиста важны и нужны?


  • Увлеченность непосредственно процессом, программирование должно заводить, щекотать мозг.
  • Сосредоточенность на своем деле: человек должен уметь и любить выстраивать логические конструкции у себя в голове.
  • Важны soft skills, умение общаться, одних hard skills в геймдеве недостаточно, т.к. все завязано на команду и ваше умение общаться и быть на одной волне обязательно повлияет на принятие решения.
  • Знание английского языка на уровне чтения и понимания технической документации.



Должен ли программист уметь/любить играть в игры?


За редким исключением, да. Геймдев программист должен играть в игры.
Если ты не играешь, если тебе это неинтересно, то зачем ты пошел в геймдев?


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




C# или C++, Unity или Unreal Engine? что выбрать и почему?


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


Глобальной разницы нет, это просто инструменты со своими особенностями.
На старте заморочки не важны. Ситуация меняется динамично, основываться на востребованности не стоит. Что больше нравится, игры в которые играешь на чем сделаны, если нравятся игры на Unreal делайте на них.
Также можно расширить кругозор другими движками, Godot, например.
Выбор должен быть основан на мотивации и личном восприятии.


Иной путь хотите сделать клон какой-то игры? Или вдохновлены чем-то? Посмотрите на каком движке сделан этот продукт, возможно для вас будет удобнее работать на нём.


С точки зрения востребованности в сторах (App Store, Google Play), то какого-то одного фаворита тут нет, используются разные движки, в зависимости от предпочтений разработчиков и задач, которые перед ними стоят.


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




Про важность резюме для программиста. Что поможет получить приглашение на собеседование?


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

Какие вопросы на собеседовании задают junior-кандидатам? Что важно знать для прохождения собеседования?


Можно выделить три направления:


  1. В первую очередь, если ко мне приходит программист на позицию junior, я задам вопрос про плюсы, причем вопросы несложные, которые можно найти в тех самых задачах и книгах, о которых упоминалось выше. Мне надо понимать, как у человека работает мозг, насколько у него выстроено логическое мышление и понимание работы алгоритмов.
  2. При условии того что у человека есть технический уровень чтобы писать код, второй вопрос будет про то, чем он занимается сам. На старте важно наличие любых своих проектов, нужно показать что ты делал, как решал конкретные задачи. Какие есть свои наработки, прототипы. Альтернатива выполнение тестового задания с объяснением решения задач.
  3. Вопросы внутренней мотивации человека, такие как: Какие задачи вы планируете решать, придя к нам? К чему стремитесь и куда хотите развиваться? Что вами движет и почему именно геймдев? Близки ли вам проекты, которые мы реализуем?



Важен ли внешний вид программиста при прохождении собеседования?


Элементарная гигиена, опрятность и соответствие обстановке вполне достаточные требования к внешнему виду. Запрета на татуировки или пирсинг нет, цвет волос также не играет никакой роли. :)


Ссылки по теме подкаста:


Пример тестового задания для программиста: https://github.com/PushkinStudio/pushkinstudio.github.io/blob/master/tournaments/README.md
Опросник по C++: https://cloud.mail.ru/public/4vK7/3A2JQNrVQ


Онлайн-Круглый стол 19.08: https://games.hse.ru/lecture/
Онлайн-День открытых дверей по программе Менеджмент игровых проектов: https://games.hse.ru/openday
Личная страничка Владимира Алямкина: https://www.facebook.com/vladimir.alyamkin
Личная страничка Олега Доброштана, куда можно написать вопросы для следующих выпусков: https://www.facebook.com/oleg.dobroshtan
Сайт подкаста: http://podcast.hsbi.ru/

Подробнее..

Арт-специальности в GameDev, какие бывают и что необходимо знать

16.04.2021 14:07:36 | Автор: admin

Ребята всем привет!!!

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

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

CG очень увлекательная сфера деятельности, здесь есть, где найти себе приложение будь-то игры, кино, реклама или научная визуализация (Фото: https://cgmag.net)CG очень увлекательная сфера деятельности, здесь есть, где найти себе приложение будь-то игры, кино, реклама или научная визуализация (Фото: https://cgmag.net)

Игровой художник создает 2D и 3D-графику для визуализации видео игры: от пропосов (элементов интерьера сцены) и окружения (декораций) до спецэффектов, текстур, света, рендера и т.д. Зачастую профессия требует серьёзных знаний и навыков: понимания ракурсов съемки, физики, теории цвета и света, знание анатомии и программирования. Но при трудоустройстве, конечно же, всё решает портфолио и практика.

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

Концепт-артист (персонажник)

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

Работа концепт-артиста (концептера) предложить варианты персонажа (например), исходя из тех задания, как правило это серия однотипных объектов, но представленных в разном виде. (Фото: https://cgmag.net/)Работа концепт-артиста (концептера) предложить варианты персонажа (например), исходя из тех задания, как правило это серия однотипных объектов, но представленных в разном виде. (Фото: https://cgmag.net/)

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

Концепт-артист (окружение)

Он также занимается "отрисовкой", но уже объектов в сцене, он рисует все то, что так или иначе окружает персонажа в игре. Это могут быть самые разные локации от рынков, людных площадей, замков, башень, портов, городских больниц до лесов, пещер, океанов, инопланетных миров и других вселенных.

Так же очень часто данный специалист рисует задний фон для для всей сцены в целом, так называемый mate-paint. Кроме всего прочего он, работает так же как и раскадровщик, и иллюстратор и необходим, когда надо "разложить" игру по отдельным сценам и посмотреть как будет представлен сюжет в целом.

Концепт-артист не редко совмещает в себе умение рисовать все и вся и "персонажку" и окружение. Основным софтом используемым концептерами являются (http://personeltest.ru/aways/medium.com, Garry Potter and Deadly Shadows)Концепт-артист не редко совмещает в себе умение рисовать все и вся и "персонажку" и окружение. Основным софтом используемым концептерами являются (http://personeltest.ru/aways/medium.com, Garry Potter and Deadly Shadows)

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

Художники окружения Ведьмак 3: Дикая Охота работали над локациями вместе с 2D художниками, левел-дизайнерами, дизайнерами квестов и писателями, чтобы убедиться, что визуальная составляющая мира во всем поддерживала сюжет. - Михаль Жажиневски

Художник по моделям или 3D/2D-моделлер его задача создать высококачественные 3D/2D модели. У компаний в геймдеве есть высокий спрос на людей, которые могут сделать 3D-слепок орка или космодесантника. Здесь возможны также различные варианты "прокачки", если ты моделишь пропсы, архитектуру, танки, самолеты, роботов, летающие метла и прочее ты занимаешься Hard Surface моделированием. Если ты больше тяготеешь к созданию персонажей, различным живым существам, монстрам, феям, драконам, леприконам, рыцарям, очаровательным красоткам, тебе больше подойдет Organic/Personage моделинг.

Hard surface modeling, очень часто моделят тачки, самолеты, корабли ракеты и прочее (Фото: websoftex.ru)Hard surface modeling, очень часто моделят тачки, самолеты, корабли ракеты и прочее (Фото: websoftex.ru)

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

Коллизии это всегда появление артефактов в той или иной степени на финальной картинке (а это не приветствуется, все должно быть идеально). Процесс создания сетки в момент разработки модели называется топологией. Бывает так, что необходимо переделать сетку не меняя модели - это называется ретопологией а сам процесс создания самой модели называется скульптингом. Моделер, работает в Maya, 3dsMax, Blender, Z-Brrush, Marmoset, Houdini (если мы говорим о процедурном моделировании).

Персонажное моделирование, подразумевает знание анатомии в обязательном порядке (Фото: https://www.pinterest.ru)Персонажное моделирование, подразумевает знание анатомии в обязательном порядке (Фото: https://www.pinterest.ru)

Аниматор

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

Работа очень кропотливая и долгая, здесь учитывается анатомия персонажа, придумываются его движения и строятся зависимости. Труд таких людей очень ценится в любой игровой студии, поэтому выучиться на них никогда не поздно изучайте доступные программы по созданию анимаций, вроде Maya, Unity, Unreal и становитесь игровыми аниматорами.

Художник 2D/3D текстур

Данная "боевая" единица занимается текстурами для персонажей, объектов, окружения и различными поверхностями. Здесь особым плюсом будет если вы хорошо понимаете и любите работать с материалами и поверхностями. Они могу быть самыми различными: камень, лед, вода, лава, дерево, трава, кожа, огонь, металл и т.д.

Этот специалист работает над шейдингом (процессом создания текстуры в ее "широком" понимании) чем более детальнее и реалистичнее она будет, тем более качественной получится игра. Но не стоит забывать про системные ограничения. Так как, игры делаются для пользователей и разработчики заинтересованны что бы у конечного пользователя все "летало" на домашней машине.

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

Приложения, с которыми работает данный специалист это Substance Designer, Substance Painter, Photoshop, Marmoset, Mari, Marvelous Designer, ZBrush, Fusion 360, UV Layout, Rizom UV, Maya, 3dsMax и т.д. Я перечисляю лишь то, что наиболее популярно в продакшене (по есть производстве).

Художник по освещению

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

Его/её задача найти баланс между светом и цветом. И расставить необходимые акценты по ходу развития сюжета игры. Также этот человек должен не только знать композиционные приемы расстановки света, но и уметь, подчас кодить. Так что, языки программирования здесь пригодятся. Художник по освещению работает, в том пакете, в котором ведется вся остальная разработка, это может быть Unity, Unreal, Cryengine.

Свет в играет играет важную роль, он придает тон и настроение всей сцене. (Фото: gdjob.pro)Свет в играет играет важную роль, он придает тон и настроение всей сцене. (Фото: gdjob.pro)

Художник визуальных эффектов

По-модному VFX-художник или эфыксер, в на сленге GameDev )). Этот персонаж, мой самый любимый, он сочетает в себе качества разработчика и художника. Он буквально "оживляет" любую часть игры. Будь-то порывы ветра, дождь, пыль или дым, даже искры орудий, в том числе стенобитных, дальнобойных и т.д.

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

Различают следующие виды симуляций:
- партикловая (симуляция частиц) сами по себе партиклы невесомы, но на них можно "навесить" небольшие спрайты или текстуры для создания эффектов огня или дыма, например;
- cимуляции частицами и флюидами здесь самих частиц может быть не так много, но более детальная проработка, например чего-то жидкого, вода, слизь, мед, смола, лава, а также любые сыпучие материалы и т.д.;
- симуляция разрушений - это касается любых разрушений и развалов чего-либо (обрушение скалы, падение огромной башни, разбитие стены и т.д.)
- волосы, шерсть, ткань - здесь название говорит само за себя;
- прочие "специальные" случаи которые не вошли в предыдущие, как правило этот пример RnD процесса (Research and Developmnet);

Все смотрится очень круто когда есть эффекты. (www.youtube.com, Grim Dawn)Все смотрится очень круто когда есть эффекты. (www.youtube.com, Grim Dawn)

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

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

Эфыксер работает в том движке, в котором ведется разработка: Unity, Unreal, Cryengine. Кроме всего прочего, ему необходимо знать языки программирования CSharp, C++, Python. Также в обязательную программу входят Photoshop и системы контроля версий: Git, SourceTree. В связи с растущими требованиями рынка также высоко ценится знание Houdini, PopcornFX и т.д.

Художник-иллюстратор

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

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

основы рисунка, работы с текстурой, объемами и светом;

чувствовать стиль и понимать, как аудитория воспримет тот или иной прием;

уметь читать техническую документацию;

выбирать инструменты со знанием дела;

много практиковаться, интересоваться работами других художников;

работать в команде, поскольку на конечный результат.

Подробнее..

Из песочницы Интеграция библиотеки на Swift в UE4

09.10.2020 14:15:38 | Автор: admin

Недавно возникла задача интеграции кода, который был написан только на Swift в проект на UE4. При этом вариант "давайте быстренько перепишем все на Objective C" не рассматривался. Готового решения нигде не нашел, пришлось, как это часто бывает, копать и вширь и вглубь. Задача была успешно решена и чтобы помочь кому-то еще, решил написать туториал.


Обычно, если нужно интегрировать какой-либо специфичный для iOS/macOS платформы код, используется сборка библиотеки в виде Framework, который должен быть статический. Сам же код пишется на Objective C. Далее, зависимость прописывается в скрипте сборки проекта MyProject.Build.cs, например, так:


if (Target.Platform == UnrealTargetPlatform.IOS){    string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));    PublicAdditionalFrameworks.Add(        new Framework(            "MyFramework",            ExtraPath + "/" + "MyFramework.framework.zip"        )    );}

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


ld: warning: Could not find auto-linked library 'swiftFoundation'ld: warning: Could not find auto-linked library 'swiftDarwin'ld: warning: Could not find auto-linked library 'swiftCoreFoundation'ld: warning: Could not find auto-linked library 'swiftCore'ld: warning: Could not find auto-linked library 'swiftCoreGraphics'ld: warning: Could not find auto-linked library 'swiftObjectiveC'ld: warning: Could not find auto-linked library 'swiftDispatch'ld: warning: Could not find auto-linked library 'swiftSwiftOnoneSupport'

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


Сборка проект пройдет нормально, однако при запуске приложение будет падать со знакомой iOS разработчикам ошибкой:


dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework  Referenced from: /private/var/mobile/Containers/Bundle/Application/.../MyApp.app/MyApp  Reason: image not found

Это связано с тем, что UE4 не умеет работать с динамическим типом Framework, и не копирует его при создании пакета приложения. Это можно было бы решить путем изменения кода IOS Toolchain и сборкой своей версии движка, но хотелось всего этого избежать и на помощь пришел IOSPlugin.


Это расширение обычно используется для модификации plist файла приложения, например, добавления описания для прав доступа:


<iosPListUpdates>    <addElements tag="dict" once="true">        <key>NSCameraUsageDescription</key>        <string>The camera is used for live preview.</string>    </addElements></iosPListUpdates>

Нам же пригодится элемент copyDir. Он позволяет задать путь к директории, которую мы хотим скопировать, и место назначения:


<init>    <log text="Copy MyFramwork..."/>    <copyDir src="http://personeltest.ru/aways/habr.com/.../MyFramework.framework" dst="$S(BuildDir)/Frameworks/MyFramework.framework" /></init>

Важно, чтобы команда копирования располагалась в блоке init. После этого приложение начинает работать.


Итоговый файл MyProject.Build.cs будет выглядеть так:


using UnrealBuildTool;using System.IO;public class MyProject : ModuleRules{    public MyProject(ReadOnlyTargetRules Target) : base(Target)    {        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });        if (Target.Platform == UnrealTargetPlatform.IOS)        {            string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));            PublicAdditionalFrameworks.Add(                new Framework(                    "MyFramework",                    ExtraPath + "/" + "MyFramework.framework.zip"                )            );            string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);            AdditionalPropertiesForReceipt.Add("IOSPlugin", Path.Combine(PluginPath, "MyProject_IOS_UPL.xml"));        }    }}

А файл MyProject_IOS_UPL.xml так:


<?xml version="1.0" encoding="utf-8"?><root>    <init>        <log text="Copy MyFramework..."/>        <copyDir src="http://personeltest.ru/aways/habr.com/.../MyFramework.framework" dst="$S(BuildDir)/Frameworks/MyFramework.framework" />    </init></root>

Это решение в некотором роде обходной путь, пока не появится нормальной поддержки динамического Framework в UE4, но меня оно полностью устроило.

Подробнее..

Как стать разработчиком игр имея за пазухой только здравый смысл?

05.04.2021 00:18:36 | Автор: admin

Вступление

Давно мечтаешь создать игру? Чтобы любой человек планеты смог без проблем ее найти на пространствах интернета и сыграть? Но у тебя нету ни средств для того чтоб оплатить должную учебу или мотивации чтоб поднять свой ленивый зад и начать кодить? Или ты просто сантехник, которому надоело каждый день сидеть за унитазом соседей и хочешь попробовать что-то новое в жизни? Ты, естественно, без проблем можешь начать разрабатывать игры. Только тебе нужно определиться с одним вопросом. А реально нужно тебе это? Если да, то какой толк ты хочешь вынести из всего этого?

  • Чтоб заработать кучу денег и прославиться?

  • Чтоб утереть нос другу, который не первый день хвалится что он крутой разработчик во всем мире?

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

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

Начальная разработка. Ожидание-реальность

Будь готов к тому, что на начальных этапах у тебя мало что будет получаться. И попытки создать Хагрида из Гарри Поттера

Рис.1. Ожидаемый результатРис.1. Ожидаемый результат

могут превратится в анекдот. Хорошо если у тебя получится что-то такое:

Рис.2. Хороший результатРис.2. Хороший результат

Но если в итоге выйдет что-то такое:

Рис.3. Ржачный результатРис.3. Ржачный результат

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

Что лучше? 2д или 3д на начальном этапе?

Многие начинающие разработчики могут сказать, что 2д проще. Тем что это 2д. Ну согласиться я не могу. Лучше то, что нравится. Нравится 3д? делай в 3д. Нравится 2д? Делай в 2д. Ведь разница тут только в координатной плоскости. А суть та же самая. Ведь что в 2д что в 3д тебе придется двигать персонажа. Что там что там обрабатывать триггеры. Что там, что там писать ИИ (искусственный интеллект) для врага. То, что имеет меньшую размерность не значит, что проще. Как говорит знаменитая пословица: Главное не размер, а умение пользоваться. Так что главное не размерность координатной плоскости, а то как ты умеешь с ней обращаться. Везде есть свои плюсы и минусы. Если рассматривать на уровне графики, то в 2д тебе нужно нарисовать спрайт и потом секвенцию кадров для анимации, ну а в 3д, нужно смастерить 3д модель и анимировать с помощью костевой анимации (если живое существо) или достаточно просто создать шар и используя ключи анимации просто двигать его, вращать, масштабировать и т.д. Но если нет художественного вкуса, то может получится что-то консервное (вспомним Хагрида). Так что, если говорить уж про размерность, то каждый выбирает по вкусу. Тот, кто хорошо владеет 3д пространством, тот с легкостью может перейти на 2д, а тот, кто хорошо владеет 2д, то тому нужно представить еще одну ось и адаптироваться.

Стоит ли платить за обучение?

Этот вопрос для каждого индивидуален и зависит от каждого. Можно и без преподавателей обучиться, но это будет долгий процесс поиска нужной информации в гугле. Можно вступить в разные группы единомышленников, но не надейся, что с тобой там нянчится будут. Могут помочь советом, а могут и послать нафиг за наглость. Помочь могут с каким-то определенным алгоритмом и направить на ресурс, который может ты и читал, но не внимательно. Но не надейся что там будут объяснять как создать переменную и зачем ставить ; в конце строки в С-подобных языках программирования. Такие вещи могут рассказать преподаватели в учебных заведениях, или те, которым ты будешь платить деньги на курсах. Я не призываю отказываться категорически отказываться от платных курсов. Так как там собрано большинства материала, который ты бы сам годами собирал на пространствах гугла (ну если ты конечно не красноглазый задрот, который днями и ночами сидит за компом и даже не выходит на улицу, потому что дневной свет слепит глаза). Есть курсы, которые предлагают первое бесплатное занятие. На нем ты конечно и не узнаешь весь ожидаемый материал, но зато оценишь преподавателя, его манеру общения и сможешь решить стоит ли тебе платить за курс обучения с ним или, как обычно говорят на рынках я посмотрю еще и тогда вернусь.

Unity vs Unreal Engine (UE)

Как ты уже догадался речь пойдет о игровых движках. Какой лучше выбрать? Ответ дам простой какой понравится. Ведь в этом то я тебя ограничивать не буду. Есть много игровых движков, как профессиональных, так и простых. Но Unity и UE считаются самыми популярными. Но ты можешь посмотреть и множество других, таких как CryEngine, Godot, Creation Engine или какой-то конструктор по типу Construct, или вообще можешь написать свй и не от кого не зависеть.

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

  • Unity может справиться даже из слабыми ПК, ну конечно не из самыми древними мумиями, но 4 гб оперативы и 1 гб видеокарты потянет. Не для масштабного ААА проекта, а для какой-то простенькой игрушки вполне сойдет.

    Конечно программировать будешь на C#, так как JavaScript был выпилен из движка. Ну а если ты жестокий фанат JS, то можешь скачать раннюю версию и наслаждаться разработкой. Так же можешь использовать внешние плагины чтоб программировать например на Python.
    А вообще на этом движке можешь создавать хоть ААА проекты, хоть обычные 2D платформеры для различных устройств (хоть для Android, PC, IOS, tvOS (только представь, твой чудик, который создашь, будет бегать по всех теликах планеты)) так как он считается кроссплатформенным. Только набей свой комп хорошей начинкой и в бой за орденами.

  • Unreal Engine как минимум 8 гб оперативы точно нужно. Так как это мощный игровой движок и Unity уступать ничем не собирается. Тут без проблем создавай что хочешь, хоть ААА, хоть 2D, хоть 2D с элементами ААА. Только одень свой ПК пристойно, чтоб он не залагал только при нажатии на сам ярлык. А так этот движок тоже кроссплатформенный, как и Unity. Правда язык программирования тут С++ и BluePrint (визуальный скриптинг для тех кто не шарит в программировании). Все что душе угодно. Разработчики так устроили это логово чтоб заманить всех кто шарит и тех кто не шарит в программировании. Все что вашей душе угодно лишь бы вы хоть что-то делали.

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

Сможет ли сантехник с нулевыми знаниями стать геймдев разработчиком?

Бессрочный ответ да. Разработчиком может стать кто угодно. Хоть даже повар, который не умеет готовить. Может просто готовка это не его, а где-то в глубине души он прирожденный игродел.

Главное это желание, собранность, настойчивость и пару сотен тонн нервов. Так как они ой как пригодятся. Особенно если не будет что-то получаться. Всему свое время. Со временем разработки ты получаешь навыки, которые в будущем будут приносить доход если направить их в нужное, а главное - правильное русло. Так же многие говорят, чтоб стать успешным разработчиком нужно долбать гугл целый день и работать. Полностью не согласен. Так как есть еще такие вещи как здоровье, семья и отдых. Работать нужно в свое удовольствие. А не пыхтеть целый день чтоб еще чуть-чуть и глаз дергался. А потом приобрести билет в один конец в дурку.

А если работа не приносит удовольствия, то это каторга. Особенно если эта каторга за копейки. Многие, кто работают на нелюбимой работе просто говорят, что они ничего не умеют и это единственный их доход, а на лучшую работу нужно лучшие навыки. ТАК БЛИН ЧТО ЖЕ МЕШАЕТ ТЕБЕ ИХ ПРИОБРЕСТИ? Ты можешь временно работать на этой работе для того чтоб получать з/п и с голоду не откинуться, а в свободное время можешь приобретать навыки в любимом занятии.

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

Выводы

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

Но также, эти навыки можно приобрести и немного быстрее наняв преподавателя. Если знания нулевые, то сойдет любой преподаватель. Так как в таком случае он шарит больше чем ты. А если бюджет позволяет, то лучше нанять качественного. А, так же, нужно иметь желание, тонны пачек нервов, самоорганизованность и конечно стремление и любовь к играм. Так как без этих параметров навряд ли ты сможешь продвинуться если будешь опускать руки после каждой неудачи. Илон Маск тоже не с первой попытки стал успешным. Так что работай над собой, выбери свою дорогу, цель и следуй ей. И помни что эта дорога будет подобна различным раннерам, то есть на этом пути обязательно будут вещи или люди, которые будут стараться сбить тебя с пути и не дойти к цели. А если потерпишь неудачу и сдашься, то свернешь с пути раньше, чем узнаешь какой приз ждет тебя в конце этого пути. И каждый навык расценивай как чекпоинт в играх, приобретая который, ты сохраняешь свой прогресс на пути и после неудачи можешь воскреснуть с этой точки сохранения. Все в твоих руках! Главное верь в это, и ты добьешься своего успеха!

Удачи!

Подробнее..

Перевод От int main() до BeginPlay как происходит инициализация Unreal Engine под капотом

24.03.2021 14:22:50 | Автор: admin

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

Но когда вы пишете игровой код на Unreal Engine, вы не имеете дело с игровым циклом напрямую. Вы не начинаете работать сразу с основной функцией сначала вы определяете подкласс GameMode и переопределяете функцию под названием InitGame. Или пишете одноразовые классы Actor и Component и переопределяете их функции BeginPlay или Tick для добавления собственной логики. Это самый минимум того, что вам нужно сделать: обо всем остальном движок позаботится за вас.

Unreal Engine также предлагает вам как программисту большую мощность и гибкость: конечно, он имеет открытый исходный код, но также возможно и расширение несколькими другими способами. Даже если вы только начинаете работать с этим движком, было бы не лишним получить представление о его GameFramework: о таких классах, как GameMode, GameState, PlayerController, Pawn и PlayerState.

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

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

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

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

И, честно говоря, на этом этапе неизбежны некоторые неприятные сложности. Это можно сравнить с первыми мгновениями после Большого взрыва: происходит куча вещей сразу, и множество систем перекрывают друг друга на очень небольшой площади. Но к тому моменту, когда вы дойдете до InitGame или BeginPlay и написанного вами игрового кода, вселенная уже успевает расшириться, и все принимает более упорядоченную форму.

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

Все начинается в модуле Launch, где вы найдете различные основные функции, определенные для разных платформ. В конце концов, все они находят свой путь к функции GuardedMain в Launch.cpp. Где-то здесь как раз можно увидеть базовый игровой цикл.

Основной цикл движка реализован в классе FEngineLoop:

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

PreInit это место, где загружается большинство модулей. Когда вы создаете игровой проект или плагин с исходным кодом на C++, вы определяете один или несколько исходных модулей в файле .uproject или .uplugin и можете указать в LoadingPhase, когда нужно загрузить этот модуль.

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

Когда цикл движка начинает фазу PreInit, он загружает некоторые низкоуровневые модули Unreal Engine, чтобы инициализировать основные системы и определить основные типы. Затем, если у вашего проекта или включенных плагинов есть свои исходные модули, расположенные на ранних этапах загрузки, они загружаются следующими. После этого загружается основная часть модулей Unreal Engine более высокого уровня.

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

Так что же происходит после загрузки вашего модуля?

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

Итак, если вы определили пользовательский тип Актер (Actor), или пользовательский игровой режим, или что-то еще, объявленное перед UCLASS, цикл движка выделяет экземпляр этого класса по умолчанию, затем запускает его конструктор, передавая CDO родительского класса в качестве шаблона. Это одна из причин, по которой конструктор не должен содержать никакого кода, связанного с геймплеем: на самом деле он предназначен только для установления универсальных деталей класса, а не для изменения какого-либо конкретного экземпляра этого класса.

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

Итак, цикл Engine загрузил все необходимые модули движка, проекта и подключаемых модулей, зарегистрировал классы из этих модулей и инициализировал все необходимые низкоуровневые системы. На этом этап PreInit завершается, и мы можем перейти к функции Init. Если мы немного упростим ее, то увидим, что она передает данные в класс под названием UEngine:

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

Движок это программный продукт, содержащий исходный модуль под названием Engine. В этом модуле находится заголовок под названием Engine.h, а в этом заголовке определен класс UEngine, реализованный как в UEditorEngine, так и в UGameEngine.

На этапе инициализации игры FEngineLoop проверяет файл конфигурации движка, чтобы определить, какой класс GameEngine нужно использовать. Затем он создает экземпляр этого класса и закрепляет его как глобальный экземпляр UEngine, доступный через глобальную переменную GEngine, объявленную в Engine/Engine.h.

Как только завершается создание Engine, происходит его инициализация. По ее завершении цикл движка запускает глобальный делегат для указания завершения инициализации, а затем загружает все модули проекта или плагинов, настроенных для поздней загрузки. На этом инициализация Engine завершается.

Так что же делает класс Engine? На него возложено множество функций, но основная заключается в этом наборе больших массивных функций, включающем Browse и LoadMap. Мы рассмотрели загрузку процесса и инициализацию всех систем движка, но для того, чтобы зайти в игру, нам нужно загрузить карту, и делается это при помощи класса UEngine.

Engine может просматривать URL-адрес, который представляет собой либо адрес сервера для подключения в качестве клиента, либо имя карты для локальной загрузки. В URL-адресах есть и свои добавляемые аргументы. Когда вы устанавливаете карту по умолчанию в файле DefaultEngine.ini вашего проекта, вы говорите движку автоматически переходить к этой карте при загрузке. Конечно, в своих сборках вы также можете переопределить карту по умолчанию, указав новый URL-адрес в командной строке, или можете использовать команду open для перехода на другой сервер или карту во время игры.

Итак, давайте посмотрим на инициализацию класса Engine. Она происходит перед загрузкой карты и делает это посредством создания нескольких важных объектов: GameInstance, GameViewportClient и LocalPlayer. Можно утрированно представить, что LocalPlayer это представление пользователя, сидящего перед экраном, а GameViewportClient это и есть сам экран: по сути, это высокоуровневый интерфейс для систем рендеринга, звука и ввода.

Класс UGameInstance был добавлен в Unreal 4.4 и выделен из класса UGameEngine для обработки некоторых функций, более специфичных для проекта, которые ранее обрабатывались в Engine.

Итак, после инициализации класса Engine у нас появляются GameInstance, GameViewportClient и LocalPlayer. Теперь игра готова к запуску: именно здесь происходит первоначальный вызов LoadMap. К концу вызова LoadMap у нас будет UWorld, содержащий всех актеров, сохраненных на нашей карте, а также несколько новых актеров, формирующих ядро GameFramework, включающее игровой режим, игровую сессию, состояние игры, диспетчер игровой сети, контроллер игрока, состояние игрока и пешку.

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

Все, что происходит до LoadMap, привязано ко времени жизни процесса. Все остальное например, GameMode, GameState и PlayerController, создается уже после загрузки карты и остается там до тех пор, пока вы играете на этой карте. Движок действительно поддерживает так называемый seamless travel, когда вы можете переходить на другую карту, сохраняя при этом некоторых актеров со старой. Но если вы сразу перейдете к новой карте, или подключитесь к другому серверу, или вернетесь в главное меню, тогда все актеры будут уничтожены, мир очищен, и эти классы не будут отображаться, пока вы не загрузите другую карту.

Итак, давайте посмотрим на то, что происходит в LoadMap. Это сложная функция, но если мы вернемся ее к основам, то выясним, ее не так уж и сложно понять.

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

Короче говоря, к этому моменту World уже не будет. Однако у нас есть Контекст Мира (World Context). Этот объект создается экземпляром игры во время инициализации Engine, и по сути, это постоянный объект, который отслеживает, какой мир загружен в данный момент. Перед загрузкой чего-либо еще GameInstance может предварительно загрузить любые ассеты, которые ему могут понадобиться, но по умолчанию ничего не делает.

Далее нам нужно получить UWorld.

Если вы работаете с картой в редакторе, редактор загружает в память UWorld вместе с одним или несколькими ULevels, которые содержат размещенных вами Актеров. Когда вы сохраняете свой постоянный уровень, этот Мир, его Уровень и все его Актеры сериализуются в пакет карты, который записывается на диск в виде файла .umap. Во время LoadMap движок находит этот пакет и загружает его. На этом этапе мир, его постоянный уровень и актеры на этом уровне, а также WorldSettings загружаются обратно в память.

Теперь у нас есть World, и мы должны его инициализировать.

Движок дает миру ссылку на GameInstance, а затем инициализирует глобальную переменную GWorld. Затем мир устанавливается в WorldContext, ему присваивается тип в данном случае Game, и он добавляется в корневой каталог. InitWorld позволяет миру настраивать такие системы, как физика, навигация, искусственный интеллект и аудио.

Когда мы вызываем SetGameMode, мир просит GameInstance создать актера GameMode. Как только это происходит, движок полностью загружает карту то есть, загружаются все подуровни вместе с ассетами.

Далее мы переходим к InitializeActorsForPlay. Это то, что Engine называет подведением мира к игре. Здесь World перебирает всех актеров в нескольких разных циклах. Первый цикл регистрирует все компоненты актеров в мире.

Происходит регистрация каждого компонента ActorComponent в каждом Actor, что делает для компонента три важных вещи:

  • Во-первых, мы получаем ссылку на мир, в который он был загружен;

  • Затем рпроисходит вызов функции компонента OnRegister, дающий ему возможность выполнить любую раннюю инициализацию;

  • В случае PrimitiveComponent после регистрации компонент будет иметь FPrimitiveSceneProxy, созданный и добавленный в FScene, являющийся версией потока рендеринга UWorld.

После регистрации компонентов World вызывает функцию InitGame GameMode. Это заставляет GameMode породить актера GameSession. После этого у нас есть еще один цикл, в котором мир проходит от уровня к уровню, и каждый уровень инициализирует всех своих актеров. Это происходит за два прохода. В первом проходе Уровень вызывает функцию PreInitializeComponents для каждого Актера. Это дает участникам возможность инициализироваться довольно рано после регистрации компонентов, но до их инициализации.

GameMode это такой же актер, как и любой другой, поэтому здесь также вызывается функция PreInitializeComponents. После этого GameMode порождает объект GameState и связывает его с миром, а также порождает GameNetworkManager, прежде чем, наконец, вызвать функцию InitGameState.

Наконец, мы повторяем цикл по всем актерам, на этот раз вызывая InitializeComponents, а затем PostInitializeComponents. InitializeComponents перебирает все компоненты актеров и проверяет две вещи:

  • Если в компоненте включена функция bAutoActivate, необходимо активировать компонент;

  • Если в компоненте включен bWantsInitializeComponent, произойдет вызов функции InitializeComponent.

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

На этом этапе наш вызов LoadMap почти завершен: все актеры загружены и инициализированы, мир готов для запуска в игре, и теперь у нас есть набор актеров, используемых для управления общим состоянием игры: GameMode определяет правила игры, он же порождает большинство актеров кор-геймплея. Это высший авторитет того, что происходит во время игры, и он существует только на сервере. GameSession и GameNetworkManager также работают только на сервере. Сетевой менеджер используется для настройки таких вещей, как обнаружение читов и предсказание движения. А для онлайн-игр GameSession одобряет запросы на вход и служит интерфейсом для онлайн-сервисов (например, Steam или PSN).

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

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

В этот момент LoadMap перебирает все LocalPlayers, присутствующие в нашем GameInstance: обычно таковой существует только один. Для конкретного LocalPlayer он вызывает функцию SpawnPlayActor. Обратите внимание, что PlayActor здесь взаимозаменяем с PlayerController: эта функция порождает PlayerController. LocalPlayer, как мы уже убедились, является представлением игрока в движке, а PlayerController представлением игрока в игровом мире.

LocalPlayer на самом деле является специализацией базового класса Player. Есть еще один класс Player под названием NetConnection, который представляет игрока, подключенного из удаленно.

Чтобы любой игрок мог присоединиться к игре независимо от того, локальная она или удаленная, он должен пройти процесс входа в систему. Этот процесс обрабатывается GameMode. Функция PreLogin в GameMode вызывается только для попыток удаленного подключения: она отвечает за утверждение или отклонение запроса на вход. Как только мы получаем добро на добавление игрока в игру, происходит вызов Login. Функция Login порождает актера PlayerController и возвращает его в мир.

Конечно, поскольку мы создаем актера после того, как создали мир, этот актер инициализируется при своем появлении. Это означает, что происходит вызов функции PostInitializeComponents нашего PlayerController, которая, в свою очередь, порождает актера PlayerState.

PlayerController и PlayerState похожи на GameMode и GameState в том, что один из них является официальным представлением игры (или игрока) на сервере, а второй содержит данные, которые каждый должен знать об игре (или игроке).

После создания PlayerController World полностью инициализирует его для работы в сети и связывает с объектом Player. После этого вызывается функция PostLogin игрового режима, которая дает игре возможность выполнить любую настройку, которая должна произойти в результате присоединения этого игрока. По умолчанию игровой режим будет пытаться создать Pawn для нового PlayerController в PostLogin. Pawn это особый тип актера, которым может владеть Controller. PlayerController это специализация базового класса Controller. Есть еще один подкласс под названием AIController, использующийся для неигровых персонажей.

Это давнее соглашение в Unreal: если у вас есть актер, который перемещается по миру, руководствуясь собственным автономным процессом принятия решений будь то игрок-человек, принимающий решения и переводящий их в данные ввода, или ИИ, принимающий решения более высокого уровня о том, куда идти и что делать, обычно у вас есть два актера. Controller это тот, кто управляет актером, а Pawn представление актера в мире. Поэтому, когда к игре присоединяется новый игрок, GameMode по умолчанию порождает Pawn для нового PlayerController.

Ваш PlayerState может быть настроен так, чтобы игрок был простым наблюдателем без возможности взаимодействия с миром, или вы можете настроить GameMode, чтобы изначально все игроки были только зрителями. В этом случае GameMode не будет порождать Pawn, а вместо этого PlayerController создаст свой собственный SpectatorPawn, позволяющий следить за происходящим в игре, не взаимодействуя с игровым миром.

В противном случае при PostLogin игровой режим выполнит то, что называется перезапуском игрока. Для примера возьмем мультиплеерный шутер: если игрока убивают, его Pawn оказывается мертва: она больше не находится под контролем игрока он просто висит как труп, пока не произойдет перезапуск игры. Но PlayerController все еще продолжает существовать, и когда игрок захочет возродиться, игра должна создать для него новую Pawn. Вот что делает RestartPlayer: при наличии PlayerController он найдет актера, представляющего, где должна быть создана новая Pawn, затем определит, какой класс Pawn нужно использовать, и создаст экземпляр этого класса.

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

В любом случае, после создания Pawn будет связана с PlayerController, которому она принадлежит. Теперь, когда мы вернемся в LoadMap, у нас будет все готово для фактического запуска игры. Все, что осталось сделать это маршрутизировать событие BeginPlay. От Engine к World, от World к GameMode, от GameMode к WorldSettings, а WorldSettings, в свою очередь, перебирает всех актеров.

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

Давайте в качестве повторения быстро пробежимся по всему еще раз.

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

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

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

На этапе инициализации мы начинаем настройку самого движка. Короче говоря, мы создаем объект Engine, инициализируем его, а затем запускаем игру. Чтобы инициализировать движок, мы создаем GameInstance и GameViewportClient, а затем создаем LocalPlayer и связываем его с GameInstance. После этого мы можем начать загрузку игры.

Мы выясняем, какую карту будем использовать, переходим к этой карте и сообщаем GameInstance о том, что сделали.

Остальная часть нашего процесса запуска происходит в вызове LoadMap. Сначала мы находим наш пакет карты, затем загружаем его: он переносит в память всех актеров, помещенных на постоянный уровень, а также дает нам объекты World и Level. Мы находим наш мир, даем ему ссылку на GameInstance, инициализируем некоторые системы, а затем создаем актера GameMode. После этого мы полностью загружаем карту, добавляя все необходимые подуровни и ассеты. Когда все оказывается полностью загружено, мы начинаем подходить мир к игре. Сначала мы регистрируем все компоненты для каждого актера на каждом уровне, а затем инициализируем GameMode, который, в свою очередь, порождает актера GameSession. После этого мы инициализируем всех актеров в мире.

Сначала мы вызываем PreInitializeComponents для каждого актера на каждом уровне: когда это происходит для GameMode, он порождает GameState и GameNetworkManager, а затем инициализирует GameState. Затем в другом цикле мы инициализируем каждого актера на каждом уровне: происходит вызов InitializeComponent (и, возможно, Activate) для всех компонентов, которым это необходимо, после чего актеры уже формируются окончательно.

Как только мир будет готов к запуску в игре, мы можем зарегистрировать LocalPlayer внутри игры. Здесь мы создаем PlayerController, который, в свою очередь, порождает для себя PlayerState и добавляет это PlayerState в GameState.

Затем мы регистрируем игрока в GameSession и кэшируем начальную точку старта. Создав PlayerController, мы можем инициализировать его для работы в сети и связать с нашим LocalPlayer. Затем мы переходим к PostLogin, где, предполагая, что все необходимые настройки произведены, мы можем перезапустить игрока, что означает, что мы выясняем, где его точка старта в мире. Выясняем, какой класс Pawn использовать, а затем вызываем и инициализируем его. Помимо Pawn, у нас еще есть PlayerController, ей владеющий, и можно установить значения по умолчанию для этой Pawn.

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

Мы рассмотрели здесь много вещей, поэтому выделим самое важное:

  • Мы рассматривали классы GameModeBase и GameStateBase, а не GameMode и GameState. Эти базовые классы были добавлены в Unreal 4.14, чтобы исключить некоторые функциональные возможности Unreal-Tournament из игрового режима. В то время как GameModeBase содержит все основные функции игрового режима, класс GameMode добавляет концепцию матча с изменениями состояния матча, которые происходят после BeginPlay. Это позволяет следить за потоком игры например, за готовностью всех игроков, за временем начала и окончания игры и переходом к новой карте для следующего матча.

  • Мы также рассмотрели класс Pawn, но помимо него GameFramework определяет класс Character, который является специализированным типом Pawn, включающим сразу несколько полезных функций. У класса Character есть капсула столкновения, которая используется в основном для движений, а также скелетная сетка, в связи с чем предполагается, что он является анимированным персонажем. Еще у него есть компонент CharacterMovementComponent, тесно связанный с классом Character и выполняющий несколько полезных вещей. Самым важным является то, что движение персонажа воспроизводится из коробки с предсказанием движения на стороне клиента. CharacterMovement реализует полный набор опций передвижения для ходьбы, прыжков, падений, плавания и полета.

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

Итак, вот все те классы, которые мы рассмотрели (за исключением UWorld и ULevel):

Мы убедились, что у Unreal есть зрелая Game Framework, которая имеет устоявшийся дизайн для обработки таких вещей, как онлайн-интеграция, запросы на вход и репликация сети. Это означает, что вы можете довольно легко разрабатывать многопользовательские игры из коробки, и движок позволяет добавлять пользовательские функции практически на любом уровне. Если вас больше всего интересует создание простых однопользовательских игр, то столь комплексная Game Framework может оказаться для вас довольно бесполезной.

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

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

Подробнее..

Недельный геймдев 21 6 июня, 2021

09.06.2021 00:09:23 | Автор: admin

Из новостей на неделе: вышел Unity 2021.2a19 с обновлением пайплайна работы с ассетами, исходники Периметра на Гитхаб выложили, вышел Blender 2.93 LTS, AMD FidelityFX Super Resolution появится в первых играх уже 22 июня, в Steam появились совместные наборы, прогресс по GDScript в Godot по пути к 4.0, вышли Howler 2022, KeyShot 10.2 и новый пакет Arm Mobile Studio для Unity.

Из интересностей: исследование того, как Nanite работает изнутри, советы по оптимизации работы с Substance, анимированный мост в Unreal Engine чисто в шейдере, интересные примеры VFX из недавних фильмов.

Обновления/релизы/новости

Вышел Unity 2021.2a19

Из крутого, как по мне, появилась поддержка параллельного импорта моделей и текстур (включить в Project Settings -> Editor -> Refresh).

И появилось окно импорта ассетов: позволяет посмотреть дату импорта, предыдущие версии ассетов, список зависимостей, импортеры, используемые для импорта артефакта, длительность импорта и многое другое.

Исходники Периметра на Гитхаб выложили

Можно собрать, как минимум, на XP и Win7.

AMD FidelityFX Super Resolution появится в первых играх уже 22 июня

  • На картах AMD прирост до 60%.

  • 4 пресета качества.

  • А так как оно не привязано к AMD, то будет работать и на картах Nvidia. На GTX 1060 даёт +41%

Вышел Blender 2.93 LTS

Который знаменует собой завершение более чем двадцатилетней истории разработки. А скоро появится и 3.0.

  • Новый воркспейс и редактор спредшитов для геометрических нод.

  • Новые способы использовать маски на моделях во время лепки.

  • Более быстрый и качественный рендеринг в Cycles и Eevee.

  • Крупное обновления набора инструментов Grease Pencil для 2D-анимации.

  • Обновились многие тулсеты.

Подробнее на сайте.

В Steam появилась новая функция под названием совместные наборы

С её помощью разработчики и издатели могут создавать наборы из нескольких игр в Steam совместно с другими разработчиками и издателями.

Подробнее в доках.

Вышел Verge3D 3.7 для Blender

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

Кроме того, включили в это обновление 3 новых демки.

Прогресс по GDScript в Godot по пути к 4.0

Ещё многое предстоит сделать, но и в этом обновлении достаточно интересных новшеств.

  • Типизированные массивы.

  • Лямбда-выражение.

  • Статические методы для встроенных типов.

  • Оптимизации. В частности, ведётся работа над уменьшением ветвлений. Вводится временный стек, чтобы убрать переинициализацию вариантов. Это поможет с типами, которые требуют аллокаций, например, Transform.

  • Покрытие тестами.

В библиотеку Chaos Cosmos для V-Ray было добавлено 100 новых ассетов

Идеально подходящих для интерьера: столы, стулья, лампы и посуда. В дополнение библиотека теперь включает несколько человеческих персонажей от AXYZ Design, одного из ведущих поставщиков отсканированных фотографий людей в 3D.

Unity хотят переосмыслить Unite

Поэтому в этому году конференции не будет. Ждём 2022.

Вышел Howler 2022

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

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

SpookyGhost вышел в опенсорс по MIT лицензии

Кроссплатформенный инструмент для процедурной анимации, созданный с использованием игрового движка nCine 2D на C++ и ImGui для UI, можно посмотреть на Гитхабе.

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

Вышел KeyShot 10.2

Добавили инструмент Mesh Simplification для уменьшения числа треугольников моделей, предназначенный для упрощения их повторного использования в AR приложениях, таких как KeyVR KeyShot.

Библиотека материалов KeyShot также была обновлена: теперь пользователи могут выбирать семь различных 3D-моделей для предварительного просмотра материалов в виде миниатюр.

Вышел новый пакет Arm Mobile Studio для Unity

Новый инструмент для анализа производительности мобильных устройств.

Интересные статьи/видео

Nanite: взгляд изнутри

Эмилио Лопес, Senior Graphics Engineer из Playground Games, поделился своим взглядом на Nanite и попытался разобрать то, как система работает. При исследовании во многом полагался на RenderDoc.

Запись стрима на канале Unreal Ungine по работе с Nanite в UE5 и про саму технологию

Оптимизация работы с Substance

Виктор Андреенков поделился советами, как сделать Substance Painter менее требовательным по железу без снижения качества работы.

Анимированный мост в Unreal Engine чисто в шейдере

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

Создание мифических существ и VFX дыма с огнём

Члены команды REALTIME рассказали 80lv о создании мифических существ для тв-сериалов и обсудили процесс создания реалистичных визуальных эффектов дыма и огня.

Разное

Про создание VFX в Армии мертвецов Зака Снайдера

Использовалось сочетание наземных и воздушных снимков LIDAR и дронов.

Примеры VFX в Майор Гром: Чумной Доктор

Подробнее..

Недельный геймдев 22 13 июня, 2021

16.06.2021 00:20:01 | Автор: admin

Из новостей на этой неделе: стала доступна превью версия Unreal Engine 4.27 с включёнными в движок Bink Video и Bink Audio, Unity выпустили новый стартовый пак, вышла новая версия движка Diligent Engine 2.5, Activision выпустили расширение для Windows для просмотра USD-файлов, разработчики Cascadeur получили дополнительные 1.5 миллиона долларов на развитие продукта, PolyHertz выпустил новый скрипт UnChamfer Pro для 3ds Max, Khronos запускают программу сертификации 3D-просмотровщиков.

Из интересностей: подробный доклад от Insomniac про работу со светом в Marvels Spider-Man, занятная механика для VR игры, полезный доклад от Риотов про то, как они балансят и нерфят персонажей.

Обновления/релизы/новости

Стала доступна превью версия Unreal Engine 4.27

Из ключевого:

  • Oodle и Bink теперь встроены в движок.

  • Улучшения по части Open XR.

  • Path Tracer теперь в бетке.

  • Куча улучшений GPU Lightmass: запекания, теней, поддержки mGPU.

  • Обновление Niagara: версионность модулей, новый дебагер, куча улучшений UX/UI.

  • Оптимизировали рендеринг на мобильных платформах. Ключевые направления оптимизаций: Distance Field Shadows, Fast Approximate Anti-Aliasing (FXAA), Temporal Anti-Aliasing (TAA).

  • Изменения по части Datasmith, особенно в Datasmith Exporter Plugin для ArchiCAD.

  • Огромное число изменения инструмента для синематиков и виртуального продакшена.

Bink Video и Bink Audio теперь доступны в Unreal Engine бесплатно

Epic Games выпустили последние изменения по интеграции технологии RAD Game Tools (которые приобрела в начале этого года) в Unreal Engine. Доступно в Unreal Engine 4.27 и Unreal Engine 5.

Bink Video и Bink Audio кроссплатформенные видео и аудио кодеки с упором на производительность.

Разработчики Cascadeur получили дополнительные 1.5 миллиона долларов от Nekki

Спустя 2 месяца после выхода в ранний доступ этот инструмент для анимаций насчитывает уже 80000 пользователей. Команда, тем времени, из 25 разработчиков должна вырасти до 30. Компания планирует достичь двух важных этапов к полноценному релизу в 2022:

  1. Улучшить по максимуму уникальные инструменты Deep Physics с поддержкой AI.

  2. Функциональные возможности Cascadeur должны быть расширены дополнительными стандартными инструментами.

Unity выпустили новый стартовый пак

Набор содержит бесплатные и легковесные базовые контроллеры персонажей от первого и третьего лица для последней версии Unity 2020 LTS и более поздних версий с использованием Cinemachine и Input System.

Старые версии Unity также могут работать с паком, но, вероятно, нужно будет что-то дотюнить.

МФТИ и Gaijin Entertainment запускают магистерскую программу (4 семестра) по программированию игр

Заявку нужно подать до 30 июня. Обучение очное.

Вышла новая версия движка Diligent Engine 2.5

В этой версии:

  • Трассировка лучей теперь включена на Metal.

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

  • Несколько контекстов позволяют выполнять асинхронные вычисления и параллельный рендеринг.

  • Запросы на RT позволяют бросать лучи из обычных шейдеров (пиксельные, вычислительные и т. д.).

Activision выпустили расширение с открытым исходным кодом для Windows для просмотра USD

Проект доступен на GitHub под лицензией Apache 2.0 и позволяет пользователям Windows взаимодействовать с USD файлами (всё более широко используемым отраслевым форматом, созданным Pixar) прямо в Windows Explorer.

Первую версию браузера ассетов добавят в Blender 3.0

Пользователи давно ждут нечто подобное.

Epic Games поделились кратким руководством для тех, кто хочет познакомиться с Unreal Engine 5

В 16-страничной pdf-ке разобраны основные вопросы и приведены полезные ссылки. Ничего того, что есть в онлайн документации, но зато всё кратко и сжато. Как раз подойдёт для ознакомления.

PolyHertz выпустил новый скрипт UnChamfer Pro для 3ds Max

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

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

Они не будут брать комиссию с ревенью, если вы не используете их специальное решение для монетизации.

Ранее компания изменила прайс, помомо подписки захотели процент процент с ревенью: 30%, если у вас план Plus, 10%, если у вас PRO план. Вовремя одумались.

Faceware Technologies запустили Faceware Studio PLE, новую бесплатную версию Faceware Studio, программы для мокапа в реальном времени

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

Вышла бетка Kinetix Advanced

Облачный инструмент позволяет сгенерировать 3d-анимацию из .MP4 видео.

Можно попробовать бесплатно, преобразовав 60-секундное видео. За 15 евро в месяц можно конвертировать до 3 минут видео и иметь доступ ко всем инструментам, которые предлагает Kinetix, а за 120 евро в месяц 30 минут видео.

Khronos запускают программу сертификации 3D-просмотровщиков

Консистентное отображение на различных платформах повышает доверие потребителей. CGTrader и Sketchfab уже подписались.

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

Интересные статьи/видео

4 полезных совета по работе с Substance Painter для новичков

  1. Маски ваши лучшие друзья.

  2. Будьте рассказчиком. Недостаточно просто навесить текстурки, важно понимать, как эти объекты будут смотреться рядом с другими.

  3. Нужно понимать/осознавать как свет и игровые движки влияют на ваши текстуры.

  4. Создайте свою собственную библиотеку материалов.

На этой неделе Epic Games обсудили новую систему глобального освещения Lumen из Unreal Engine 5

Специалисты рассказали, что это такое, как включить, и что технология из себя предоставляет.

Полезный доклад от Риотов про то, как они балансят и нерфят персонажей

Не смотрите на оценки под видео, контент норм. Там приведены реальные данные и метрики и, что самое главное, докладчик рассказывает, как они принимают решения на основе этих данных.

Подробный доклад от Insomniac про работу со светом в Marvels Spider-Man

Разное

Разбор VFX из фильма Поколение Вояджер (2021)

Подробнее..

Заходят как-то в бар Мандалорец, Генлок и СКМ

24.11.2020 12:18:29 | Автор: admin
Это был обычный летний будний день между первой и второй волнами коронавируса, а это значит, что мы (СКМ Трекинг) могли позволить себе такую роскошь как работа в офисе с полигоном для тестирования нашей гибридной радио-инерциальной системы захвата движений под боком. Тут нам поступил звонок:
узнали про вашу систему трекинга и хотим посмотреть ее в действии, прямо сейчас, так как вечером мы возвращаемся в Питер!
Хоть мы и были в офисе, но профилактические меры не позволяли пропускать кого-либо в здание кроме сотрудников, поэтому мы продолжили телефонный разговор и выработали план действий с учетом карантинных мер.
Заказчиками на том конце провода оказались ребята из Black Anchor Productions Ltd. и Parallax Digital. Они еще раз описали задачу, которую предполагалось решить с помощью нашей системы трекинга (захвата движений), указали желаемые характеристики системы, и мы согласовали первую серию онлайн тестов.
Без онлайна в этом году никуда, и поэтому, прежде чем проводить тесты на их площадке в Питере, заказчику важно было понять способности системы в целом и определить возможность ее интеграции в свои процессы. Поэтому совместно мы определили условия, в которых необходимо протестировать систему и способы визуализации и представления результатов тестирования.

Домашние тесты


После этого мы с зарядом бодрости направились готовить систему и проводить, собственно, сами тесты, по которым успели соскучиться за время карантина и удаленки. Задача была показать работу системы в статике с наличием различных шумов, которые нам были доступны на тот момент и без них, и такие же тесты в динамике. При этом на выходе наша система должна была выдавать 3D координаты (за счет радио модулей) и углы поворотов (за счет инерциальных датчиков).

image

image

image

Направили все результаты теперь как говорится мячик на их стороне. Спустя несколько недель обратной связи и уточнения с нашей стороны требуемых характеристик и условий работы, а с их стороны текущих и потенциальных возможностей и режимов работы нашей системы (без уточняющих тестов с приходом новой информации не обошлось конечно), нам поступило приглашение приехать на офлайн тесты в культурную столицу нашей Родины Санкт-Петербург, он же Питер, он же СПБ, а олды скажут Ленинград. Нам тогда позвонил их генеральный директор Кирилл Андреевич и сказал:
приезжайте завтра в Питер к нам на площадку на неделю, с проживанием поможем
От такого хорошего предложения трудно отказаться, поэтому мы собрали систему, взяли билеты на ночной поезд и рванули в Питер! Я как любитель путешествий вдвойне была рада уехать куда-то дальше 100 км от Москвы после больше чем полугода карантина и изоляции, да еще и в такой красивый город!

Разведка боем


Прибыли на Московский вокзал, где нас встретила и заселила в апартаменты недалеко от площадки заказчика очаровательная Анна Карелкина операционный управляющий компании Black Anchor Productions & Parallax Digital.

image

Мы разместились в нашем новом доме, кто-то из членов нашей команды даже успел немного поспать и к назначенному времени прибыли на площадку. Дальше все как в тумане)
Площадка находится в историческом центре петроградского района, в телецентре АО Телерадиокомпания Петербург полноценный съемочный павильон, в котором проходили настоящие съемки передачи в тот момент как мы туда впервые зашли.

image

image

Огромный павильон 17 * 30 метров с высокими потолками 10 м, которых нам так не хватает на нашем полигоне. Я думаю многие задумывались при просмотре фильмов и телепередач А как же это все снимают? Как всё происходит?. И вот мы попали в теле закулисье и своими глазами увидели, как осуществляется теле- и кино-магия. Поэтому если вы меня спросите о каких-то деталях переговоров в тот первый день я навряд ли смогу что-либо вспомнить, так как с любопытством наблюдала за съемочным процессом.

image

image

Кстати о съемочном процессе. Он был не совсем обычный ведь мы были на площадке не просто у магов, а магов первого уровня! (ну или какая у них там градация). Это новая прорывная технология в области кинопроизводства которая позволяет сократить не только сроки производства, но и его бюджет.

image

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

image

Качественное преимущество новой на нашем рынке технологии, которую сейчас развивает команда Black Anchor Productions & Parallax Digital заключается в эффекте Parallaх изменении видимого положения объекта относительно удалённого фона в зависимости от положения наблюдателя. На применении физических и оптических свойств этого космического эффекта в прямом смысле ведь данный термин пришел к нам из астрономии, где он применяется для измерения расстояния до удалённых объектов (в частности в парсеках) сделали ставку Джон Фавро и компания Disney + и создали с ее помощью сериал Звёздные войны: Мандалорец, который стал настоящим прорывом в киноиндустрии. Как признались руководители это стало одной из вещей, которая вдохновила их начать работу в этом направлении. Именно тогда стало ясно применение прорывных и новейших технологий это настоящее кредо команды Black Anchor, да и как может быть иначе ведь для этого у них есть все необходимые специалисты, штат которых постоянно расширяется, и работает не только на съемочной площадке, но и в других городах России и за рубежом.

image

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

В процессе наблюдения за съемочным процессом сразу стали ясны преимущества такого вида производства контента:
  • Система трекинга камер позволяет отслеживать положение камеры в любой точке зоны покрытия, виртуальная сцена, разработанная на базе игрового движка компании Epic Games Unreal Engine, меняет ракурс, в зависимости от положения оператора, сохраняя естественную глубину и перспективу заднего фона. Вывод изображения с realtime рендерингом осуществляется на LED экраны высокого разрешения, с достаточной частотой светодиодов и интенсивностью свечения до 4000 lm, для того чтобы получать кинореалистичное изображение в качестве до 16K.

  • Весь набор предпродакшн инструментов находится в руках талантливых vfx художников, которые могут создать любую виртуальную сцену и на программном уровне интегрировать посредством osc и dmx протоколов различные AR и CGI объекты, в зависимости от сценария и задач.


image

image

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


image

image

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


image

image

Трекинг камеры


Для того чтобы виртуальная сцена на экране меняла ракурс, вслед за изменением положения объектива в зоне трекинга, необходим так называемый Genlock это метод, при котором видеовыход одного источника (или определенный сигнал) используется для синхронизации других источников изображения вместе. Это помогает обеспечить совпадение сигналов во времени в точке объединения или переключения. Для этого необходимо знать данные о перемещении камеры и направлять их в режиме реального времени на сервер для синхронизации с виртуальной сценой. Тут главными героями становятся системы трекинга. Про особенности условий работы оптических и инерциальных систем я упоминала в своей прошлой статье Замокапить в экстремальных условиях или как мы принимали участие в шоу ДОЗОР, однако здесь стоит немного другая задача нежели чем разовый мокап актеров система должна отслеживать перемещения камеры на всем съемочном процессе и практически при любых условиях съемки. Идеальная трекинговая система для такого случая универсальная, надежная, точная и пуленепробиваемая!
Специалисты из Black Anchor prod. протестировали все доступные на рынке решения по трекингу, однако универсальной и полностью подходящий под наибольшее число сценариев и условий не нашли, поэтому в данный момент используют разные системы, выбирая нужную исходя из условий, в которых она должна работать не только стабильно, но и с субмиллиметровой точностью. А это значит, что открывается большая возможность быть первыми кто сделает решение наиболее универсальное и подходящее для задач трекинга камеры в кинопроизводстве!
С большей долей вероятности такая задача посильна гибридной системе трекинга (объединяющей 2 или более систем), так как в таком случае можно подчеркнуть все достоинства и свести к минимуму все недостатки, которыми обладают системы в отдельности.
Именно такое гибридное решение и разрабатывает наша команда СКМ Трекинг! С помощью нашего софта мы улучшаем и объединяем данные, которые присылают радио-инерциальные модули. Таким образом наш софт борется с систематической ошибкой инерциальной системы и наличием шумовой составляющей сверхширокополосных радио модулей (СШП). Для этого в нашем арсенале имеются нелинейный алгоритмы комплексной фильтрации на базе собственных моделей движения. Радиосистема реализует алгоритм Time Difference of Arrival (TDoA). Его суть заключается в следующем. Часть модулей, называемые здесь якорями, располагается неподвижно по периметру зоны с известными координатами, синхронизируются между собой и излучают периодический сигнал. На людей, их части тела или другие предметы, положение и ориентацию которых необходимо отслеживать, крепятся модули, называемые маркерами, которые работают исключительно на прием данных сигналов. Т.к. моменты излучения сигналов тегу неизвестные, он измеряет разности моментов времени их приемов. Такой подход позволяет обеспечить неограниченное число тегов, а большая дальность их работы большую рабочую зону.

Теория, конечно, хорошо, но что же на практике?

Итак, вернемся на площадку!


Мы познакомились с основными членами команды Black Anchor prod. и определили план тестов на первый день с учетом съемочного процесса. Нам выделили место на площадке где мы можем расположить себя, наши ПК и систему полноценное рабочее место!

image

В первый день мы смогли продемонстрировать работу системы на небольшой площади с выводом результатов на экран нашего ноутбука, а также проверить нет ли взаимного влияния нашей системы с оборудованием на площадке на работу нашей системы оборудование не оказало существенного влияния, также как и наша система на оборудование. Весь секрет заключен в СШП радио модулях, которые работают на выделенной частоте в СВЧ диапазоне. Кстати, уже сейчас в мобильные устройства нового поколения включают СШП модуль, что открывает большие возможности по передачи данных и т.п., ну а мы уже знаем и умеем работать с СШП).

image

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

image

Питались модули от обычных внешних аккумуляторов 2300 мАч, чего хватало на полный рабочий день. Маркер крепили либо на камеру, либо на штатив, когда камера была в работе.

image

image

В процессе тестов мы своими глазами увидели весь рабочий процесс, обсудили и посмотрели текущие решения ребят самая что ни на есть разведка боем и каст дев в поле, чего же еще можно пожелать?
image

И это только начало! А дальше


Команда разработчиков посветила нас в свои дальнейшие планы: в дальнейшем приоритет будет смещаться в сторону создания собственного аппаратного и программного комплексов, который позволит произвести развертывание системы на любой площадке, и комплекс будет полностью мобилен, и позволит работать без потери качества и точности трекинговых систем. Анна, провожая нас, сказала, что в более широком смысле, дальнейший вектор развития компании будет определяться в зависимости от потребностей рынка и киноиндустрии в целом и намекнула, что свои продвижения в этом направлении они намеренны показать в том числе и на примере собственного короткометражного фильма работы над его производством уже закончены остался самый крайний этап постпродакш но как мы уже поняли это не займет много времени технология позволяет видеть почти финальную картинку уже в процессе ее съемки, что пожалуй еще одна важная приятная и крутая особенность.
Отдельное спасибо команде Black Anchor prod. за действительно теплый прием (в том числе и культурную программу), возможность увидеть боли клиента и понять какие параметры и характеристики системы необходимо доработать для кейса трекинга камеры для задач виртуального кинопроизводства.

image

В итоге мы определили наши следующие шаги: дорабатываем определенные параметры и возвращаемся на Питерскую площадку для ее покорения!

To be continued

P. S.

Случайности не случайны? Сейчас как раз дочитываю книгу Виктора Пелевина (кстати, тоже закончил НИУ МЭИ, как и наша команда) S.N.U.F.F., так вот там в пост апокалиптическом обществе описываются технологии, с помощью которых в небольшом помещении можно с помощью 3D экранов и других технологий воссоздать длинную аллею, с набережной и бризом, так что это сложно отличить от реальности. И вот перед нами технологии Black Anchor prod., которые демонстрируют нам что подобное будущее (его хорошие стороны) совсем близко!
Подробнее..

Как статический анализ кода помогает в сфере GameDev

30.11.2020 12:14:44 | Автор: admin
image1.png

Игровая индустрия не стоит на месте и с каждым днём развивается всё быстрее и быстрее. Вместе с ростом индустрии растёт и сложность разработки: кода становится больше и багов в нём тоже становится больше. Поэтому современные игровые проекты нуждаются в особом внимании к качеству кода. Сегодня мы расскажем об одном из способов сделать ваш код лучше статическом анализе, а также о том, как PVS-Studio на практике помогает в разработке крупных (и не только) игровых проектов.

"The most important thing I have done as a programmer in recent years is to aggressively pursue static code analysis. Even more valuable than the hundreds of serious bugs I have prevented with it is the change in mindset about the way I view software reliability and code quality." Джон Кармак

Мы работаем с крупными игровыми разработчиками уже много лет и за это время успели сделать много интересного и полезного для игровой индустрии. Это совсем не удивительно, учитывая список наших клиентов из игровой индустрии. Мы ведём активную поддержку наших клиентов: помогаем им интегрировать PVS-Studio в их собственный процесс разработки, исправляем найденные анализатором ошибки и даже делаем специальные фичи на заказ.

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

Естественно, не обошлось и без интересных историй. О нескольких таких историях и пойдёт речь в этой статье.

PVS-Studio и Unity


image2.png

Одним из способов, с помощью которых мы продвигаем наш продукт, является написание статей о проверке открытых проектов. От этих статей получают пользу все: читатель может посмотреть на интересные ошибки в знакомом проекте и узнать для себя что-то новое, мы получаем возможность показать работу PVS-Studio на реальном коде, а разработчики проектов могут узнать об ошибках и заблаговременно их исправить.

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

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

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

Однако написание статей это далеко не всё. Мы продолжаем работать над PVS-Studio, и GameDev является для нас одним из важнейших направлений для развития. Поэтому мы хотим, чтобы разработчики игр на Unity могли получить как можно более качественный анализ своих проектов.

Одним из шагов по улучшению качества анализа Unity-проектов для нас стало написание аннотаций для методов, определённых в Unity Scripting API.

Аннотации методов это особый механизм, использующийся в PVS-Studio. Он позволяет предоставить анализатору всю необходимую информацию о каком-нибудь конкретном методе. Она прописывается в специальном коде самими разработчиками анализатора (то есть, нами же).

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

Нами уже написано огромное множество различных аннотаций (например, для методов из пространства имён System), и мы были рады пополнить их аннотациями методов из Unity Scripting API.

Мы начали пополнение списка аннотаций с оценки. Сколько всего существует методов? Какие именно стоит проаннотировать первыми? Всего методов оказалось очень много, и мы решили для начала проаннотировать наиболее часто используемые методы.

Поиск популярных методов производился следующим образом: сначала мы собрали пул проектов с GitHub, использующих возможности Unity, после чего с помощью самописной утилиты (основанной на Roslyn) подсчитали вызовы интересующих нас методов. В итоге мы получили список классов, методы которых используются наиболее часто:

  • UnityEngine.Vector3
  • UnityEngine.Mathf
  • UnityEngine.Debug
  • UnityEngine.GameObject
  • UnityEngine.Material
  • UnityEditor.EditorGUILayout
  • UnityEngine.Component
  • UnityEngine.Object
  • UnityEngine.GUILayout
  • UnityEngine.Quaternion
  • ...

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

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

MeshRenderer renderer = cube.GetComponent<MeshRenderer>();Material m = renderer.material;List<int> outNames = null;m.GetTexturePropertyNameIDs(outNames);

крашится непосредственно сам редактор Unity (по крайней мере, в версии 2019.3.10f1). Вряд ли, конечно, кто-то станет писать подобный код, но интересен сам факт того, что редактор Unity можно "повалить" запуском подобного скрипта.

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

void OnEnable(){  GameObject uiManager = GameObject.Find("UIRoot");  if (uiManager)  {    uiManager.GetComponent<UIManager>();  }}

Предупреждение анализатора: V3010 The return value of function 'GetComponent' is required to be utilized. ADDITIONAL IN CURRENT UIEditorWindow.cs 22

Метод GetComponent даже своим названием подразумевает возвращение определённого значения. Логично предположить, что это самое значение должно быть как-то использовано. Теперь (благодаря новой аннотации) анализатор знает, что подобный "бесхозный" вызов этого метода может свидетельствовать о логической ошибке, и предупреждает вас об этом.

Это далеко не единственное срабатывание, появившееся в наборе наших тестовых проектов после добавления новых аннотаций я не буду приводить остальные, чтобы не делать эту статью слишком большой. Главное, что теперь разработка Unity-проектов с использованием PVS-Studio позволяет писать гораздо более безопасный и чистый код без багов.

Если вам хочется подробнее прочитать про нашу работу с аннотациями для Unity-методов, вы можете сделать это в нашей статье: Как анализатор PVS-Studio стал находить ещё больше ошибок в проектах на Unity.

Unreal Engine 4


image3.png

Когда в далёком 2014-м году разработчики Unreal Engine 4 выложили исходный код движка в открытый доступ, мы просто не смогли обойти этот проект стороной и также написали о нём статью. Разработчикам движка понравилась статья и они исправили найденные нами ошибки. Но нам было этого мало, и мы решили попробовать продать компании Epic Games лицензию на наш анализатор.

Компания Epic Games была заинтересована в улучшении своего движка с помощью PVS-Studio, поэтому мы сошлись на соглашении: мы своими силами исправляем код Unreal Engine так, чтобы анализатор не выдавал на него ни одного предупреждения, а ребята из Epic Games покупают нашу лицензию и дополнительно вознаграждают нас за проделанную работу.

Зачем было нужно исправлять все предупреждения? Дело в том, что максимальную пользу от статического анализа можно получить, исправляя ошибки в момент их появления. А когда вы впервые проверяете свой проект, то, как правило, вы получаете несколько сотен (а иногда и тысяч) предупреждений. Среди всех этих срабатываний анализатора легко могут затеряться предупреждения, выданные на свеженаписанный код.

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

Suppress-файлы это специальная функция PVS-Studio, позволяющая "спрятать" срабатывания анализатора в специальный файл. При этом спрятанные предупреждения не будут появляться в последующих логах: их можно будет посмотреть отдельно.

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

Теперь, когда старые предупреждения больше не попадают в лог, вы сможете легко обнаружить новое предупреждение сразу в момент его появления. Написали код > проверили анализатором > увидели новое предупреждение > исправили ошибку. Именно так вы получите максимальную пользу от использования анализатора.

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

Этот сценарий, конечно, удобен, но разработчики из Epic Games хотели, чтобы их код был исправлен сразу, и передали это дело нам.

И мы приступили к работе. Проверив код проекта, мы обнаружили 1821 одно предупреждение уровней Level_1 и Level_2. Разбор такого объёма предупреждений требует серьезной работы, и, чтобы облегчить весь этот процесс, мы настроили непрерывный анализ кода на нашем CI-сервере.

Выглядело это так: каждую ночь на нашем сервере собиралась актуальная версия Unreal Engine 4, и сразу после сборки автоматически запускался анализ. Таким образом, когда наши ребята приходили утром на работу, у них всегда был на руках свежий отчёт анализатора, позволяющий отследить прогресс по исправлению предупреждений. Плюс такая система позволяла в любой момент проверить стабильность сборки, запустив её на сервере вручную.

Весь процесс занял у нас 17 рабочих дней. График исправления предупреждений получился следующий:

image4.png

На самом деле, этот график не полностью отражает нашу работу. После того, как мы исправили все предупреждения, мы еще в течение двух дней ждали, когда они примут наши последние пулл-реквесты. Все это время у нас продолжала работать автоматическая проверка последней версии Unreal Engine, который, в свою очередь, продолжал пополняться новым кодом. И что бы вы думали? За эти два дня PVS-Studio обнаружил в коде еще целых четыре ошибки! Одна из них была особенно серьезной и потенциально могла привести к неопределённому поведению.

Конечно, и эти ошибки мы тоже исправили. Теперь разработчикам Unreal Engine осталось только одно: настроить у себя автоматический анализ так же, как это сделали мы. С этого момента они стали каждый день видеть предупреждения, которые были выданы на только что написанный код. Это позволило им исправлять ошибки в коде еще в момент их появления на самых ранних этапах разработки.

Подробнее о том, как мы работали над кодом Unreal Engine, вы можете прочитать в официальном блоге Unreal Engine или на нашем сайте.

Анализ различных игр


image5.png

Я уже говорил, что мы проверяем различные открытые проекты и пишем о них статьи? Так вот, подобных статей про игровые проекты у нас накопилась просто целая уйма! Мы писали про такие игры, как VVVVVV, Space Engineers, Command & Conquer, osu! и даже (очень древняя статья) Doom 3. А еще мы составили топ 10 самых интересных программных ошибок из видеоигровой индустрии.

Мы также проверили, пожалуй, большинство известных движков с открытым исходным кодом. Помимо Unity и Unreal Engine 4, под наш прицел попали такие проекты, как Godot, Bullet, Amazon Lumberyard, Cry Engine V и многие другие.

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

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

Заключение


На этом моя небольшая статья подходит к концу. Желаю вам чистого и корректно работающего кода без багов и ошибок!

Заинтересовала тема статического анализа? Хочется проверить свой проект на наличие ошибок? Попробуйте PVS-Studio.



Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: George Gribkov. How static code analysis helps in the GameDev industry.
Подробнее..

Процедурная генерация карты

01.04.2021 16:06:37 | Автор: admin

Процедурная генерация DEV BLOG

Dobr Den, сейчас я Вам покажу пример процедурной генерации карты, наUnreal Engine 4.

Функция расчета рандомных точек на игровом поле:

Функция расчета рандомных точекФункция расчета рандомных точек

Давайте подробнее разберем функциюFor Loop.

ЦиклЦикл

Firs Index отвечает за начальную точку отсчета цикла. For Loop цикл, который будет выполниться от First Index до Last Index каждый кадр. Last Index Грубо говоря сколько раз надо выполнить цикл.

Loop Body Логика, которая будет циклична (в нашем случае 150 раз). Index Сколько шагов выполнено из 150 раз.

Теперь Нам надо занести в цикл логику. Начнем с рандомных чисел.

РандомайзерРандомайзер

Random Float in Range Все просто рандомайзер на максималках. Min Минимальное число Max Максимальное число Return Value Рандомное число в диапазоне который мы задали

Нулевая точка координатНулевая точка координат

Break Transform В моем случае это исходная точка координат спавна объектов.

Объяснять что такое Rotation, Scale. Нет смысла.

Начнем с математической части нам надо добавить к нулевой точке координат рандомное число.

МатематикаМатематика

Make Vector объединяет обычные числа в тип Location.

Make VectorMake Vector

Далее по списку вывод данных из функции:

Вывод данныхВывод данных

На выходе у нас стоит:

True Цикл в нашем случае мы спавним Actor Tree 2 (Дерево).

Return Value Рандомная координата для дерева в цикле.

Completed Выход из цикла.

Теперь можно вместо одно дерева, сразу три вида объекта сгенерировать на карте.

Итог:

Готовлю информацию для статьи про Dedicated server(Удаленный сервер), Мультиплеер, Создание сессий и подключение к ним, система стрельбы и сам процесс разработки игры.

Подробнее..

Недельный геймдев 14 18 апреля, 2021

22.04.2021 00:12:56 | Автор: admin

На этой неделе: команда Unity выпустила экспериментальные инструменты для тестирования UI и новую версию Burst 1.5, в раннем доступе вышел Cascadeur 2021.1, вышел Unigine 2.14 с поддержкой C# 9 и новым генератором террейна, MetaHuman Creator запущен в раннем доступе, вышли LuxCoreRender 2.5 и BlendLuxCore 2.5, Unity 2021.2 до конца года получит нативную поддержку DLSS, вышла альфа версия Blender 3.0.


Из интересностей: туториал про запекание освещения с помощью GPU Lightmass в UE4, статья про моделирование меха в Unity с помощью UModeler, воссоздание KITT из Knight Rider с помощью GANverse3D.




Небольшое отступление


Уже какое-то время веду дайджет с ностями из мира разработки игр. Решил и на Хабре публиковатьт, т. к. тут много разработчиков игр.


Обновления/релизы/новости


Экспериментальные инструменты для тестирования UI в Unity



Новый пакет позволяет пользователям записывать взаимодействия с пользовательским интерфейсом Unity проектов и, при необходимости, использовать записи для проведения тестов, как в редакторе, так и на iOS/Android устройствах.


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


Документация доступна тут.


Unity 2021 и Burst 1.5



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


  • Hint.Likely, Hint.Unlikely и Hint.Assume для подсказки компилятору.
  • Direct Call.
  • IsConstantExpression для проверки на константность.
  • Атрибут [SkipLocalsInit]. По функциональности как [SkipLocalsInitAttribute] из C# 5.
  • Множество мелких улучшений.

Прокачиваем графику и производительность с помощью RTX, DLSS и Reflex



На GTC много чего интересного показали. Nvidia по итогу написала отдельный пост про все новшества, касающиеся софтверной части.


В раннем доступе вышел Cascadeur 2021.1, новая версия инструмента для создания анимации без использования захвата движений



Обновление добавляет новый инструмент AutoPhysics, который автоматически создаёт физически точную версию существующей анимации и позволяет использовать инструмент AutoPosing на основе ИИ для любого персонажа-гуманоида.


С обновлением Cascadeur переходит в ранний доступ. Вместе с этим представлено 2 новых плана подписки. При этом софт остаётся бесплатным для всех, кто зарабатывает менее 100 000 долларов в год.


Так же можно ознакомиться с роадмапом разработки Cascadeur.


Вышел Unigine 2.14 с поддержкой C# 9 и новым генератором террейна



Помимо этого добавились новые типы облаков, обновлена система по работе с водой, добавлен новый инструмент для дебага освещения.


Вышли LuxCoreRender 2.5 и BlendLuxCore 2.5



Команда LuxCoreRender выпустила новую версию физического рендерера с открытым исходным кодом, добавив поддержку аппаратно-ускоренной трассировки лучей на графических процессорах Nvidia RTX.


MetaHuman Creator запущен в раннем доступе



Теперь вы можете создавать уникальных мета-людишек и загружать их для непосредственного использования в Unreal Engine.


Команда также решила предоставить пользователям более 50 готовых MetaHumans для загрузки и использования в Unreal Engine проектах прямо из Quixel Bridge.


Unity 2021.2 до конца года получит нативную поддержку DLSS



В Unity 2019 LTS уже появился RTX, а теперь Nvidia сообщила, что Unity планирует до конца 2021 встроить NVIDIA DLSS (Deep Learning Super Sampling) в конвейер HDRP движка Unity 2021.2.


Об этом объявили на конференции GTC 2021, где разработчики LEGO Builder's Journey показали, что с включенным DLSS у игры возрастает FPS в несколько раз.


Вышел Atoms VFX 4.0 с новой системой Behaviour Tree



Новая версия системы анимации толпы для Maya и Houdini позволяет настраивать более сложное условное поведение для персонажей. А также в этой версии появился новый импортер для анимаций из библиотеки Adobe Mixamo.


Появилась новая версия лицензии Personal Learning Edition (PLE) с ограниченными возможностями, позволяющая использовать её бесплатно в некоммерческих проектах.


Начался открытый бета-тест 3DCoat 2021



Pilgway выпустили бесплатную открытую бета-версию 3DCoat 2021, инструмента для воксельного моделирования, ретопологии и 3D-рисования, радикально изменив пользовательский интерфейс приложения, движок кистей и рендеринг вьюпорта.


Новая версия Redshift для Mac



Maxon выпустила новую версию своего рендера для macOS с полноценной поддержкой M1.


Обновление позволяют пользователям хост-приложений, работающих на macOS, включая Blender, Cinema 4D, Houdini и Maya, использовать средство визуализации на текущих ноутбуках и рабочих станциях Mac.


Вышла альфа версия Blender 3.0



Это версия станет первым выпуском в рамках новой системы нумерации Blender. Все новые версии будут вида 3.x: 3.1, 3.2, 3.2 и т. д. Из новых фич в этой версии только новый браузер ассетов.


Из других новостей, была выпущена бета-версия Blender 2.93. Примечания к выпуску Blender 2.93 доступны здесь.


Вышел Phoenix 4.40 для 3ds Max и Maya



Chaos выпустили обновление своего инструмента для моделирования флюидов для 3ds Max и Maya, добавив поддержку столкновений между плавающими объектами с использованием физики Bullet, новую Massive Wave Force для поверхностей океана и поглощения цвета в дыму.


Виртуальная клавиатура под вебом в Godot



А также обновлённый HTTPClient с Fetch API под капотом.


Интересные статьи/видео


Запекание освещения с помощью GPU Lightmass в UE4



Уильям Фаучер рассказывает о том, как выполнять запекание освещения для внутренних сцен с помощью GPU lightmass в Unreal Engine 4.26.


Туториал основан на 2-часовой прямой трансляции по той же теме и включает в себя основные моменты.


Моделирование меха в Unity с помощью UModeler



В этот раз KKamjang поделился новым проектом The Combat Robot. Всё сделано с помощью плагинов UModeler и Surforge. Не думал, что с помощью плагинов можно полноценно моделировать что-то сложное в Юньке.


Разное


Воссоздание KITT из Knight Rider с помощью GANverse3D



Nvidia опубликовала демонстрацию, показывающую, как GANverse3D, её новый движок глубокого обучения, использовался для преобразование 2D изображения в 3D.


Эта технология, которая будет добавлена к Nvidia Omniverse, может создавать текстурированную 3D-модель любого типа реального объекта, на котором она была обучена, из одного 2D-изображения.




Буду рад любому фидбеку.

Подробнее..

Какие прелести нас ждут в Unreal Engine 5

27.05.2021 14:07:09 | Автор: admin

Epic Games провела 26 мая презентацию Unreal Engine 5, на которой показала новые возможности движка, включая системы по работе с ассетами, светом, анимациями и звуком. Старые системы и инструменты тоже получили множество улучшений.

Уже можно скачать альфу UE5 и семпл проект Valley of the Ancient.

Рекомендуемые системные требования для демки: 12-ядерный процессор с частотой 3,4 ГГц, видеокарта NVIDIA RTX 2080 или AMD Radeon 5700+ XT, оперативная память от 64 ГБ.

Можно уже начинать изучать доки. Подробно описаны все ключевые моменты.

Наконец-то обновили интерфейс редактора.

Nanite

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

Работает с новым внутренним форматом мешей, который сильно сжат и поддерживает потоковую передачу с автоматическим уровнем детализации. LODы самим больше делать не надо.

Контент для Nanite ничем не отличается от обычных статичных мешей, но Nanite может обрабатывать на порядки больше треугольников и инстансов, чем при рендеринге обычной геометрии. Рекомендуется использовать виртуальные текстуры.

Во время импорта меши разбиваются на иерархические кластеры групп треугольников. А уже во время рендеринга кластеры меняются местами на лету с разными уровнями детализации в зависимости от обзора камеры и без разрывов соединяются с соседними кластерами в одном объекте. В памяти находятся только видимые детали. Как следствие, чтобы это всё нормально стримилось, нужен SSD.

Для прокси-мешей можно настроить уровень детализации.

Прокси-меши используются для коллизий на уровне полигонов, трассировки лучей, запекания света и другого. При этом по умолчанию используются авто-генерируемый LOD0, что весьма странно.

По крайней мере, есть возможность выбрать кастомный прокси и настроить традиционные LODы.

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

Могут быть проблемы с occlusion culling. Если есть сложнная геометрия близко друг к другу около самой верхней поверхности, Nanite не сможет определить, какая из них находится сверху или снизу, что приведет к отрисовке обоих. Вблизи Nanite нормально разделяет слои, но при удалении разница в расстоянии между геометрией может быть меньше пикселя, что приводит к лишней отрисовке.

Если верить доке, то у Nanite меша и качество лучше, и размер меньше.

Антиалиасинг система Temporal super resolution позволяет при меньших затратах по ресурсам получить почти нативные 4K по цене 1080p.

Системы для работы со светом и атмосферой

Новая система для глобального освещения Lumen позволяет настроить реалистичный реалтайм свет. Если ещё совмещать с фотореалистичными ассетами из Мегасканс, то картинка просто на новый уровень выходит.

Lumen Global Illumination заменяет Global Illumination Screen Space (SSGI) и Distance Field Ambient Occlusion (DFAO). Lumen Reflections заменяет Screen Space Reflections в Unreal Engine 4.

Lumen генерирует Surface Cache для ближайших поверхностей сцены (где-то 200 метров от камеры). За этим расстоянием работает только screen traces.

Есть экспериментальное представление Distant Scene. Оно как раз было использовано в прошлой демке Unreal Engine 5 Lumen in the Land of Nanite для достижения непрямого освещения в каньоне. Покрывает диапазон от 200 метров до 1 километра от камеры. Работает путём рендеринга Reflective Shadowmap с низким разрешением от солнца с использованием Nanite и отслеживает это поле высот, чтобы уловить один отскок непрямого освещения солнца. В проде пока не рекомендуется использовать.

При трассировке сначала прогоняется Screen Tracing, т. к. он меньше жрёт ресурсов.

Потом уже Lumen Ray Tracing, состоящий из двух методов: программная трассировка, работающая на самом широком спектре железа и платформ, и аппаратная трассировка лучей, для работы которой требуются поддерживаемые видеокарты и системы.

По умолчанию работает Signed Distance Fields. Требует поддержка Shader Model 5 у железа. Много ограничений: работает только со статикой, World Position Offset не поддерживается, с прозрачностью проблемы.

Hardware Ray Tracing поддерживает больший спектр доступной геометрии. Проседает, если больше 100 000 инстансов. Динамическая деформация мешей может загнать фпс в 0.

Для работы Lumen нужна карта NVIDIA RTX-2000 серии и выше или AMD RX-6000 и выше.

Система для атмосферы позволяет легко всё настраивать, в том числе и объёмные облака. На уровне настроек куча модификаторов и параметров, которые позволяют твикнуть всё.

Работа с фотореалистичными ассетами

Quixel Bridge теперь полностью интегрирован в движок.

Можно просто перетаскивать ассеты мышкой из браузера ассетов и сразу приступать к работе.

Добавили новый тип ассетов Mega Assemblies. Это что-то типа сборки из существующих ассетов.

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

Работа с миром и уровнями

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

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

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

World Partition позволяет стримить из коробки. Ассеты вне установленного радиуса выгружаются и заменяются другими с меньшим разрешением.

Это всё на уровне конфигов вынесено. Можно настроить под свой проект.

Система Data layers позволят художникам работать вместе над одной сценой и переосмыслить её, создавая различные её вариации.

Эти слои можно переключать в рантайме, что позволяет загружать/выгружать тысячи ассетов на лету.

Как пример, переход в другой мир через портал. Правда, тут, всё же, есть переходный момент с подзагрузкой. Но, всё равно, довольно резво.

Анимация

Добавили для анимаций Full body IK solver. Может автоматически подстраиваться под тип пола/земли и высоту. Детерминированный надёжный и в 10 раз быстрее, чем раньше.

Появился новый фреймворк Game Feature Plugins, который позволяет разбить контент на модули. Может связать экшены, анимации, другие системы.

К примеру, в другом измерении у ГГ меняется абилка. Это всё задаётся на уровне конфига.

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

Animation Motion Warping позволяют адаптировать рут анимации под мир. Можно переиспользовать одни и те же эоементы.

Позволяет настроить нотификации для реакции на трансформы из блюпринтов.

Система реагирует на высоту препятствий, поворот персонажа и прочее.

Control Rig позволяет редактировать анимации прям в движке.

Full body IK даёт возможность настроить анимацию в ответ на какие-то внешние факторы: позиция противника и т. п. Всё на уровне конфига.

Например, настроить направление и дальность атаки в зависимости от положения ГГ.

С помощью новой системы Meta sounds можно теперь использовать всю мощь редактора материалов для создания сложного процедурного звука.

Хорошо забытое старое

Но это не только про новые фичи. Всё, что вам нравилось в UE4, тоже проапгрейдили. Niagara particles, visual effects, chaos physics, блюпринты получили множество улучшений.

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

Новые инструмента для отладки появились: Memory Insights для поиска утечек, Unreal Turnkey, который позволяет настроить проект под различные платформы, чтобы потом любой участник проекта одним нажатием мог поднять у себя нужное окружение.

И, как заверяют Эпики, миграция с UE4 должна пройти без проблем, т. к. полная обратная совместимость между версиями движка.

Уже можно скачать альфу UE5 и семпл проект Valley of the Ancient.

Саму презентацию можно посмотрел на канале Unreal Engine.

Подробнее..

Боевая система в 9 Monkeys of Shaolin. Как заново изобрести кунг-фу в видеоигре

26.01.2021 08:10:58 | Автор: admin

Всем привет. Публикую статью от именно своего коллеги Дмитрия Качкова - основателя Sobaka Studio.

Дмитрий КачковДмитрий Качков

Наша небольшая команда уже больше пяти лет занимается разработкой инди-игр в жанре beat em up, где весь игровой процесс жестко завязан на боевую систему. Наверное, многие замечали, что в самых успешных играх жанра beatem up игрока увлекает не столько сюжет или оформление окружения, а сам бой интересный, разнообразный, стремительный. Именно за приятную боевку критики хвалят обе наших игры. Redeemer: Enhanced Edition, где игровой персонаж мощный монах Василий зачастую должен раскидывать своих врагов подальше от себя кулаками (и не только). И 9 Monkeys of Shaolin, в которой персонаж сражается посохом против множества противников и в ходе игры должен улучшать свои боевые приемы с помощью системы прокачки навыков.

Ощущения насыщенности и сочности боя в обоих проектах достигается нами с помощью комбо-атак. Тому, из чего они состоят на движке Unreal Engine, и будет посвящена данная статья.

Конфигурация Комбо-атаки

Изначально компонент Комбо-атака - это проигрывание анимации удара. Но сразу после того как анимация начинает проигрываться, появляется огромное количество дополнительных условий, эвентов и триггеров, которые и придают (при должной настройке) весь необходимый сок. Этот компонент развивался последовательно, довольно долгое время, и вырос в большой компонент, работающий с огромным количеством дополнительных настроек. Сейчас, просто покрутив одно или другое свойство можно превратить обычное проигрывание анимации в сложносочиненную последовательность действий.

Прежде чем рассказать о внутренней функциональности, давайте посмотрим как настраивается каждая комбо-атака в uobject сабклассах.

 Пример настроек одной комбо-атаки Пример настроек одной комбо-атаки

Параметры, которыми можно настраивать комбо-атаку, состоят из нескольких категорий:

  1. Анимация. Сюда входит указания анимации как для героя, так и для его оружия.

  2. Дизайн. Сюда входит группа параметров по балансировке геймплея. Урон (damage), шанс нанесения критического удара (critical hit), урон от кровотечения (bleeding damage), возможность блокировки удара противником и т.д. Плюс здесь же находится список модификаторов, получаемых игроком по мере прокачки персонажа, которые изменяют параметры удара.

  3. Атака. Сюда входят параметры, которые сопровождают анимацию: радиус поражения атаки, название кости, отвечающей за трассировку ударов (hit trace), дистанция до противника - насколько игрок должен подъехать к врагу, прежде чем начинать атаку, и т.д. Их настройкой, что неудивительно, занимается в основном аниматор.

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

  5. Комбо. Здесь хранятся атаки, которые могут продолжить текущую в комбо, если игрок будет нажимать кнопки во время удара.

  6. Попадание. Здесь собраны параметры, относящиеся к тому, какой урон получит враг при успешно проведенной атаке, и как будет выглядеть нанесение удара. То есть здесь хранятся настройки эффектов, для которых используются частицы дым, огонь и т.п. (particle effect), звуки, мерцание врага, сотрясение камеры (camera shake), застывание (freeze), а также ссылка на блюпринт (blueprint), описывающий реакцию противника после попадания удара (анимацию, время недееспособности в нашем случае, время того, сколько враг лежит на земле, дистанция полета до стены и прочее).

Анимации атаки

Мы активно используем Animation Notifications (далее по тексту - нотификаторы) для настройки и балансировки геймплея, а также декоративных визуальных и звуковых изменений.

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

Настройка анимации атакиНастройка анимации атаки

Нотификатор Рывка (DASH)

При выполнении атаки персонаж игрока (или враг) сначала может рывком перемещаться к противнику. Этот рывок может быть унаследован атакой как часть прокачки персонажа, либо изначально являться особенностью приема. Вся соль в том, что во время создания анимации аниматор не может знать на какое расстояние герою придется переместиться, чтобы попасть по врагу. Поэтому мы устанавливаем анимационный нотификатор в то место, где анимацию следует поставить на паузу и дать игроку с помощью рывка сперва добраться до врага. Места установок этих объявлений рассчитаны так, чтобы герой не подвисал надолго. Но тем не менее, сколько-то повисеть иногда надо в угоду эффектности.

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

Нотификатор Определения области поражения (HIT ZONE)

Далее в каком-то моменте анимации атаки включается состояние AOEAttackState. Аббревиатура AOE расшифровывается как Area of Effect область действия. Это состояние активирует вычисление трассировки луча удара примерно в области оружия (иногда с сильно увеличенными размерами), чтобы определить, есть ли попадание по врагу.

Для регистрации попаданий по врагу используется не только AOEAttackState, но и специальный отдельный анимационный нотификатор StrikeHit. В момент активации нотификатора врагу, стоящему перед персонажем игрока в пределах определенного радиуса, принудительно наносится урон. Все настройки попадания (и трассировки в состоянии AOE и зоны попадания во время действия strikeHit) хранятся в блюпринте (blueprint) текущей комбо-атаки. Именно в нем дизайнеры могут детально настраивать попадания разных ударов.

Нотификатор Перехода в следующую атаку (SHORT TICK)

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

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

Нотификатор Отмены (CANCEL)

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

Нотификатор Заряжаемых атак

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

Другие нотификаторы

SFX/VFX нотификаторыSFX/VFX нотификаторы

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

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

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

Реакция на удар (Hit reaction)

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

В каждой комбо-атаке есть ссылка на блюпринт описывающий как будет реагировать тот, в кого эта комбо-атака прилетит:

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

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

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

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

Легкий, средний и тяжелый врагиЛегкий, средний и тяжелый враги

Эффектность и обратная связь

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

  1. Тряска камеры. Как на удары по врагам, так и на удары по игроку мы можем назначать настройки тряска камеры (конечно в основном это еле заметная тряска, но всё же). В момент особо мощных ударов по персонажу игрока эта тряска может быть сильнее, чтобы передать ощущение боли.

  1. Эффекты частиц. Мы придаем большое значение разного рода эффектам (в данном случае речь о эффектах частиц) и помимо эффектов самого удара (взмах палкой, порыв ветра, энергия Ци) мы настроили множество эффектов для попаданий по врагам. Особенно важным в нашем случае стоило назначать разные типы попадания когда враг просто получил урон, или когда он от удара умер. Зачастую мы сознательно преувеличиваем некоторые параметры, чтобы придать зрелищности. Вся наша работа нацелена на зрелищность в той или иной степени.

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

Новшества для 9 Monkeys of Shaolin

Чтобы подчеркнуть особенности дизайна 9 Monkeys of Shaolin, мы внесли несколько новшеств в систему.

  1. Анимация оружия. Аниматор делает анимации оружия синхронные с анимацией удара персонажа.

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

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

    Удар ногой в базовой комплектацииУдар ногой в базовой комплектации
Прокаченный удар ногойПрокаченный удар ногой

Заключение

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

Надеюсь наш опыт оказался вам полезен. И вы сможете проверить, как он реализован в наших играх, переосмыслить и применить в своих прекрасных проектах. Большое спасибо, что дочитали до конца ;)

Подробнее..

Unreal Engine 4. Новая сетевая модель PushModel

28.01.2021 00:21:03 | Автор: admin

В стандартной сетевой архитектуре Unreal Engine, сервер проверяет, изменение значения у реплицированной переменной Actor класса, и в случае отличия, значение синхронизируется между сервером и клиентом. Когда объем данных для синхронизации не больших размеров, особых проблем с производительностью нет.

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

UE уже предоставляет такие функции как: NetUpdateFrequency, NetCullDistanceSquared и т.д. Основная задача которых состоит в том, что бы устранить из общей картины репликации, как можно больше актеров не нуждающихся в постоянно синхронизации данных.

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

#define MARK_PROPERTY_DIRTY(Object, Property) #define MARK_PROPERTY_DIRTY_STATIC_ARRAY_INDEX(Object, RepIndex, ArrayIndex) #define MARK_PROPERTY_DIRTY_STATIC_ARRAY(Object, RepIndex, ArrayIndex) #define MARK_PROPERTY_DIRTY_FROM_NAME(ClassName, PropertyName, Object) #define MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY_INDEX(ClassName, PropertyName, ArrayIndex, Object) #define MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY(ClassName, PropertyName, ArrayIndex, Object) 

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

Как настроить PushModel. В первую очередь в Build.cs, необходимо добавить, что б исключить проблемы компиляции

PublicDependencyModuleNames.AddRange(new string[]  {"NetCore"});

Во-вторых отметить необходимые перменные UPROPERTY(Replicated) или (ReplicatedUsing)

В третьих, в функции GetLifetimeReplicatedProps, нам необходимо использовать DOREPLIFETIME_WITH_PARAMS или DOREPLIFETIME_WITH_PARAMS_FAST, вместо DOREPLIFETIME или DOREPLIFETIME_CONDITION, что бы отметить переменную для репликации. Пример:

void ASomeActor::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const{  Super::GetLifetimeReplicatedProps(OutLifetimeProps);FDoRepLifetimeParams SharedParams;SharedParams.bIsPushBased = true;SharedParams.Condition = COND_OwnerOnly;DOREPLIFETIME_WITH_PARAMS_FAST(ASomeActor, SomeVar, SharedParams);}

FDoRepLifetimeParams имеет в себе 3 прекрасный параметра:

struct ENGINE_API FDoRepLifetimeParams{/** Replication Condition. The property will only be replicated to connections where this condition is met. */ELifetimeCondition Condition = COND_None;/**  * RepNotify Condition. The property will only trigger a RepNotify if this condition is met, and has been  * properly set up to handle RepNotifies.  */ELifetimeRepNotifyCondition RepNotifyCondition = REPNOTIFY_OnChanged;/** Whether or not this property uses Push Model. See PushModel.h */bool bIsPushBased = false;};

В данной структуре bIsPushBased указывает, следует ли включать данную переменную в PushModel. В одном и том же Актере, несколько разных переменных, могут использовать данный функционал. Для того что бы оповестить сервер о необходимости репликации, необходимо вызвать макрос:

MARK_PROPERTY_DIRTY_FROM_NAME(ASomeActor, SomeVar, this);SomeVar = SomeValue;

Тем самым, сервер синхронизирует значение переменной.

Заключение

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

Подробные примеры использования можно посмотреть в классе APlayerState в движке.

Всем спасибо за внимание и хорошего времяпровождения.

Подробнее..

DIGITAL SHOW М.Видео-Эльдорадо не Online, а Mixed Reality

13.11.2020 02:06:44 | Автор: admin


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

Бизнес переживает последствия нападения COVID-пришельцев на планету успешнее, чем можно было предполагать. Zoom, Skype, ВКС, прочно вошли в нашу жизнь. Но полностью заменить живые контакты видеоконференции неспособны. Если в разговоре один на один их ущербность не так заметна, то уже представительные совещания получаются не столь эффективными. А о масштабных конференциях и говорить нечего. Ток-шоу с отдельными говорящими головами быстро становятся скучным.

В последние годы мы провели несколько масштабных мероприятий и были весьма довольны их результатами. Выставка М.Видео Electronics Show стала большим событием для всего российского ритейла. Специализированная конференция DIGITAL SHOW была не столь представительной, но сумела объединить множество наших партнеров, помогла продавцам, которые работают в сотнях магазинов М.Видео и Эльдорадо познакомиться с новыми продуктами. Отказаться от этих масштабных мероприятий из-за эпидемии нам было трудно. А превращать ежегодное шоу в обычную видеоконференцию обидно.

И мы решили, что технологический ритейлер просто обязан пользоваться плодами прогресса. Как? Читайте под катом.

Что мы планировали организовать


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

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

Дальше идея стала обрастать деталями. Во-первых, нам предстояло собрать на одной виртуальной площадке два десятка тысяч человек (по факту даже больше), которые были бы распределены по всей стране, от Калининграда до Владивостока, в 11 часовых поясах.

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

В-третьих, на территории экспозиции нам требовалось дать возможность гостям пообщаться с экспертами тет-а-тет. А еще во время конференции нам нужно было обучить 1200 лучших продавцов и обеспечить им возможность поговорить с представителями вендоров. И наконец, шоу должно было транслироваться во всех магазинах М.Видео и Эльдорадо.


Не Online, а Mixed Reality


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

Весной 2020 года Трэвис Скотт дал концерт для 12 миллионов игроков прямо в многопользовательской игре Fortnite. Многие компании на удаленке стали отказываться от Zoom-совещаний (скууучно!) и встречаться прямо в играх. Например в Red Dead Redemption 2.

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

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



Как работает платформа


По сути, в последние годы специалисты Connect занимались переписыванием Unreal Engine (это, как известно, среда с открытым исходным кодом), чтобы обеспечить взаимодействие с движком в веб-среде. Эта работа была сложной, потребовала дописывания большого объема кода, но в результате появилась платформа, которая не имеет аналогов мире. Честно говоря, даже подсмотреть и украсть идею было особо не у кого.



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


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

Каким получился виртуальный Экспоцентр


На платформе, которую вместе с нашими специалистами сделали партнеры из Connect, мы развернули огромный виртуальный Экспоцентр. Главным его помещением стало публичное пространство (мы назвали его Площадь), обучающий центр (Академия), выставка с 25 стендами вендоров и особая зона, где могли общаться между собой топ-менеджеры компании, партнеры и журналисты.



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



К слову, для 1200 лучших продавцов было приготовлено не только обучение, но и специальная программа. Для них (а еще для менеджеров, партнеров и представителей СМИ) прошла виртуальная выставка, на которой можно было перемещаться между стендами, участвовать в разных активностях, конкурсах и квизах.

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



Самое интересное контент


Все это внешняя обстановка. Но мы то знаем, что главное на любом мероприятии контент. И мы хотели поразить участников DIGITAL SHOW 2020 не только виртуальным Экспоцентром. Для этого мы снова воспользовались геймерским опытом. Во время разработки контента мы применили практики управления вниманием, которые обычно используются во многих играх. А для этого в виртуальном выставочном пространстве было организовано шоу (тоже, естественно, виртуальное), с помощью которого мы хотели добиться внимания публики.

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



Все только начинается


Собственно говоря, мы начали работать с виртуальной платформой еще на этапе подготовки DIGITAL SHOW 2020. В ней мы сразу же стали обсуждать все рабочие вопросы. Например, после совещаний мы часто бродили по стендам и ловили всевозможные баги (да, иногда на площадках забываешь персонажей). Сегодня понятно, что работать в виртуальном пространстве куда интереснее и продуктивнее, чем в окошках Zoom.



Таким был наш опыт. А можете поделиться в комментариях необычными форматами участия во всевозможных мероприятиях эпохи COVID-19? Впереди Новый год, вдруг всем нам суждено встретиться у виртуальной елки с не менее виртуальным Дедом Морозом и Снегурочкой!
Подробнее..

Игровые локации, или как сюжет раскрывается через окружение в современных играх

20.03.2021 00:14:27 | Автор: admin

Ребята, всем привет!!!

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

Интересно? Тогда заваривай чаек, бери на руки своего котана и погнали!!!

То, что мы видим, когда погружаемся в игровой мир новой стрелялки, "бродилки", "симммулятора", стратегии, "экшена" и или, во что вы там любите еще играть после работы, учебы, на работе на учебе ;)) и что притягивает наше первое внимание, так это окружение и тот мир куда мы попадаем - это и есть игровая локация.

Для начала оценим масштаб происходящий событий

Локации могут динамически появляться, как маленькие кусочки огромного мира постепенно открывая всю карту, так например сделано во множестве онлайн игр с открытым миром. Среди наиболее известных это различные вариации MMORPG, так как ArcheAge, Lost Ark, SkyForge, CrossOut, Dragon Knight 2, Rise of Angels, World Of Tanks.

Локации могут быть самыми разнообразными, но все они должны передавать дух игры и помогать "разворачивать" сюжетную линию игры (Фото: https://store.my.games, ArchAge)

Как бы ним была устроена локация, она должна максимально "погружать" пользователя в игровой мир и сделать "пребывание" в этом мире максимально комфортным, интересным и захватывающим (Фото: https://la.mail.ru, Lost Ark).

Окружение, помимо чисто эстетической цели, служит еще и определенным вектором при "прохождении" игры, оно направляет игрока по сюжетной линии, иногда помогая ему, а иногда и препятствуя, дабы усилить игровой момент и чувства преодоления препятствий. Этот эффект позволяет игроку понять, что будут как сложности так легкие участки, ну а по завершению его ждет желанная награда за успешно выполненные задания. (Фото: https://mmo13.ru, Justice).

Так же есть локации с фиксированным размером, это характерно для игр имеющих четкую сюжетную линию, ограниченное число уровней, и способов взаимодействия игрока с этим миром. Сюда можно отнести практически все игры, которые предназначены либо для индивидуального прохождения, либо для парного. Среди наиболее популярных можно назвать такие: CyberPunk 2077, Vangers: One of the Road, Warhammer: Dark Omen, Heroes 3 и т.д.

Локации всегда представляются чем-то масштабным, здесь задействована огромная работа художников по окружению, специалистов по моделированию, в основном hard surface, программистов, текстурщиков, специалистов по рендеру, свету, и многих других. Вся их работа направленно на то, чтобы на вашей "машине" игрушка взлетала на ура и не тормозила, и конечно же приятно радовала глаз (Фото: https://www.cyberpunk.net, CyberPunk).

Что же теперь перейдем к более детальной классификации, и рассмотрим какое-именно окружение бывает и какие цели должно преследовать. И так, локации условно делят на следующие виды:

Пустые и заселенные

На первом месте у нас значатся различные заброшенные здания, техника, заводы и целые города или жилые помещения и обитаемые местности, где присутствуют игровые персонажи или простые жители, а также представители животного и растительного мира. Среди наиболее известных игры в этом жанре "стоят" такие скалы игромира как: Stalker: Shadow Of Chernobyl, Silent Hill, Mist Survival, Necromunda

Локации подобного рода присутствуют в играх типа хоррора, ужастиков, артхаус, шутеры, выживания и многих других. Главная цель таких локаций создать ощущение покинутости пространства, ненужности, отрешенности, создать следы былой "кипучей" деятельности человека и предать окружению ореол мистики (Фото: https://technomode.ru)

Развалившиеся постройки, беспорядок, общий хаос и постоянное разрушение и гниение вот, что подчеркивает данные локации (Фото: https://www.kinonews.ru, Necromunda)

Опасные и безобидные

Если цель игрока выброс адреналина, можно выбрать локацию, где каждый персонаж желает вашей смерти по любым причинам и, напротив, может стать вашим спутником или напарником. Сюда также относятся различные "выживалки" и хорроры, типа Dead by Daylight, Days Gone, Rust.

Общая черта таких локаций, заключается в том, что пространство, не приветствует игрока в этом мире, оно ему враждебно, оно давит на него своей пустотой и мрачностью, стягиваясь вокруг него в плотный клубок безысходности, пустоты и непроглядной тьмы (Фото: https://news.xbox.com, Dead By DayLight)

Пустота, в таких локациях вообще играет важную роль, она должна создавать ощущение "холода" у игрока и олицетворять постоянное неведомое присутствие кого-то кроме самого игрока, но максимально неуловимого. За каждым деревом, кустом, коробкой, зданием за игроком кто-то постоянно наблюдает...

Природные локации

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

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

Пространство этого окружения наполнено воздухом, движением и жизнью в целом. Среди игр, где эти черты наиболее удалось выразить это: Ведьмак 3 "Дикая охота", Assassins Creed, Ori and the Blind Forest, The Vanishing of Ethan Carter, Uncharted 4: A Thiefs End.

Максимально природные черты и фотореализм, горы, леса поля, буйство жизни, буйство красок все это подчеркивает природные локации (Фото: https://pluggedin.ru, Ведьмак 3).

Окружение может быть реально-существующим или выдуманным, но должно точно передавать ощущение действительности мира, в котором находится игрок. (Фото: https://pluggedin.ru, Assassins Creed).

Общий подход характерен не только для 3D игр, но и для 2D (Фото: https://pluggedin.ru, Ori and the Blind Forest).

Теперь давайте плавно перейдем к описанию различных вариаций игровых миров?

Мир апокалипсиса

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

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

Вариаций апокалипсиса тоже может быть, исходя из сюжетной линии, миллион с маленькой тележкой: ядерный, зомби, биологический, инопланетный, техногенный, климатический, но особенные эмоции вызывает отечественный так сказать с отблеском местного колорита, вроде Мetro 2033.

Общий настрой таких локаций борьба за жизнь, существование в рамках одной персоны, небольшой коммуны или целого города. Среди классиков жанра можно выделить: Dead Rising 3, DayZ, State of Decay 2, Dying Light, Dead Frontier 2, Miscreated.

Мир в таких играх не всегда представляется чем-то враждебным, это всегда пост-результат деятельности человека, и когда человек уходит, природа начинает "забирать" себе территорию (Фото: https://www.playground.ru, DayZ).

Либо это совсем "невосстановимая" природа, уничтоженная под корень и не в состоянии прийти в нормальное русло в следствии множества факторов: ядерная зима, отравление токсичными отходами, радиоактивное загрязнение или изменение климата в целом в худшую сторону (Фото: https://overclockers.ru/, Metro 2033).

Античность и первобытность

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

Правильно, "нарубил мамонтов", принес в пещеру, женщину в охапку и в соседнее племя на дискотеку. Или быть мэром и править городами, создавать цивилизации и настраивать международные связи. Все это вы можете ощутить если поставите на свою "тачку" такие игрушки: Ceasar 4, Cleopatra, Far Cry Primal, Эсцилон.

Строительство городов, построение экономики, решение внешполитических и внутри-экономических вопросов все, здесь зависит от игрока, забота о городе, гражданах вот что здесь главное. Хочешь почувствовать себя мером или церем тогда тебе сюда. (Фото: https://store.steampowered.com, Ceasar 4).

Первобытные времена, борьба с природой и соплеменниками, мелкие войны, сражения с дикими животными, все это и многое другое предлагается для игрока. Цивилизация еще только зарождается, и ты ее начало. Дерзай!!! (Фото: https://mygamehunter.ru)

Мир киберпанка

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

Здесь приветствуются различные улучшения и модификации тела и отдельных его частей, много неона всех мастей и расцветок, бегущие надписи, строки, голограммы, необычные и футуристичные наряды, различные отсылки на азиатские страны: Япония, Сингапур, Китай, Малазия, которые ужа давно живут в 23 веке. Самым ярким представителем, на сегодняшний день, конечно же является CyberPunk 2077, за ним следует Deus Ex: Mankind Divided, Remember Me, Hard Reset, Observer, Watch Dogs 2.

Неоновые лампы, симбиоз человека и машины, бурное развитие технологий, ты уже в будущем дружище! (Фото: https://cubiq.ru, Hard Reset)

Открытые рынки азиатского типа, мелкая торговля, множество магазинчиков, пестрящих разноцветной рекламой, яркие, броские цвета, мегакорпорации, модификации всех цветов и расцветок. Добро пожаловать в мир киберпанка!!! (Фото: https://cubiq.ru, Deus Ex: Mankind Divided)

Мир стимпанка

Ну что, уважаемый(-ая) если ты фанат(-ка) паровых двигателей, корсетов, шикарных нарядов и винтажного обмундирования тебе открыта дорога в мир стимпанка! Он отражает мир прошлого или настоящего с более совершенными технологиями, то есть как бы могло быть, если бы у нас не было ядерной энергии, полезных ископаемых и прочих "прелестей" прогресса. Как наш мир, который мог бы быть лучше, а может и нет.

Здесь все не так как у нас: необычная одежда, мебель, средства передвижения (наземные, воздушные, подводные). Здесь все подчиненно внутреннему состоянию прекрасного и даже немного эстетства. Вспомнить только: дамы в оригинальных шляпках, трости, старые винтовки, чертежи, механизмы вот прямо от слово механика, а не электроника и много чего еще, что находится на стыке будущего и прошлого, минуя настоящее. Благодаря этой идеи появилось множество чудесных игр: Warpstorm, Black Gold Online, Bioshock.

Шестеренки, старые заводские фонари, мебель, многочисленные трубы, вентиля, схемы и чертежи, и много других элементов должны отражать дух времени века, эдак, 17-18, но с переходом в будущее, как будто развитие технологий пошло по другому руслу. (Фото: https://grandgames.net, Warpstorm)

Корабли морские, переделанные под космические корабли, флаги, трюмы, мачты, различные старые машины, портовая атрибутика, старые кабаки и таверны - один из ярких примеров в стиле стимпанк. (Фото: Black Gold Online)

Мир фэнтези

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

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

Здесь, прям есть где разгуляться: Dragon Age: Origins, Gothic, Titan Quest, Middle-Earth: Shadow of Mordor, Neverwinter Nights, The Elder Scroll 5: Skyrim, World of Warcraft: Wrath of the Lich King и т.д.

Проселочные дороги, неровные каналы и мосты, покосившиеся заборы, горные селения все для того чтобы передать дух средневековья с частицей магии, которая пронизывает все. (Фото: https://onyxgame.com, Brothers: A Tale of Two Sons)

Замки джинов, магов, священные и тайные писания хранящиеся высоко в горах, заснеженные пики и изобилие запретных царств (восточных, азиатских), вот такое фэнтези и вызывает восторг у игрока (Фото: https://onyxgame.com, World of Warcraft)

Наш мир

Наконец, наш мир, его прототипом стали локации нашей планеты, пусть иногда эти места и не существуют на самом деле, но все же они максимально были приближены к реальности и создают ощущение у игрока что это происходит здесь и сейчас. Здесь можно выделить например GTA5, Jusсt Cause 3, Far Cry 3, Sleeping Dogs.

Все максимально реалистично, это наш мир, без малейшей тени на выдумку (Фото: https://gamingda.wordpress.com, Slepping Dogs)

Тоннели, мосты, метро, трафик, все взято из нашего мира, никаких сверх-способностей только умение взаимодействовать с этим миром (Фото: Watch Dogs)

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

Окружающая атмосфера может давить, вызывать страх и интерес из-за звукового сопровождения, тона красок, графики и погодных условий. Или, наоборот, вызывать восхищение от реалистичности мира вокруг. Даже если сюжет захватывает с первых минут, он происходит с персонажами, а игроку важны детали и атмосфера происходящего.

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

Mail: anomalyimage@yandex.ru

Дзен

Телеграм

Подробнее..

Из песочницы Используем macOS для удалённой сборки Unreal Engine билдов из-под Windows

31.07.2020 14:18:55 | Автор: admin
Любой пользователь ОС Windows, вставший на увлекательный путь кросс-платформенной разработки, однажды сталкивается с проблемой невозможности сборки яблочных билдов из рабочего окружения: для сборки и подписания приложения требуется девайс с macOS.

У нас есть два варианта:

  1. Неоптимальный: каждый раз бегать к маку, синхронизировать проект и запускать сборку.
  2. Оптимальный: настроить удалённую сборку на вашем / арендованном / офисном маке.

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

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



Шаг 1: Настроить RSync на macOS девайсе


На этом этапе нам поможет один из вышеупомянутых туториалов с устаревшей информацией, а именно глава RSync.

Далее размещу перевод этой главы:

Rsync это утилита, которую Unreal Engine использует для передачи и синхронизации файлов между компьютерами.

Перед тем, как начинать настраивать UE4 проект, нам следует настроить RSync на нашем mac девайсе.

Нам нужно создать rsync.plist файл в /Library/LaunchDaemons
Убедитесь, что у файла установлены разрешения rw-rr и вставьте в него следующее:


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict>        <key>Disabled</key>        <false/>        <key>Label</key>        <string>rsync</string>        <key>Program</key>        <string>/usr/bin/rsync</string>        <key>ProgramArguments</key>        <array>                <string>/usr/bin/rsync</string>                <string>--daemon</string>        </array>        <key>inetdCompatibility</key>        <dict>                <key>Wait</key>                <false/>        </dict>        <key>Sockets</key>        <dict>            <key>Listeners</key>            <dict>                <key>SockServiceName</key>                <string>rsync</string>                <key>SockType</key>                <string>stream</string>            </dict>        </dict></dict></plist>

Также создайте файл rsyncd.conf в /etc/

Убедитесь, что файл имеет разрешения rw-rr и вставьте в него следующее:


[root]path = /hosts allow = 192.168.1.0/24uid = rootgid = wheelread only = falsecomment = Root volume

Hosts это разделённый запятыми список IP адресов машин, которые могут использовать этот mac в качестве машины для сборки. В данном случае мы указываем все машины из локальной сети, указав 192.168.1.x

Для проверки работоспособности, запустите:

sudo launchctl load /Library/LaunchDaemons/rsync.plist

И, наконец, перезагрузите ваш мак.

От себя добавлю, что иногда Unreal Engine может кидать ошибки command not found в процессе сборки. Если вы столкнётесь с этой ошибкой, попробуйте поменять Login shell с zsh на sh. Чтобы сделать это, откройте Users & Groups (пользователи и группы) в настройках системы, нажмите правой кнопкой мыши на вашего пользователя, выберите Advanced Options (дополнительный параметры) и поменяйте Login shell (оболочка входа) на /bin/sh.

Также рекомендую использовать одинаковую версию RSync (по крайней мере, одинаковую мажорную версию) на обоих девайсах.

На вашей Windows машине откройте папку с движком, перейдите в папку DeltaCopy (UE_4.23\Engine\Extras\ThirdPartyNotUE\DeltaCopy\Binaries\) и вызовите по этому пути консольную команду:

./rsync --version

Шаг 2: настройка Windows


  1. Откройте ваш UE4 проект, Project settings, iOS, вкладку Remote build options
  2. Проверьте IP адрес мака и укажите его в поле Remote Server Name. Если вы используете перенаправление портов, вы также можете указать необходимый для установления SSH соединения порт в конце IP адреса. По умолчанию это 22
  3. В поле RSync User Name укажите имя пользователя macOS
  4. Нажмите Generate SSH и следуете инструкциям
  5. Установите iTunes. Тут у вас есть два варианта (я выбрал второй):
    a. Установите iTunes через магазин Windows. Скорее всего, iTunes не будет работать и вам придётся поэкспериментировать с разрешениями
    b. Скачайте установочный файл iTunes в обход магазина Windows. Откройте официальный сайт, пролистайте вниз до Looking for other versions?, выберите Windows и скачайте установочный файл
  6. Следуйте инструкциям из официальной документации, чтобы сгенерировать provision profile и сертификат
  7. Откройте Project settings, iOS, вкладка Mobile provision и импортируйте сгенерированные provision profile и сертификат
  8. Убедитесь, что Bundle ID совпадает с ID, который вы указали при генерации сертификата (шаг 6)
  9. Если вы сгенерировали сертификат для разработки, а не для распространения (distribution), убедитесь, что значение переменной For Distribution (Project settings, Packaging) установлено на False (в противном случае, при сборке вы получите ошибку no certificate found)
  10. Убедитесь, что в пути проекта нет странных знаков (сбоки, пробелы)
  11. Запустите сборку, выбрав File, Package Project, iOS

Шаг 3: Протестируем сборку


  1. Когда сборка проекта будет окончена, вы получите .IPA файл по пути, который вы указали перед началом сборки
  2. Подключите iOS девайс к вашему PC, используя кабель
  3. Откройте iTunes
  4. Перетащите .IPA файл на ваш девайс (вкладка devices)

Вот и всё. Теперь вы сможете собирать iOS билды из вашего Windows окружения. Если же у вас до сих пор возникают трудности, пишите постараюсь помочь.
Подробнее..
Категории: Ios , Macos , Windows , Unreal engine , Ue4

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru