Переход Unity3D разработчиков на Unreal Engine 4
Contents
Общее
Это руководство создано для людей, которые пришли с 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")));
Подробнее: Wiki Entry on logging
Главные классы и функции
Основные типы данных
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;
}