Unreal Engine 5を使ってみる その13(C++での開発)
はじめに
今回はUnreal EngineでC++での開発に取り組んでみました。
普段はブループリントで開発していますが、ネットワーク関連に関してはノードの不足を感じるようになってきました。
C++でノードを開発してプラグインにしていきたいところですが、まずは基礎的な部分の確認です。
▼以前の記事はこちら
開発環境を構築する
毎度ながら環境構築はややこしいので、手順を残しています。
Visual Studioのセットアップ
Windows 11のPCで、Unreal Engine 5.3向けにセットアップを進めました。
▼VSCodeでも開発できるそうです。
▼以下のページを参考にして、Visual Studioの セットアップを行いました。
注意点として、「UE 5.4ではVisual Studio 2019のサポートが終了するため、Visual Studio 2022が必要になります。」と書かれていました。
今後のバージョンでも変化していきそうですが、今回はVisual Studio 2022をインストールしました。
▼以下のページからインストーラをダウンロード後、実行しました。
https://visualstudio.microsoft.com/ja/vs
▼インストーラでVisual Studio 2022を選択すると、以下のような画面になります。
以下の四つを選択しました。
- .NETデスクトップ開発
- C++によるデスクトップ開発
- Windowsアプリケーション開発
- C++によるゲーム開発
▼Windowsアプリケーション開発だけ、Windows 10 SDK(10.0.19041.0)とWIndows 11 SDK(10.0.26.100.0)を指定しました。
この状態で変更を選択すると、インストールが始まりました。
ここからは推奨設定に従って設定しておきました。
▼Visual Studio 2022を起動し、コードなしで続行を選択しました。
▼下向き三角矢印の小さなボタンをクリックして、カスタマイズを選択しました。
▼コマンドのツールバーを選択しました。
▼プルダウンで標準を選択しました。
▼ソリューション構成を選択し、選択したボタンの編集を選択しました。
▼幅を200にして、ウィンドウを閉じました。
▼ボタンの追加または削除から、ソリューションプラットフォームは有効にしておきました。
▼ツールのオプションを選択しました。
▼ビルド完了時にエラー一覧を表示するのはオフにしておきました。
Unreal Engine 統合構成を解決する
この後の手順でC++クラスをダブルクリック後、Visual Studioが起動してUnreal Engine 統合構成に関するウィンドウが表示されました。
▼更新ボタンを押すと、状態がチェックされます。
▼事前に検証していたときは不足しているものが警告として表示されていました。
どの方法が有効だったのかは分かりませんが、Visual Studio関連の設定を行いました。
まずEpic Games LauncherでVisual Studio Integration ToolsをUnreal Engine 5.3にインストールしました。
▼ネットワークの問題なのか、エラーがでてインストールできないことがありました。「i」と書かれたアイコンを選択してブラウザで表示してからだとインストールできることがありました。
▼Unreal Engine 5.3に対してインストールします。
プラグインをインストール後、作成したプロジェクトの編集→プラグインの欄から、Visual Studio Integration Toolsを有効にして再起動しました。
▼プラグインをインストール後、再起動しないと表示されないかもしれません。
エディタの環境設定でソースコードのエディタをVisual Studio 2022にしました。
▼ソースコードエディタがデフォルトではVisual Studioになっていました。
他にも設定したものがあるかもしれませんが、設定後に統合構成を確認すると、警告は無くなっていました。
▼名前付け規則チェッカーやHLSLサポートは、フォルダを選択するだけのようでした。
▼すべて正常な状態にしておきました。
C++で開発する
C++プロジェクトを作成する
今回はUnreal Engine 5.3でブランクプロジェクトを作成しました。
▼UE53cppというプロジェクト名で作成しました。
▼起動後、エディタ画面が表示されました。
新規C++クラスを作成する
クイック スタート ガイドに従って、C++クラスを作成してみます。
▼こちらのページです。ただしUnreal Engine 4の画面だったので、異なる部分があります。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-engine-cpp-quick-start
まずはC++クラスを作成しました。
▼新規C++クラスを作成します。
▼Actorで作成します。
▼名前はFloatingActorです。
作成後、Visual Studio 2022が起動しました。
▼この後追加したものも表示されていますが、画面右側のソリューションエクスプローラーにFloatingActor関連のファイルがありました。
ファイルの中身を確認しておきました。
▼FloatingActor.hはこちら
▼FloatingActor.cppはこちら
ブループリントではおなじみのBeginPlayやTickが用意されています。
クイックスタートに従って、プログラムを修正しました。
▼FloatingActor.hの中身はこちら
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"
UCLASS()
class UE53CPP_API AFloatingActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AFloatingActor();
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* VisualMesh;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
▼FloatingActor.cppの中身はこちら
#include "FloatingActor.h"
// Sets default values
AFloatingActor::AFloatingActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
VisualMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
VisualMesh->SetupAttachment(RootComponent);
static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube"));
if (CubeVisualAsset.Succeeded())
{
VisualMesh->SetStaticMesh(CubeVisualAsset.Object);
VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
}
}
// Called when the game starts or when spawned
void AFloatingActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AFloatingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FVector NewLocation = GetActorLocation();
FRotator NewRotation = GetActorRotation();
float RunningTime = GetGameTimeSinceCreation();
float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
NewLocation.Z += DeltaHeight * 20.0f; //高さを 20 倍に拡大します
float DeltaRotation = DeltaTime * 20.0f; //毎秒 20 度回転させます
NewRotation.Yaw += DeltaRotation;
SetActorLocationAndRotation(NewLocation, NewRotation);
}
修正後、ビルドしてみました。
▼プロジェクト名のファイルを右クリックして、ビルドしてみました。
▼エラーが起きていました。
▼リビルドすると、正常に終了しました。
この後Unreal EditorでFloatingActorを探したのですが、見つかりませんでした。クイックスタートガイドにはUnreal Editorのコンパイルボタンを押してもよいと書かれていたのですが、そもそもボタンが無かったです。
Unreal Editorの画面右下にコンパイルするためのボタンがあったので、実行してみました。
▼ライブコーディングの有効化をオフにすると、ボタンを押せるようになりました。
▼ボタンをクリックするとUnreal Engineが終了してしまったので、プロジェクトを再起動しました。
▼Live Codingについては、以下のフォーラムでも挙動について記載されているものがありました。
https://forums.unrealengine.com/t/ue521-c/1293412
結局、プロジェクトを再起動すると表示されました。
▼コンテンツドロワーのC++クラスの中に、FloatingActorが追加されていました。
▼レベルに追加してみたのですが、何も表示されていません。
スタティックメッシュが割り当てられていない状態だったので、設定しました。
▼ArcadeEditorSphereを割り当てました。
▼ゲームを開始すると、回転しながら上下にふわふわ動き始めました。
LowerCaseノードを作成してみる
Node-REDのノードの開発をするときは、チュートリアルで大文字を小文字にするlower-caseノードの開発について紹介されていました。
Unreal EngineでもまずはLowerCaseノードを開発してみることにしました。手順はFloatingActorを作成したときと同様です。
▼再度新規C++クラスを作成します。
▼Blueprint Function Libraryを選択しました。
▼名前はLowerCaseです。
▼以下のようにLowerCase.hとLowerCase.cppが追加されました。
大文字を小文字にするためのノードとなるように、ChatGPTに相談してコードを書いてもらいました。
▼LowerCase.hの中身はこちら
#pragma once
#include "Kismet/BlueprintFunctionLibrary.h"
#include "LowerCase.generated.h"
UCLASS()
class UE53CPP_API ULowerCase : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/** Converts a string to lowercase */
UFUNCTION(BlueprintCallable, Category = "String")
static FString ConvertToLowerCase(const FString& Input);
};
▼LowerCase.cppの中身はこちら
#include "LowerCase.h"
FString ULowerCase::ConvertToLowerCase(const FString& Input)
{
return Input.ToLower();
}
ファイルの修正後、プロジェクトを再起動するとノードが追加されていました。
▼Convert to Lower Caseが追加されました!
▼ノードは以下のようになっています。
▼ちなみに、他のプロジェクトだとノードは無かったです。
レベルブループリントで動作を確認してみました。
▼Event TickとPrint Stringにつないで、HELLO!という大文字の文字列を入れました。
▼小文字になって表示されました!
Visual Studioでコンパイル後、Unreal Engineを起動する
ローカルWindowsデバッガーを実行するときの引数に-skipcompileが入っているのが気になっていました。その部分を取り除いてローカルWindowsデバッガーをクリックすると、Unreal Engineのプロジェクトが起動しました。
▼デフォルトでは-skipcompileが入っています。
▼プロジェクトが起動後、赤くなってプロセスを監視する状態になりました。
▼この状態だとホットリロードも表示されています。
なお、デバッグを終了するとUnreal Engineも終了しました。
LowerCase.hのカテゴリを変更してホットリロードを試してみたのですが、実行できないようでした。
▼元々は文字列のカテゴリに分類されています。
▼カテゴリを変更してホットリロードをクリックしてみたのですが、以下のようにサポートされていないと表示されました。
Unreal Editorの画面右下にあるコンパイルするためのボタンをクリックすると、変更が反映されました。C++のクラスを作成したときは実行するとプロジェクトが再起動しましたが、その後は再起動せずに変更が反映されました。
▼以下のボタンです。
▼カテゴリがテストになっています。
ソリューションをビルドできない問題
MicrosoftのVisual Studio Tools for Unreal Engineのページでは、ソリューションのビルドを選択してゲームをビルドするように書かれていました。
▼こちらのページです。
https://learn.microsoft.com/ja-jp/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-quickstart
しかし、ソリューションのビルドやリビルドを実行しても常にエラーが起きていました。
▼以下のエラーが起きていました。
BgScriptReader.csやCheckForHacks.csのファイルでのエラーです。
▼このエラーについて、フォーラムではエンジンのコードを修正して回避する方法が紹介されていました。
エンジンの修正は影響が大きいので、今回はフォーラムの方法は試していません。今後のアップデートで修正されるとよいのですが、現状ではUnreal Editorでコンパイルすれば良いかと思っています。
最後に
結局どうやってビルドするのが正解なのかは不明なままです。若干ドキュメントが古かったりするのが難点ですね。
ひとまずC++でのクラスの作成や、プラグインの開発を試していこうと思います。