開始する前に
以下が完了していることを確認します。
Unreal Engine をインストールして Unreal Engine 用に Visual Studio を設定する
プロジェクトとアクタの概要、および Unreal Editor の操作方法を学ぶ
テンプレートから始める
このチュートリアルでは、サンプル アセットを含むブループリントベースのプロジェクトから始めます。 既存のブループリント機能をレプリケートして発展させるコードを段階的に追加します。 これにより、ブループリントを参照として使用しながら新しい C++ プロジェクトで新しいクラスをビルドする方法を学ぶことができます。
テンプレートから新しいゲーム プロジェクトを作成するには、次の手順を実行します。
Unreal Engine を開きます。 [Unreal Project Browser (Unrealプロジェクトブラウザ)] で、[Games (ゲーム)] プロジェクト カテゴリに移動し、[First Person (一人称視点)] テンプレートを選択します。
[Project Defaults (プロジェクトデフォルト)] で、プロジェクト タイプを [Blueprint (ブループリント)] のままにしておきます。 これにより、Unreal Engine で C++ アセットではなくブループリントタイプのデフォルト アセットを使用してプロジェクトが作成されます。
[Variant (変数)] に [Arena Shooter (アリーナシューター)] を選択します。
プロジェクトに名前を付けます。 このチュートリアルでは、プロジェクト名として
AdventureGameを使用します。[Create (作成)] をクリックしてエディタで新しいプロジェクトを開きます。
Enhanced Input を検証する
Enhanced Input システムでは、ジャンプやしゃがみなど、キャラクターが実行できるアクションを定義するカスタム入力アクションをビルドしてキャラクターの動きを制御できます。 各入力アクションは、コードとキャラクター間で通信するためにコードで参照できるデータ アセットとして存在します。
このチュートリアルの後半では、入力アクションとコードを組み合わせてキャラクターが動き回ったり周りを見回したりできるようにします。
Enhanced Input システムは、プロジェクトですでに有効になっているはずです。 これを検証するには、次の手順を実行します。
Unreal Editor のメイン メニューで、[Edit (編集)] メニューに移動して [Plugins (プラグイン)] を選択します。
[Enhanced Input] を探します。 プラグインがインストールされて有効になっているはずです。
Enhanced Input システムと入力アクションの詳細については、「Enhanced Input」を参照してください。
C++ ゲーム モード クラスを作成する
ブループリントベースのプロジェクトには、連携させる C++ ファイルや Visual Studio (VS) プロジェクトはありません。 次に、最初のクラスを作成してプロジェクトに C++ を導入します。 まず、コーディングが必要な Visual Studio のプロジェクトとファイルの生成を Unreal Engine に指示するカスタム ゲーム モード クラスを作成します。 カスタム クラスは、親 AGameModeBase クラスから派生します。
ゲーム モード アセットは、ゲームのルール、勝利条件、使用されるキャラクターを定義します。 またゲーム モードは、ポーン、プレイヤー コントローラー、HUD など、プロジェクトで使用するデフォルト ゲームプレイ フレームワーク クラスを設定します。 このチュートリアルの後半では、ゲーム モードを使用してデフォルト プレイヤー キャラクターを変更します。
新しいゲーム モードの C++ クラスを作成するには、次の手順を実行します。
Unreal Editor のメイン メニューで、[Tools (ツール)] > [New C++ Class (新しい C++ クラス)] の順に移動します。
[Choose Parent Class (親クラスを選択)] ウィンドウで、[Game Mode Base (ゲームモードベース)] を見つけて [Next (次へ)] をクリックします。
新しいクラスの名前を入力してから [Create Class (クラスを作成)] をクリックします。 このチュートリアルでは
AdventureGameModeを使用します。コンテンツ ブラウザに C++ クラスが表示されるまでに、少なくとも 1 回 VS からプロジェクトをビルドするかコンパイルする必要があるという 2 つの警告プロンプトが表示されます。 [OK] をクリックしてから、2 番目の警告で [Yes (はい)] をクリックしてコードを開きます。
プロジェクトをビルドする
コードを追加し始める前に、VS でプロジェクトをビルドし、Unreal Editor をリフレッシュして環境の準備を完了します。
Visual Studio でプロジェクトを開く
ゲーム モード クラスを作成した後に、エンジンから自動的に VS でプロジェクトを開くよう求められなかった場合は、Unreal Editor のメイン メニューで [Tools] に移動して [Open Visual Studio (Visual Studioを開く)] を選択します。
デフォルトでは、プロジェクトの .sln ファイルも /Documents/Unreal Projects/[ProjectName] にあります。
Unreal Engine は、新しいクラス、モジュール、プラグインの追加やビルド設定の変更など、ユーザーがプロジェクトに加えた変更を追跡します。 ただし、VS プロジェクト ファイルには、これらの更新が自動的に反映されないことがあります。 すべてが最新の状態になるよう、([Tools] メニューにもある) [Refresh Visual Studio Project (Visual Studioプロジェクトをリフレッシュ)] を使用し、現在のプロジェクトのステートに基づいたソリューションおよびプロジェクト ファイルを再生成します。
Visual Studio を開くと、[Solution Explorer] に整理されたプロジェクト ファイルが表示されます。
[Solution Explorer] で、「Games」 > [ProjectName] > 「Source」 > [ProjectName] の順に展開します。 ここには、新しいゲーム モード [GameModeName].cppと [GameModeName].h に対応する 2 つのファイルを含む、ゲームのメイン ファイルが置かれています。
プロジェクトをビルドして Unreal Editor をリフレッシュする
Unreal Editor にコード プロジェクトを認識させてコンテンツ ブラウザに C++ クラスを含めるために、VS からプロジェクトをビルドしてエディタを再起動します。
Unreal Editor にクラスが表示されるようにプロジェクトをビルドするには、次の手順を実行します。
[Solution Explorer] の「Games」 > [ProjectName] で、プロジェクトを右クリックして [Build (ビルド)] を選択します。
ビルドが完了したら Unreal Editor に戻り、下部のツールバーに [Compile (コンパイル)] ボタンが表示されているかどうかと、コンテンツ ブラウザに新しい C++ クラス フォルダが表示されているかどうかを確認します。
表示されていない場合は、エディタを閉じてプロジェクトを再度開きます。 エディタを開くとプロジェクトが再コンパイルされ、C++ クラスが存在することが UE に伝えられます。 Unreal Engine からプロジェクトの再ビルドを求められた場合は [Yes] をクリックします。
ライブ コーディングを無効にする
コードを再度コンパイルする前に、Unreal Editor で [Live Coding (ライブコーディング)] をオフにします。 ライブ コーディングでは、エンジンの実行中に実装 (.cpp) ファイルで C++ コードを変更して再ビルドできます。ただし、ライブ コーディングは別のコンパイル ワークフローに従うため、ヘッダ (.h) ファイルを編集するときや Visual Studio からコンパイルしようとしたときにエラーが発生する可能性があります。 ライブ コーディングは、開発したコード ベースでイテレートするときに役に立ちますが、新しいプロジェクトを開始するときは無効にすることをお勧めします。
ライブ コーディングをオフにするには、エディタの下部のツールバーの [Compile] ボタンの横にある 3 つの点をクリックし、[Enable Live Coding (ライブコーディングを有効にする)] を無効にします。
ブループリントに C++ クラスを拡張する
独自のカスタム ゲーム モードを作成したら、ブループリントに拡張してエディタにプロパティを公開し、その新しいブループリントをプロジェクトのデフォルト ゲーム モードとして設定します。
コードですべてを実行するのではなく、ブループリントにゲーム モード クラスを拡張すると、エディタに直接クラスの値が公開されます。 ブループリントは C++ クラスの子として機能し、クラスのすべての機能を継承します。
GameMode クラスからブループリント アセットを派生するには、次の手順を実行します。
コンテンツ ブラウザのアセット ツリーで、「C++ Classes」 > [ProjectName] の順に移動して作成した C++ クラスを探します。
[Game Mode Base クラスを右クリックし、class and select Create Blueprint class based on [GameModeBaseName] ([GameModeBaseName]に基づいたブループリントクラスを作成)] を選択します。
後で識別できるよう、[Add Blueprint Class (ブループリントクラスを追加)] ウィンドウでブループリントに名前を付け、プレフィックス
BP_を追加します。 このチュートリアルでは、BP_AdventureGameModeを使用します。[Path (パス)] で、[All (すべて)] > [Content (コンテンツ)] > [FirstPerson] > [Blueprints (ブループリント)] の順に選択してから [Create Class] をクリックします。
Unreal Engine が新しいブループリント エディタ ウィンドウで自動的にブループリントを開きます。
メイン エディタ ウィンドウのマップ タブ ([Lvl_FirstPerson]) の横にあるブループリントのタブをドラッグすることにより、新しいウィンドウをメイン エディタ ウィンドウ内にドッキングできます。
プロジェクトのゲーム モードを変更する
デフォルトでは、新しい Unreal Engine プロジェクトはサンプル ゲーム モードを使用します。 これをカスタム ゲーム モードに変更するには、プロジェクトの設定を編集します。
デフォルト ゲーム モードを変更するには、次の手順を実行します。
エディタのメイン メニューで、[Edit (編集)] > [Project Settings (プロジェクト設定)] の順に移動します。
左パネルの [Project (プロジェクト)] セクションで、[Maps & Modes (マップ & モード)] を選択します。
設定テーブルの上部で、[Default GameMode (デフォルトゲームモード)] をゲーム モード ブループリントに変更します。
[Project Settings] を閉じます。
メイン メニューで [Window (ウィンドウ)] > [World Settings (ワールド セッティング)] を選択します。 デフォルトでは、[World Settings] パネルは、[Details (詳細)] パネルの横にドッキングして表示されます。 これらの設定は、現在のレベルの動作を制御します。
[Game Mode] セクションで、GameMode Override を新しい Game Mode ブループリントに設定します。
サンプル レベルでは、GameMode Override を変更するだけで済みます。 新しい空白のレベルを作成すると、GameMode Override はデフォルトで [None] に設定されます。
画面上のデバッグ メッセージを追加する
プロジェクトへのコードの追加を開始するにあたっては、まず画面上に「Hello World! (ハロー ワールド!)」メッセージを追加することをお勧めします。
Unreal Engine で指定されたデフォルト ゲーム モードではなく、新しいゲーム モードを使用していることを確認するためのデバッグ メッセージを追加します。 ログ メッセージとデバッグ メッセージは、開発中にコードを検証してデバッグするのに役立ちます。
デフォルト StartPlay() 関数をオーバーライドする
AGameModeBase には、ゲームでゲームプレイを開始する準備が整ったときに UE が呼び出す StartPlay() 関数が含まれています。 ユーザーは通常、グローバル ゲーム開始ロジックを追加するためにカスタム ゲーム モード クラスでこの関数をオーバーライドします。 ここでは、この関数をオーバーライドしてゲームの開始時にデバッグ メッセージが表示されるようにします。
カスタム ゲーム モード クラスで StartPlay() をオーバーライドするには、次の手順を実行します。
VS でゲーム モード クラスの
.hヘッダ ファイルを開きます。 このチュートリアルのコード サンプルでは、AdventureGameModeという名前のクラスを使用します。デフォルト コードは次のようになります。
C++UCLASS() class ADVENTUREGAME_API AAdventureGameMode : public AGameModeBase { GENERATED_BODY() };GENERATED_BODY()は、このクラスに必要なコードや、Unreal Engine と連携させるその他の UObject を自動的に生成する Unreal ヘッダ ツールで使用されるマクロです。 Unreal ヘッダ ツールの詳細については、UHT のドキュメントを参照してください。AAdventureGameModeクラスは、ゲームの開始や終了、マップへの立ち入り、進行中のゲームなど、さまざまなゲーム モードのステートをコードに公開します。 各ステートがトリガーされると、StartPlay()やResetLevel()などの関連する関数を実行します。AAdventureGameModeBaseクラスにStartPlay()関数のオーバーライド宣言を追加します。C++UCLASS() class ADVENTUREGAME_API AAdventureGameMode : public AGameModeBase { GENERATED_BODY() virtual void StartPlay() override; };.hファイルを保存します。
Unreal Engine のクラスと関数にはプレフィックスがあり、これで Unreal ヘッダ ツールにクラス タイプが伝わります。 たとえば、アクタの A プレフィックス、UObject の U、構造体の F などです。 Unreal Engine の C++ クラス プレフィックスの詳細については、Epic の C++ コード規約の命名規則を参照してください。
StartPlay() にデバッグ メッセージを追加する
デバッグ メッセージを出力するカスタム コードで StartPlay() のオーバーライドを実装します。
ゲームプレイの開始時に画面上にデバッグ メッセージを出力するには、次の手順を実行します。
ゲーム モードの
.cppファイルを開いて、先ほど宣言した関数を実装します。StartPlay()の関数定義を追加します。 この関数はAAdventureGameModeで宣言されるため、AAdventureGameMode::StartPlay()を使用して定義します。C++void AAdventureGameMode::StartPlay() { }AMyGameModeBase::StartPlay()内で、Super::StartPlay()を追加してAAdventureGameMode親クラスからStartPlay()関数を呼び出します。 これは、ゲームの開始時に実行される他のロジックを処理するのに必要です。次に、
GEngine != nullptrのcheckを追加して、グローバル エンジン ポインタが有効であることを確認します。C++void AAdventureGameMode::StartPlay() { Super::StartPlay(); check(GEngine != nullptr); }これは、Unreal Engine 自体で使用される UEngine クラスへのポインタであり、グローバル エンジン ポインタが有効であることを確認して、コードの続行前にゲームが適切に実行されるようにします。 グローバル エンジン ポインタが有効でなければ、ゲームはクラッシュします。
GEngineを使用して、ゲームの実行時に画面上にメッセージを出力する UEngine のAddOnScreenDebugMessage()メンバー関数にアクセスします。この関数は、次の 4 つの値を取ります。
メッセージを識別して同じメッセージが複数回追加されないようにする一意の int キー。 一意性が重要でない場合は
-1を使用します。メッセージを表示する浮動小数点秒数。
テキストの色を設定する
FColor。出力する
FStringメッセージ。
次の値を使用すると、ゲームの開始時に画面上に 5 秒間黄色のテキストで「Hello World!」メッセージが表示されます。
C++GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("Hello World, this is AdventureGameMode!"));.cppファイルを保存します。
これで、AAdventureGameMode::StartPlay() は次のようになります。
#include "AdventureGameMode.h"
void AAdventureGameMode::StartPlay()
{
Super::StartPlay();
check(GEngine != nullptr);
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("Hello World!"));
}UE_LOG は、デバッグ メッセージの出力に役立つもう 1 つの関数です。 この関数は、画面上にメッセージを出力するのではなく、ランタイム中に Unreal Engine の出力ログかコンソールにメッセージを記録します。 ゲームで起きていることに関する詳細な情報をログに記録したり、追跡したりするのに役立ちます。 以下のように、ログをさまざまなチャンネルに分類して (情報、エラー、警告メッセージなどの) メッセージ タイプを定義できます。 例:UE_LOG(LogTemp, Warning, TEXT("This is a warning message!"));
コードをコンパイルしてテストする
Unreal Editor の [Compile] ボタンをクリックするとプロジェクトを再ビルドできますが、VS から再ビルドすることをお勧めします。 コンパイルしたら、エディタとインゲームに反映されたコードの変更を確認できます。
ゲームの変更を確認するには、メイン ツールバーの [Play (プレイ)] をクリックしてプレイ イン エディタ (PIE) モードを開始します。 デバッグ メッセージは左上隅に表示されます。
PIE モードを終了するには、Shift + Escape を押すかレベル エディタのツールバーにある [Stop (停止)] をクリックします。
次の内容
新しいゲーム モードの基本的なプロジェクトが完成したら、プレイヤー キャラクターの作成を開始できます。 次のセクションでは、新しいキャラクター クラスをビルドしてから、入力アクションを使用してキャラクターに移動制御を追加する方法を学びます。
完全なコード
このセクションで作成した完全なコードを以下に示します。
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "AdventureGameMode.generated.h"
UCLASS()
class ADVENTUREGAME_API AAdventureGameMode : public AGameModeBase
{
GENERATED_BODY()
#include "AdventureGameMode.h"
void AdventureGameMode::StartPlay()
{
Super::StartPlay();
check(GEngine != nullptr);
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("Hello World!"));
}