Давно хотелось составить список навыков и инструментов, которыми, по моему мнению, должны входить в «джентельменский набор» любого программиста под Unreal Engine 4. Буквально на днях, в чатике по UE4 я встретил такое:

> blueprints, animation dev, tech art, ai, multiplayer, editor extensions. первое, что пришло в голову

> Что приходит на ум: blueprints, animations, AI, material editor, widgets, slate, editor extensions, ue4 plugins, physics, lighting, rendering, c++
+ Сколько времени работал(а) с движком и страна, всё :)

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

Не используйте общих слов


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

Я пройдусь по основным категориям, задав вопросы, на которые стоит знать ответ, чтобы сказать: «Я в этом разбираюсь».

Основы архитектуры движка


  • Какие отличия между классами UObject и AActor? В чём принципиальное отличие? Можно ли заставить UObject выполнять те же самые функции? Почему AGameState и APlayerState являются экторами? Аналогичный вопрос про AGameMode и AHUD.
  • Чем AGameMode отличается от UGameInstance? Для чего они оба используются? Зачем нужен APlayerController, и почему он является эктором?
  • Для чего используется UPROPERTY? Можно ли заменить его SharedRef'ами? Как решить Circular Dependecy у экторов (родитель имеет указатель на ребёнка, ребёнок — на родителя)? Когда будет удалён UObject? Как защитить сущность от удаления Garbage Collector'ом? Как удалить Actor'а?
  • Что такое CDO? Как можно прервать цепочку Reference'ов классов друг на друга, и зачем?
  • Каков порядок инициализации основных сущностей движка (хотя бы на уровне контроллер/павны/стейты)? Каков порядок спавна AActor'а?
  • Компонент в компоненте — хорошо или плохо?
  • Что такое WorldContext? Можно ли его взять в UObject'е, и если да, то откуда?
  • В чем принципиальное отличие Slate от UMG?

Blueprints


  • Чем отличаются макросы от функций?
  • Использование чего именно приводит к образованию Referenc'ов между классами? Ассетами? Как этого избежать?
  • Что такое нативизация блюпринтов и какая от неё польза? Какие недостатки у включенной нативизации?

Сеть


  • Где хранить геймплейные данные пользователя (например, инвентарь или количество очков) во время игровой сессии? Является ли APlayerController подходящим местом?
  • Как PlayerState'ы реплицируются на клиенты? Каков жизненный цикл PlayerController'а и PlayerState'ов при переподключении игрока?
  • Как разграничить репликацию данных по ролям? Что такое сетевые роли? Кем и по каким правилам они назначаются?
  • На каких классах можно вызывать RPC и почему? Можно ли расширить эту возможность на другой класс/сущность? Какие накладные расходы существуют на вызов RPC?
  • Как реплицируются компоненты эктора? Как понять, что эктор реплицировался «целиком»? Что произойдет, если требуется отреплицировать, допустим, 3 Мб данных в экторе: как будет вести себя этот эктор? игра в целом?
  • Как реплицируются массивы? И как реплицируются вложенные свойства (реплицируемое поле является структурой)?
  • Какие ограничения сети существуют? (Цифры!) Как профилировать нагрузку на сеть? Какие методы оптимизации сети применяются? Для чего нужен ForceNetUpdate?

Физика и базовые алгоритмы


  • Как работает демпфирование? Что такое сабстеппинг? Для чего он используется? Как работает синхронизация физики по сети?
  • Что такое кватернион и какие проблемы решает их применение?
  • Что такое каналы объектов и трассировки? Можно ли настроить различное поведение в рамках одного physics asset? Если нет, то почему, и как это обойти?
  • Насколько дорогой операцией является трассировка? От чего это зависит?

Потоки


  • Какие основные потоки есть в UE4? Какие задачи выполняются параллельно, а какие нет? Как устроены тик-группы?
  • Какие действия можно выполнять в собственных параллельных потоках? (Или какие действия точно нельзя выполнять?) Как синхронизировать результаты с основным тредом?

Кода


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

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

Если у сообщества будет интерес, подобный вопросник можно составить и по анимации, отладке, шейдерам и материалам, освещению, упаковке проекта, созданию AI, работе с Pawn'ами и другими. Пишите :) Я всегда только за активное обсуждение.

Комментарии (4)


  1. The_Nex
    23.10.2018 18:41

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


  1. lionclop
    24.10.2018 10:17

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

    пысы. Есть доступный ресурс с хоть сколько детальными пайплайнами/процессами по разработке или напрямую разработке в UE?


    1. ufna Автор
      25.10.2018 10:02

      пысы. Есть доступный ресурс с хоть сколько детальными пайплайнами/процессами по разработке или напрямую разработке в UE?


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


  1. Dimega
    24.10.2018 10:27

    Во! Данная серия статей будет лично для меня как раз к стати. Я начал глубинно разбираться с Unreal и наткнулся на ряд вопросов на которые мне пока не удается получить четкого ответа а именно: как правильно использовать основные модули игрового движка такие как GameMod, GameState, PlayerState, LevelBlueprint, GmaeInstance и т.д. а ведь это основные базисы на которых держится весь геймплей. Да конечно я прочитал официальную документацию по этим механикам, но так нашел развернутого примера.

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

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

    GameMod
    Большинство игр не ограничиваются одной картой (Level), но хотелось бы использовать одну механику для всех карт например Deadmatch. Для этих целей и придуман GameMod, в нем можно определить правила игры такие как спаун/респаун игроков/ботов, определение команд, хранение очков команды и многое другое. Один раз написав эту логику для GameMod ее можно подключить к любой карте. Также можно добавить и другие режимы такие как Захват флагов, Командный бой, прыжки на перегонки и т.д. Карты остаются, но для них можно менять режим игры

    LevelBlueprint
    Данный блюпринт используется только на конкретной карте и не распространяется на другие. Например: на карте с названием «Берег» есть некоторый Маяк, который через 15 минут игры взрывается и заливает всю карту зеленым ядовитым туманом, который наносит дамаг всем игрокам. Абсурдно, но для примера подойдет. Вот именно в LevelBlueprint и надо писать логику маяка. Но если у вас игра состоит только из одной карты и одного режима и в будущем не планируется ничего не добавлять, то всю логику игры можно запихать в LevelBlueprint и не создовать кастомный GameMod.

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

    С остальными классами такими как GameSettings, PlayerSettings, и т.д. я не особо разбирался, но название классов говорят сами за себя, если надо хранить настройки игры, то это GameSettings, если надо хранить настройки персонажа, то это PlayerSettings.

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

    Спасибо!