Переход Unity3D разработчиков на Unreal Engine 4

From Epic Wiki

Общее

Это руководство создано для людей, которые пришли с Unity3D и C # и хотят перейти на Unreal Engine 4 и C++. Это руководство предполагает, что вы понимаете, как работает Unreal Editor включая такие вещи, как импорт и экспорт, чертежи [Blueprints], настройки мира, настройки проекта и многое другое. Здесь будут рассмотрены ключевые понятия Unreal Engine 4 и как они соотносятся с Unity3D.
ПРИМЕЧАНИЯ АВТОРА: Тут я складываю все полезные связи, которые я нашел в процессе изучения движка. А потом пользуюсь этой статьей как кратким руководством сходств и отличий.

Ключевые понятия

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

Unity

Игровая логика описывается с использованием среды Mono. Игровые скрипты манипулируют игровыми объектами [GameObject]. Игровые объекты могут иметь несколько игровых скриптов или вообще ни одного.

Unreal Engine 4

Игровая логика описывается с использованием C++ и/или редактора чертежей [Blueprint Editor]. Классы C++ и чертежи управляют актерами [Actors] сцены. Чертежи похожи на префабы [Prefabs] Unity. Чертежи представляют собой родительский класс, интерфейсы и любые компоненты, которые вы добавляете через редактор чертежей, а так же единую логику поведения чертежа. Обычно игру представляют набором функциональных систем написанных на C++, однако поскольку классы можно описывать через систему чертежей, то всю второстепенную функциональность игры можно полностью описать чертежами.

Начало игры

Unity

По умолчанию загружается уровень с индексом 0. Будучи однажды загруженными, все скрипты (по регламентированной очередности) вызывают несколько специальных методов класса, такие как Awake, Start, OnEnable, и т.д...

Unreal Engine 4

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

Замечание: (Edit > Project Settings > Maps & Modes) Секция Default Modes позволяет установить класс GameMode по умолчанию, которым будут пользоваться все уровни которым явно не назначено иное.

Стартовая точка игры - конструктор класса GameMode (или его наследника).

Сцена

Принцип сцены в обоих движках идентичен. Однако Unity3D и UE4 имеют разные направления координатных осей.

Unity3D

Ось Y направлена вверх.

  • X - влево, вправо
  • Y - вверх, вниз
  • Z - вперед, назад

Формат файла: *.scene

Используются статические методы класса GameObject для операции с объектами на сцене (find, spawn, destroy)

Загрузка сцены: Application.LoadLevel(string name);

Unreal Engine4

Ось Z направлена вверх.

  • X - вперед, назад
  • Y - влево, вправо
  • Z - вверх, вниз

UE4 дает осям вращение иное наименование (в отличии от координатных): Roll, Pitch и Yaw.

Формат файла: *.umap

Используются методы класса UWorld для операции с объектами на сцене (find, spawn, destroy). Можно получить экземпляр UWorld используя функцию GetWorld() класса PlayerController.

Загрузка сцены: GetWorld()->ServerTravel(string URL);

URL – путь к сцене, который может содержать дополнительные параметры. Например: "/Game/Maps/<map_name>?<key_1>=<value_1>&<key_2>=<value_2>"

Чтение параметров в коде: (GameMode class) GetIntOption(OptionsString, <key_1>, <default_value>);

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

Unity

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

Объекты GameObject являются контейнерами для других компонентов [Components]. По умолчанию всегда снабжается компонентом Transform. Компоненты добавляются, что бы внести в объект GameObject новую функциональность.

Объекты GameObject поддерживают иерархию (родительский объект -> дочерние объекты).

Unreal Engine 4

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

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

Объекты Actor поддерживают иерархию (родительский объект -> дочерние объекты).

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

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

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



События ввода

Unity

Единый класс обрабатывающий пользовательский ввод

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)
{
}



Вывод в консоль (log)

Unity
Debug.Log("Log text " + (0.1f).ToString());
Debug.LogWarning("Log warning");
Debug.LogError("Log error");
Unreal Engine 4
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("This is an on screen message!"));
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")));

Подробнее:

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

Основные типы данных

Unity3D Unreal Engine4
int int32, int24, int8
string FString
Transform FTransform
Quaternion FQuat
Rotation FRotator
Gameobject Actor
Array TArray


Продвинутые типы данных

Unreal Engine4 Описание
TAssetPtr Указатель на ресурс, который еще не загружен, но может, если потребуется
TAssetSubclassOf Указатель на подкласс, который еще не загружен, но может, если потребуется. Используется как указатель на чертежи [Blueprints].


Функции

Тут представлен список наиболее часто используемых функций, которые любой разработчик Unity C# должен знать и использовать. Соответственно справа указаны идентичные функции UE4

Unity3D Unreal Engine4
Update() Tick(), TickComponent()
transform GetActorTranform(), GetFocalLocation()
transform.position GetActorTranform().GetLocation()
transform.roation GetActorTranform().GetRotation()
transform.localScale GetActorTranform().GetScaled3D()
GetComponent<T>() FindComponentByClass<T>()
Destroy() Destroy()
Find() TObjectIterator<T>(), FActorIterator<T>, ActorItr(GetWorld()),ConstructorHelpers::FObjectFinder<your_class> object(name)
MathF FMath
RayCast Trace
SphereCast Sweep


Компоненты

Unity3D Unreal Engine4
Transform USceneComponent
Camera UCameraComponent
BoxCollider UBoxComponent
MeshFilter UStaticMeshComponent
ParticleSystem UParticleSystemComponent
AudioSource UAudioComponent


Статические данные

Unreal Engine 4 Описание
UGameplayStatics Используется для получения таких вещей как players pawn, game mode, singlton, controller, spawn decal, spawn emitter

Спавн

Для создания чего-то в режиме реального времени.

Unity3D

Instantiate()

Эта функция создает копию объекта, как вызов Duplicate в редактора. Клонируя GameObject вы можете обозначить его новое местоположение. Если вы клонируете компонент, то GameObject которому принадлежит компонент так же клонируется.

Unreal Engine4

UWorld->SpawnActor()

Процесс создания нового экземпляра Actor называется - спавн [spawn]. Спавн объекта Actor производится функцией UWorld::SpawnActor(). Эта функция создает новый экземпляр класса и возвращает указатель на вновьсозданного Actor. UWorld::SpawnActor() может использоваться только для спавна классов, унаследованных от Actor.


#includes

Стоит отметить, что все включенное директивой #include в файле "Project.h" распространится на все классы проекта. Однако ваш компилятор может подложить вам свинью, поэтому рекомендуется все-таки делать включения индивидуально для каждого класса.

ParticleDefinitions.h

При попытке добавить систему частиц из C++ вы получите ошибку, если не подключите файл "ParticleDefinitions.h" к вашему "class.h".

.h

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/Actor.h"
#include "ParticleDefinitions.h"
#include "ParticleTest.generated.h"

UCLASS()
class AParticleTest : public AActor
{
	GENERATED_UCLASS_BODY()

	UPROPERTY(VisibleAnywhere, Category = Particle System)
	TSubobjectPtr<UParticleSystemComponent> ParticleSystem;
};

.cpp

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.

#include "MyProject.h"
#include "ParticleTest.h"


AParticleTest::AParticleTest(const class FPostConstructInitializeProperties& PCIP)
	: Super(PCIP)
{
	ParticleSystem = PCIP.CreateDefaultSubobject<UParticleSystemComponent>(this, FName(TEXT("Particle System")));
	RootComponent = ParticleSystem;

}