Unity3D Developer's Guide to Unreal Engine 4
Unity Developers New to Unreal Engine 4 Check out the official Unreal Engine 4 for Unity Developers guide in the documentation! Overview This guide should be Used and Maintained with the idea that ...
Unity Developers New to Unreal Engine 4
Check out the official Unreal Engine 4 for Unity Developers guide in the documentation!
Overview
This guide should be Used and Maintained with the idea that it's purpose is to illustrate comparable elements and features between Unity3D and Unreal4.
Any topic that is not relatable back to Unity3D in some direct way should have it's own wiki page for user experience and searches.
Key concepts
Game logic
Unity
Game logic is written using the Mono environment. Scripts manipulate GameObjects. GameObjects can have numerous scripts or none at all.
Unreal Engine 4
Game logic is written using C++ and/or Blueprint Editor. C++ classes and blueprints manipulate scene Actors. Blueprints are similar to Unity Prefabs. A Blueprint is a single parent class, interfaces, any components you wish to add via the blueprint editor, and one system of blueprint logic. A typical game sees major systems and functionality created with C++, but since C++ classes can be exposed to Blueprint systems, tertiary functionality can be added via the blueprint system.
Game Start
Unity
By default the level with index 0 is loaded. Once loaded, all scripts (depending on execution order) have numerous methods fired, such as, Awake, Start, OnEnable, etc....
Unreal Engine 4
The level set by default in (Edit > Project Settings > Maps & Modes) is loaded. Every level has a WorldSettings class of which the properties can be edited in the editor. Using this class, UWorld classes are created at runtime. UWorld creates an object of class GameMode in scene. GameMode objects are used to spawn PlayerController objects, managers, and other objects used during gameplay.
Note: (Edit > Project Settings > Maps & Modes) Default Modes section will allow you to set a default GameMode that all levels by default use.
The Game's entry point is the constructor of the class inherited from GameMode.
Life Cycle
Stub: This should be expanded to include the general life cycle of Unreal Script Execution Order similar to http://docs.unity3d.com/Manual/ExecutionOrder.html Unity Docs
Consider making a new page and linking to it from here.
Scene
The concept of the Scene in both engines is the same. However, Unity3D and UE4 have different axes definitions.
Unity3D
Unity uses a left handed coordinate system -- where the vertical direction is usually represented by the +Y axis.
- X - left, right
- Y - up, down
- Z - forwards, backwards
File format: *.scene
Use GameObject static methods for scene objects operations ( find, spawn, destroy)
Level loading: Application.LoadLevel(string name);
Unreal Engine4
UE4 uses a left handed coordinate system -- where the vertical direction is usually represented by the +Z axis. Z axis up.
- X - forwards, backwards
- Y - left, right
- Z - up, down
UE4 also referrers to the pivots of a rotation as: Roll, Pitch, and Yaw.
File format: *.umap
Use UWorld for scene object operations ( find, spawn, destroy). You can get UWorld using GetWorld() from any UObject.
Level loading:
// OpenLevel in Blueprints. Both work the same and allow you to pass additional parameters. Example: "=?="
// @param bAbsolute if true options are reset, if false options are carried over from current level
UGameplayStatics::OpenLevel(UObject* WorldContextObject, FName LevelName, bool bAbsolute, FString Options);
// or
// where the URL = path to the level and can include additional parameters. Example: "/Game/Maps/?=?="
GetWorld()->ServerTravel(string URL)
Reading Parameters:
To use the parameters in code you must be in the GameMode class
// Searches the GameMode's current OptionsString (a default gamemode variable) for the and if the 'key' is not found returns the 'default_value'
// Keys and Values are formatted similar to ini files.
GetIntOption(OptionsString, key, default_value);
Scene objects
Unity
Base scene object ÔÇô GameObject.
GameObjects are containers for all other Components. It has a Transform component by default. Components are then added to give the GameObject functionality.
GameObjects support a hierarchy (parent-child relation).
Unreal Engine 4
Base scene object - Actor.
An Actor is the base object that can be placed or spawned into the world. An Actor by itself does not contain a USceneComponent (More on these later). The Actor is simply the base object which can have a presence in the level. Components add functionality to an Actor.
Actors support a hierarchy (parent-child relation).
Programmers can inherit from the default UActorComponent to create their own component.
Component spawning example:
.h
// Remember to add a UPROPERTY() to your component definition in the .h with proper tags to expose the variables of the component for editing in the details panel of UE4 Editor.
// If you do not, you will be able to see the component but the details panel will show up blank!
// Add BlueprintReadWrite or other Blueprint tags to use in Blueprints.
UPROPERTY(EditAnywhere)
USceneComponent* SceneComponent;
.cpp
USceneComponent* SceneComponent = FObjectInitializer.CreateDefaultSubobject(this, TEXT("SceneComp"));
RootComponent = SceneComponent;
Input events
Unity
Class Input
Input.GetAxis("MoveForward");
Input.GetTouch(0);
Unreal Engine 4
Component UInputComponent of Actor class
InputComponent->BindAxis("MoveForward", this, &AFirstPersonBaseCodeCharacter::MoveForward);
InputComponent->BindTouch(EInputEvent::IE_Pressed, this, &AStrategyPlayerController::OnTapPressedMy);
...
void AStrategyPlayerController::OnTapPressedMy(ETouchIndex::Type index, FVector ScreenPosition)
{
}
Print to console (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")));
Further Reading: Wiki Entry on logging
=Main classes and function=
Basic Data Types
Unity3D | Unreal Engine4
---------- | ------------------
int | int32, int24, int8
string | FString
Transform | FTransform
Quaternion | FQuat
Rotation | FRotator
Gameobject | Actor
Array | TArray
Member Functions and Variables
Here is a list of commonly used functions and variables every Unity C# programmer should know and use. Listed along side are the identical/similar functions and variables used to gather the same information
Unity3D | Unreal Engine4
-------------------- | ------------------------------------------------------------------------------------------------------------------------
Update() | Tick(), TickComponent()
transform | GetTransform() (returns new instance), SetActorTransform(FTransform) (to apply the Transform)
transform.position | GetActorLocation()
transform.rotation | GetActorRotation()
transform.localScale | GetActorScale()
GetComponent() | FindComponentByClass()
Destroy() | Destroy()
Find() | TObjectIterator(), FActorIterator, ActorItr(GetWorld()),ConstructorHelpers::FObjectFinder object(name)
MathF | FMath
RayCast | Trace
SphereCast | Sweep
Components
Unity3D | Unreal Engine4
-------------- | ------------------------
Transform | USceneComponent
Camera | UCameraComponent
BoxCollider | UBoxComponent
MeshFilter | UStaticMeshComponent
ParticleSystem | UParticleSystemComponent
AudioSource | UAudioComponent
Statics
Unreal Engine 4 | Use
---------------- | ------------------------------------------------------------------------------------------------------------
UGameplayStatics | Used to get access to things like players pawn, game mode, singleton, controller, spawn decal, spawn emitter
Spawning
To create something at runtime.
Unity3D
Instantiate()
This function makes a copy of an object in a similar way to the Duplicate command in the editor. If you are cloning a GameObject then you can also optionally specify its position and rotation (these will default to Vector3.zero and Quaternion.identity respectively). If you are cloning a Component then the GameObject it is attached to will also be cloned, again with an optional position and rotation.
Unreal Engine4
UWorld->SpawnActor()
The process of creating a new instance of an Actor is known as spawning. Spawning of Actors is performed using the UWorld::SpawnActor() function. This function creates a new instance of a specified class and returns a pointer to the newly created Actor. UWorld::SpawnActor() may only be used for creating instances of classes which inherit from the Actor class in their hierarchy.
#includes
It should be noted that #includes can also be added to your "Project.h" and will thus be included in all classes. This however can be a draw on your compiler and it's advised to add includes individually.
Particles/ParticleSystemComponent.h
When trying to add a particle system via C++ you will receive an error unless you include the "Particles/ParticleSystemComponent.h" to your "class.h". Below is an example class that provides an exposed Particle System slot on an Actor via C++.
It is important to note that includes now require that the complete short path be defined. For example "ParticleSystemComponent.h" will not work without "Particles/" short path defined along with it as "Particles/ParticleSystemComponent.h".
.h
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Actor.h"
#include "Particles/ParticleSystemComponent.h"
#include "ParticleTest.generated.h"
UCLASS()
class AParticleTest : public AActor
{
GENERATED_UCLASS_BODY()
UPROPERTY(VisibleAnywhere, Category = Particle System)
TSubobjectPtr 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(this, FName(TEXT("Particle System")));
RootComponent = ParticleSystem;
}