Давно хотелось составить список навыков и инструментов, которыми, по моему мнению, должны входить в «джентельменский набор» любого программиста под 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, но предложил вопросы по ключевым темам, которые являются, на мой взгляд, основными при работе с движком.
Для джуниора нормально не знать многого в движке, но иметь светлую голову и разбираться в паре частностей. Хотя бы «средний» программист просто обязан знать ответы (или хотя бы иметь свое собственное аргументированное мнение) на вопросы из блока про архитектуру. Особенно по темам, которые описаны на первой же странице документации по GameFramework.
Если у сообщества будет интерес, подобный вопросник можно составить и по анимации, отладке, шейдерам и материалам, освещению, упаковке проекта, созданию AI, работе с Pawn'ами и другими. Пишите :) Я всегда только за активное обсуждение.
Автор: ufna