見出し画像

書籍【C++で作るUnreal Engineアプリ開発】をUE5 EAで学習した時の注意点

学習を始めたきっかけ

MetaSoundがMidi Note Noを使えるので、MIDI fileが読み込めると色々出来るので、MIDI fileがUnreal Engineで使えるか調べてみました。
Procedural MidiというプラグインでMIDI fileを扱うことが出来ることが分かったのですが、4.26までしか対応していませんでした。

Procedural Midi

Discordで
「Githubに公開されているソースをUE5で、ビルドしなおしたら使えた」
と言っている方がいました。

プラグイン作りは楽しそうだし、Unreal EngineのC++に触るいい機会だからPluginの作り方を学習してみることにしました。
【C++で作るUnreal Engineアプリ開発 for Windows & macOS】という書籍があることは知っていたので、さっそく購入して学習を開始しました。

MetaSoundを使用する前提なので、UE5 EAで学習することにしました。
書籍は4.18で学習するように書かれています。

バージョンが違うので当然ながら書籍通りとも行かず、UE5 EAで学習した時にどういったところが躓いたか、そして、その解決方法についてまとめました。
提供されているC++のソースコードはUE5 EAでそのまま使用することが出来ました。

開発環境(Visual Studio 2019 or Visual Studio Code)のセットアップ

C++の開発環境であるVisual StudioがUE4 4.25 以降はVisual Studio 2019を使用ように公式ドキュメントで書かれています。
Visual Studio2019かVisual Studio Codeでソースコードを書くまでの設定方法についてまとめました。
個人的にはVisual Studio 2019+ Visual Assist(30日間無料)を使うのがおススメです。

Visual Studio 2019でC++を書いて学習を進める際に困ったこと
公開した後にアドバイスを頂けて作業がスムーズになりました。ありがとうございます。


書籍内で立ち止まって調べることになった箇所

3章 P.50 autoキーワードの使用について

'auto' キーワード

以下の例外がなければ、C++ コードで auto を使わないようにします。初期化している型について常に明示的でなければなりません。つまり、読み手がその型を見えるようにしなければなりません。このルールは C# の ‘var' キーワードの使用にも適用されます。

auto の使用はどのような場合に認められますか?
・lambda を変数にバインドする必要がある場合です。lambda 型はコードで表現できないからです。
・iterator 変数に対して認められます。しかし、iterator の型が非常に詳細で読みづらくなります。
・テンプレートのコードで認められます。この場合、式の型は簡単に見分けることはできません。これは高度な事例です。

コーディング規約

書籍ではautoキーワードが使われています。

auto AMySomeCPPActor::SetMyVelocity(const float Velocity) -> void
{
    MyVelocity = Velocity;
}

エンジンのソースコードを見てもautoキーワードが使われていなかったので、コーディング規約に従って、autoキーワードを使わない書き方に書き換えて学習しました。

void AMySomeCPPActor::SetMyVelocity(const float Velocity)
{
	MyVelocity = Velocity;
}

autoキーワードを使用しても動作するので、決まりごとが無ければ書きやすい書き方が一番です。

4章 P.65 PropertyAccess.hで重複エラー

P.65
PropertyAccess.hというヘッダを作るとEngine側のヘッダーファイルと重複するのでエラーが発生します。

PropertyAccess.hでエラー

PropertyAccess.h以外の名前を使用して対応しました。

5章 P.89 ObjectInitializer

P.89 5.1.2 UObjectの生成と解放
ObjectInitializer.CreateDefaultSubobjectについて何をしているのか興味を持って調べてみたら、非常に分かりやすく解説されていました。

5章 P.93 SampleFunctionsクラスはBlueprintFunctionLibraryを親クラスに指定する

P.93
突然[SampleFunctionsクラス]が出てくるのですが、BlueprintFunctionLibraryクラスを親に持つクラスでした。
親クラスを選択する画面で、All Classesから「BlueprintFunctionLibrary」を選択します。

5章 P.107 Operator==とGetTypeHush

P.107
KeyStruct.cppで関数名に"=="が書かれていたのですが、ブループリントでどう使うのかが書かれていなかったので調べました。

bool operator==(const FKeyStruct& key0, const FKeyStruct& Key1);

Forumsに解説があったので理解できました。
もう少し分かりやすいサンプルをブログで書いてみます。

6章 P.121~P129 Visual Studio 2019で静的ライブラリ(.lib)を作成してUE5 EAで使用するまで

Visual Studio 2019で静的ライブラリを作るプロジェクトのテンプレートが用意されていたので、Visual Studio 2019で.libを作って、UE5 EAで作成した.libを使用するまでをまとめました。
書籍の解説の図を見ながら手順に従うと何をしているのかが分かりやすいです。

6章 P.130~P.138 Visual Studio 2019で動的リンクライブラリ(DLL)を作成してUE5 EAで使用するまで

DLLの作成方法もVisual Studio 2019でプロジェクトのテンプレートが用意されていたので手順をまとめました。
DLLには「Explicit Linking(明示的リンク)」と「Implicit Linking(暗黙的リンク)」の2種類があります。
書籍では「Explicit Linking(明示的リンク)」の事例のみ紹介されていたので、「Implicit Linking(暗黙的リンク)」でDLLを作成して使用する方法についてまとめました。

7章 UE5 EAでプラグイン作成して公開する準備まで

メニュー周りがUE5 EAで場所が移動しているので、簡単なBlueprintLibraryプラグインを作成する手順をまとめました。

P.149
Modulesタブの開き方が変更になっています。(見つけ出すのが大変でした)
Tools > Debug > Modules
(出たり、出なかったりします。出なかった時はプロジェクトを開きなおすと出ます(?))

Tools > Debug > Modulesに移動

Output Logのcmdからmoduleに関するコマンドを入力することもできます
・module list
 moduleのリストを表示する
・module load modulename
 moduleをロードする
・module unload modulename
 moduleをアンロードする
・module recompile modulename
    moduleをリコンパイルする

8章 P.167 実行するボタンはWindowメニューにある

ツールバーにボタンを追加することが出来る[Editor Toolbar Button]テンプレートですが、UE5 EAでは[Window]メニューの一番下に追加されます。

UE5 EAでは[Window]メニューの一番下に追加される

9章 P.173 OpenCVのバージョンが違う

OpenCVのバージョンの最新版が4.5.4(2021/12/27)になっていました。(書籍だと3.3.1)
ソースコードで.libと.dllのファイル名をダウンロードしたバージョンのファイル名に修正する必要があります。

インストール(OpenCVのライブラリを解凍する処理)の手順です

Windowsをクリック

exeファイルがダウンロードされるので、ダブルクリックして実行します。
展開する場所を指定して、Extractボタンをクリックします。

展開する場所を指定 > Extract
展開される

10章 P.212~P.214 コンテンツブラウザにMeshEdit Contentが表示されない時の対処

8章でも使用した[Editor Toolbar Button]テンプレートですが、デフォルトの状態では、コンテンツブラウザにプラグインのフォルダが表示されません。メッシュやマテリアルをコンテンツに追加するには.upluginファイルを修正する必要があります。

MeshEdit.uplugin

{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "MeshEdit",
	"Description": "MeshEdit Sample",
	"Category": "Other",
	"CreatedBy": "posita33",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"CanContainContent": true,
	"IsBetaVersion": true,
	"IsExperimentalVersion": false,
	"Installed": false,
	"Modules": [
		{
			"Name": "MeshEdit",
			"Type": "Editor",
			"LoadingPhase": "Default"
		}
	],
	"Plugins": [
		{
			"Name": "ProceduralMeshComponent",
			"Enabled": true
		}
	]
}

CanContainContentをtrueに設定して、再コンパイルし、プロジェクトを開きなおすと、コンテンツブラウザからプラグインにコンテンツを追加することが出来るようになります。

"CanContainContent": true,
CanContainContentをtrueにすると、
コンテンツブラウザにプラグインのContentフォルダが表示される

まとめ

書籍のソースコードの説明が1行1行丁寧に書かれていたので、Unreal EngineのC++を学習するには大変勉強になりました。ソースコード自体はUE5 EAで動作したので、UE4の知識が活かせることに安心できました。

UE4(4.18)で学習する書籍なので、UE5 EAでUIやメニューの位置が変わったことや、Visual Studioのバージョンや操作が変わったことで躓くところが多かったです。
UE5の正式版が出たタイミングでもう一度変更がないか確認して修正します。

注意)書籍のページ数をカットするために手順が省かれていたので、手順を補完する知識が求められます。

プラグイン作成やUnreal EngineのC++の学習に役に立ちそうな情報

学習している際に分からなかったところを色々と調べていた際に有益な情報がありましたので、メモとして残しました。

【Unreal EngineのC++ YouTube】

C++の構造体作成について
C++の基本的な操作を紹介してくれるチャンネルがあって助かりました。

【公式オンラインラーニング】

オンラインラーニングにプラグインの作成のチュートリアルが提供されていました。

【公式ドキュメント】

C++の書き方やプラグインについての公式ドキュメントです。


いいなと思ったら応援しよう!