Введние в с++ разработку на Unreal Engine 4. Ключевые моменты и сравнение с Unity 3D

В этой статье я кратко расскажу об основных моментах разработки на игровом движке Unreal Engine 4 в сравнении с движком Unity. Это поможет вам быстро разобраться как работает Unreal Engine 4, особенно если до этого вы разрабатывали игры на Unity. Статья основана на переводе инструкции по миграции для разработчиков Unity (UE4 guide for Unity developers) и содержит дополнительные материалы, не освещенные в оригинальному документе.

Автор: Сергей Тарабан

:ad:

Ключевые концепции

Игровая логика

Unity

Игровая логика пишется в среде Mono. Все манипуляции с объектами осуществляется через скрипты. Объект может иметь сколько угодно скриптов или не иметь вообще. Каждый скрипт является равноправным.

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

Unreal Engine 4

Игровая логика пишется на С++ и/или визуальном редакторе чертежей (Blueprint Editor). Вся манипуляции с объектами осуществляется через C++ классы и/или чертежи. Объект может иметь только один класс и один чертеж для этого класса.

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

Архитектура игры изначально мультиплетная.

Начало игры

Unity

По умолчанию загружается уровень с индексом 0, который считается уровнем по умолчанию. После этого вызываются функция Awake произвольного скрипта, игровой объект которого был заспаунен первый или для которого выставлен самый высокий приоритет в настройках сцены (Script Execution Order).

Unreal Engine 4

Загружается уровень, выставленный в настройках проекта как уровень по умолчанию (Edit > Project Settings > Maps & Modes ). Для каждого уровня определяется класс настроек WorldSettings.h. Используя этот класс создается класс UWorld. Он в свою очередь создает экземпляр класса GameMode в сцене, который задается в настройках уровня. Этот объект далее создает PlayerController и другие вспомогательные классы сцены.

Входной точкой является конструктор класса, унаследованного от класса GameMode.

Сцена

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

 Unity

Y ось смотрит вверх.

  • X - left, right
  • Y - up, down
  • Z - forwards, backwards
Формат файла: *.scene

Работа со объектами сцены ведется через статические методы класса GameObject ( спаун, удаление, поиск объектов в сцене)

Загрузка уровня: Application.LoadLevel(string name);

Unreal Engine4

Z ось смотрит вверх.

  • X - forwards, backwards
  • Y - left, right
  • Z - up, down
Формат файла: *.umap

Работа с объектами сцены ведется через методы класса UWorld ( спаун, удаление, поиск объектов в сцене). UWorld  можно получить методом GetWorld() класса PlayerController.

Загрузка уровня: GetWorld()->ServerTravel(string URL);

URL - это путь к уровню. Может включать дополнительные параметры, которые можно прочитать в коде.

/Game/Maps/<map_name>?<key_1>=<value_1>&<key_2>=<value_2>

Получить опции можно в классе GameMode так: GetIntOption(OptionsString, <key_1>, <default_value>);

Объекты сцены

Unity

Базовый объект сцены - GameObject.

GameObject это контейнер для комопнентов. По умолчанию имеет не удаляемый компонент Transform. Компоненты используются для расширения функциональности GameObject. GameObject не может иметь несколько  одинаковых компонентов (скипты это разные компоненты). Компоненты не поддерживают иерархию.

Можно объединять несколько GameObject в группу с общим родителем (отношение родитель - потомок. ).

Unreal Engine 4

Базовый объект сцены - Actor.

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

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

Пример создания компонентов:

TSubobjectPtr SceneComponent = PCIP.CreateDefaultSubobject(this, TEXT("SceneComp"));
RootComponent = SceneComponent;

Обработка событий от устройств ввода

Unity Класс Input предоставляет прямой доступ к событиям устройств ввода через статические методы.
Input.GetAxis("MoveForward");
Input.GetTouch(0);
Unreal Engine 4 Компонент UInputComponent класса Actor предоставляет доступ к событиям устройств ввода используя биндинги.
InputComponent->BindAxis("MoveForward", this, &AFirstPersonBaseCodeCharacter::MoveForward);
InputComponent->BindTouch(EInputEvent::IE_Pressed, this, &AStrategyPlayerController::OnTapPressedMy);
...
void AStrategyPlayerController::OnTapPressedMy(ETouchIndex::Type index, FVector ScreenPosition)
{
}

Логирование

Unity
Debug.Log("Log text " + (0.1f).ToString());
Debug.LogWarning("Log warning");
Debug.LogError("Log error");
Unreal Engine 4
UE_LOG(LogTemp, Log, TEXT("Log text %f"), 0.1f);
UE_LOG(LogTemp, Warning, TEXT("Log warning"));
UE_LOG(LogTemp, Error, TEXT("Log error"));
FError::Throwf(TEXT("Log error"));
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT("Dialog message")));

Основные классы и функции

Базовые типы данных

Unity3DUnreal Engine 4
intint32, int24, int8
stringFString
TransformFTransform
QuaternionFQuat
RotationFRotator
GameobjectActor
ArrayTArray

Функции и переменные

Список самых распространенных функций
Unity3DUnreal Engine4
Update()Tick()
transformGetActorTranform(), GetFocalLocation()
transform.positionGetActorTranform().GetLocation()
transform.roationGetActorTranform().GetRotation()
transform.localScaleGetActorTranform().GetScaled3D()
Destroy()Destroy()
Find()FActorIterator ActorItr(GetWorld()),ConstructorHelpers::FObjectFinder object(name)
MathFFMath
RayCastTrace
SphereCastSweep

Основные компоненты

Unity3DUnreal Engine4
TransformUSceneComponent
CameraUCameraComponent
BoxColliderUBoxComponent
MeshFilterUStaticMeshComponent
ParticleSystemUParticleSystemComponent
AudioSourceUAudioComponent

Почитать по теме

  1. Unreal Engine 4. Обзор нового игрового движка от Unreal Technology
  2. Project Anarchy vs Unity 3D. Сравнение двух игровых движков
  3. 2D Игра. Часть 1. Создание и раскраска персонажа используя шейдер маски (видеоурок)
  4. Имплементация DLC системы в Unity
  5. Делаем туман войны в Unity. Видеоурок.

 Автор: Сергей Тарабан