読者です 読者をやめる 読者になる 読者になる

Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

Unity3D開発者がUE4を使うための入門ガイド

今回はちょっと趣向を変えて、海外のWikiページを翻訳したものを載せてみたいと思います。元ネタのページは以下です。

Unity3D Developer's Guide to Unreal Engine 4 - Epic Wiki

Unityを使っている人がUE4を使いたい時のための簡単なガイド記事です。

翻訳自体は機械翻訳と私自身の主観が混じっていますので、正確ではないということを承知の上で読み進めてください。

 概要

このガイドでは、Unity3DとC#から来る人々がUnreal Engine及び、C++への移行を支援します。このガイドでは、ブループリント、ワールド設定、プロジェクト設定、インポートおよびエクスポートなどを含むアンリアルエディターの基本動作を理解している前提としています。これはUnreal Engine 4とUnity3Dに関連付けて重要な概念にフォーカスを当てています。

※著者注:これは私がエンジンを学習する過程で発見した便利な関係の一覧です。類似点と相違点のクイックガイドとして提供しています。

キーコンセプト

ゲームロジック

Unity

ゲームのロジックはMono環境で書かれています。スクリプトでゲームオブジェクトを操作します。ゲームオブジェクトは多数のスクリプトを持つか、もしくは全く持たせる必要はありません。

 

Unreal Engine 4

ゲームのロジックはC++および、ブループリントエディターを使用して書かれています。C++のクラスとブループリントはシーンアクターを操作します。ブループリントはUnityのPrefabに似ています。ブループリントは単一の親クラス、インターフェース、ブループリントエディターで任意のコンポーネントを追加する、およびブループリントでロジックを作成するまでがひとつのシステムです。

典型的なゲームではC++で主要なシステムや機能を作りますが、C++のクラスはブループリント上に公開することができるため、第三の機能をブループリントシステムを介して追加することができます。

ゲームスタート

Unity

デフォルトではインデックス0のレベルがロードされます。一度読み込まれると、(実行順序に依存する)全てのスクリプトの多数のメソッド、Awake、Start、OnEnableなどが呼び出されます。

 

Unreal Engine 4

(編集 > プロジェクト設定 > マップ&モード)でデフォルトに設定されたレベルがロードされます。全てのレベルにはプロパティをエディターから編集することが可能なWorldSettingsクラスがあります。このクラスを使用するとUWorldクラスが実行時に作成されます。

UWorldはシーン内にGameModeクラスのオブジェクトを作成します。GameModeオブジェクトはPlayerContollerオブジェクト、マネージャー、及びゲームプレイ中に使用される他のオブジェクトを起動するために使用されます。

注:(編集 > プロジェクト設定 > マップ& モード) デフォルトモードのセクションでデフォルトGameModeを設定することにより全てのレベルに既定を設定することができます。ゲームのエントリーポイントはGameModeから継承したクラスのコンストラクターです。

シーン

両方のエンジンでシーンの概念は同じです。しかしUnity3D及びUE4では軸の定義が異なっています。

Unity

Y軸が上。

  • X - 左と右
  • Y - 上と下
  • Z - 前方と後方

ファイル形式: *.scene

シーンオブジェクトを操作するために使用する静的なGameObjectメソッド(find、spawn、destroy)

レベルのロード: Application.LoadLevel(string name);

 

Unreal Engine 4

Z軸が上。

  • X - 前方と後方
  • Y - 左と右
  • Z - 上と下

UE4では回転の基点の参照元として、ロール、ピッチ、ヨーもあります。

ファイル形式: *.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>"

 シーンオブジェクト

Unity

ベースシーンオブジェクト - GameObject

GameObjectは他の全てのコンポーネントのオブジェクトです。これはデフォルトでTransformコンポーネントを持っています。コンポーネントを追加することによって、GameObjectに機能を与えることができます。

GameObjectは階層構造(親子関係)をサポートしています。

 

Unreal Engine 4

ベースシーンオブジェクト - Actor

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

ActorクラスのコンポーネントUInputComponent

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

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")));

メインクラスと関数

基本データ型

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

高度なデータ型

Unreal Engine4説明
TAssetPtr まだロードされていないアセットを指定してリクエストすることができます。
TAssetSubclassOf まだロードされていないサブクラスを指定してリクスエトすることができ、基本的なコンポーネントの代わりにブループリントで指定します。

メンバー関数と変数

ここで一般的に使用される関数と変数のリストは全てのUnity C#プログラマーが知っておく必要があるものです。横並びに記載される関数や変数は同一もしくは類似の情報を知るために使用されます。

Unity3DUnreal 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

 コンポーネント

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

スタティックス

Unreal Engine 4使用
UGameplayStatics プレイヤーのポーン、ゲームモード、シングルトン、コントローラ、スポーン、デカール、スポーン、エミッタなどへアクセスを取得するために使用します

スポーン(生成)

実行時に何かを作成します。

Unity

Instantiate()

この関数はエディターのデュプリケートコマンドと同様に、オブジェクトのコピーを作成します。あなたがGameObjectのクローンを作成しているのなら、必要に応じて位置と回転を(これらはそれぞれVector3.zeroとQuaternion.identityにデフォルト設定されます)指定することができます。

コンポーネントのクローンを作成している場合、それがアタッチされているGameObjectはオプションの位置と回転で再び、クローン化されます。

 

Unreal Engine 4

UWorld->SpawnActor()

Actorの新しいインスタンスを作成するプロセスはスポーンとして知られています。ActorのスポーンはUWorld::SpawnActor()関数を使用して実行されます。この関数は指定されたクラスの新しいインスタンスを作成し、新しく作成されたActorへのポインターを返します。UWorld::SpawnActor()はその階層にActorクラスを継承するクラスのインスタンスを作成するために使用することができます。

#includes

#includeで"Project.h"を追加することができますが、全てのクラスが含まれることに注意してください。しかしこれはコンパイラーによって相打ちさせることもできますが、助言としてインクルードは個別に行なうことをお勧めします。

Particles/ParticleSystemComponent.h

C++を経由してパーティクルシステムを追加しようとすると、あなたの「class.h」に対して、 "Particles/ParticleSystemComponent.h"を組み込まない限りエラーが表示されます。以下はC++でActorにパーティクルシステムスロットを公開し、提供するクラスの例です。

それには短かい完全なパスが含まれていることに注意する必要があります。例えば"ParticleSystemComponent.h"は"Particles/ParticleSystemComponent.h"としてそれと一緒に定義されている短かいパス、"Particles/"なしでは動作しません。

.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<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;
}