こんにちは。情熱開発部 プログラム1課の角谷瑠晟です!
最近突然肌寒くなってきて大変ですね。
気温の変化にも適応して平穏に生活を送りたいものです。
さて、話は変わりますが今回のブログはビルドイベントというものについて説明していきます。
特にUnrealEngineのビルドイベントの追加方法に癖があり分かり辛いと思うのでUnrealEngineでのビルドイベントについてを重点的に説明していこうと思います。
※各バージョンは以下となります。
UE:5.4.4
VisualStudio:2022
ビルドイベントとは
まず、初めにですが、ビルドイベントというものを知っているでしょうか?
VisualStudioの設定ではビルド前イベント、リンク前イベント、ビルド後イベントの三つがあります。
こちらは名前の通りビルドを行う直前や終わった直後に別の処理を実行する事が出来るイベントとなります。
ビルドイベントを設定する事でビルド後に作成された実行ファイルを特定の場所にコピーする事が出来たりととても便利です。
今回はよく使うであろうビルド前イベントとビルド後イベントに焦点を当てて説明させていただきます。
VisualStudioで作成したC++のプロジェクトではプロパティページから以下のように設定する事が可能です。
コマンドラインと書いている場所にbatの呼び出し処理等を記述するだけで、ビルド前やビルド後に特定の処理を行わせるといった事が可能です。
例えばビルド前にソリューションのディレクトリにあるtest.batを起動しようとした場合は以下のように入力すれば大丈夫です。
とても簡単ですね!
UnrealEngineでビルドイベントを追加しよう
上記でビルドイベントについてとVisualStudioでの設定方法は理解できたと思います。
では、UnrealEngineでもVisualStudioのソリューションを作成してビルドイベントを追加してみましょう。
UnrealEngineのプロジェクト作成時にC++を選択するとソリューションファイルが作成されます。
出来たソリューションファイルを選択してVisualStudioでプロジェクトのプロパティを開いてみましょう。
以下のようなページが開くはずです。
VisualStudioで作成したプロジェクトと違ってビルドイベントの項目がないことに気づくかと思います。
UnrealEngineで作成されたVisualStudioのプロジェクトはある程度自動で生成されるので変更できる項目が少なくなってしまいます。
では、どうすればいいのでしょうか?
次こそ実際にUnrealEngineで作成したプロジェクトにビルドイベントを追加してみましょう。
次こそUnrealEngineにビルドイベントを追加する
上記でUnrealEngineのプロジェクトのプロパティを開いてビルドイベントが追加出来ないことが分かりました。
ここからは実際にUnrealEngineでのビルドイベントの追加の仕方を解説していきます。
UnrealEngineのプロジェクトを作成した場所に.uprojectファイルが生成されていると思います。
このプロジェクトファイルをテキストエディタを使用して開いてみましょう。
{
"FileVersion": 3,
"EngineAssociation": "5.4",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "MyProject",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
}
]
}
上記のようにエンジンのバージョン、使用するモジュールやPluginsの情報が書いていると思います。
Pluginsの後ろに以下のような記述を追加します。
{
"FileVersion": 3,
"EngineAssociation": "5.4",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "MyProject",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
}
],
"PreBuildSteps":{
"Win64": [
"echo start logicalbeat!"
]
},
"PostBuildSteps":{
"Win64": [
"echo end logicalbeat!"
]
}
}
この状態でソリューションを開いてビルドを実行してみましょう!
すると以下のように出力結果に「start logicalbeat!」と「end logicalbeat!」が表示されるのが確認出来ると思います。
ビルドを開始しました...
1>------ ビルドのスキップ: プロジェクト: UE5, 構成: BuiltWithUnrealBuildTool Win64 ------
1>プロジェクトはこのソリューション構成に対してビルドするように選択されていません。
2>------ ビルド開始: プロジェクト: Test, 構成: DebugGame_Editor x64 ------
3>------ ビルド開始: プロジェクト: UE5ProgramRules, 構成: Development Any CPU ------
2>Using bundled DotNet SDK version: 6.0.302
2>Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" TestEditor Win64 DebugGame -Project="F:\Blog\Test\Test.uproject" -WaitMutex -FromMsBuild -architecture=x64
2>Log file: C:\Users\AppData\Local\UnrealBuildTool\Log.txt
2>Creating makefile for TestEditor (.uproject file is newer)
3>UE5ProgramRules -> C:\Program Files\Epic Games\UE_5.4\Engine\Intermediate\Build\BuildRulesProjects\UE5ProgramRules\bin\Development\UE5ProgramRules.dll
4>------ ビルド開始: プロジェクト: TestModuleRules, 構成: Development Any CPU ------
4>TestModuleRules -> $(UEProjectPath)Intermediate\Build\BuildRulesProjects\TestModuleRules\bin\Development\TestModuleRules.dll
2>start logicalbeat!
2>Building TestEditor...
2>Using Visual Studio 2022 14.37.32825 toolchain (C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.37.32822) and Windows 10.0.19041.0 SDK (C:\Program Files (x86)\Windows Kits\10).
2>[Adaptive Build] Excluded from TextureImport unity file: TextureImport.cpp
2>Determining max actions to execute in parallel (8 physical cores, 16 logical cores)
2> Executing up to 8 processes, one per physical core
2>Using Parallel executor to run 1 action(s)
2>------ Building 1 action(s) started ------
2>[1/1] cmd Executing post build script (PostBuild-1.bat)
2>end logicalbeat!
2>Total time in Parallel executor: 0.08 seconds
2>Total execution time: 2.26 seconds
========== ビルド: 成功 3、失敗 0、最新の状態 46、スキップ 1 ==========
========== ビルド は 20:54 に開始され、02.997 秒 かかりました ==========
実際に出力ログを見るとビルドが始まる前とビルドが終わった後に実行されているのが確認出来ますね。
処理も1行しか書けないわけでもなくまた、batファイルの呼び出しも行えます。
以下の簡単なbatを用意しました。
echo testbat call
以下のようにPreBuildSteps内の記述を変更します。
"PreBuildSteps":{
"Win64": [
"cd /d %~dp0",
"call ..\\..\\..\\..\\..\\..\\bat\\test.bat",
"echo start logicalbeat!"
]
},
参照パスでbatにアクセスしたい場合上記のようにカレントディレクトリを変更してからbatにアクセスするのが良さそうです。
その際相対参照の基準となるパスは以下のパスとなります。
$(UEProjectPath)\Intermediate\Build\Win64\x64\$(ProjectName)\DebugGame\PreBuild-1.bat
上記バッチファイル内を確認して貰えば分かりますが、uproject内で書いているテキストがこのbatに記述されていると思います。
@echo off
cd /d %~dp0
call ..\..\..\..\..\..\bat\test.bat
echo start logicalbeat!
PreBuildのタイミングでこのbatが自動で生成され実行されているんですね。
ビルドすると問題なくbatも呼び出されるのが確認出来ました。
ビルドを開始しました...
1>------ ビルドのスキップ: プロジェクト: UE5, 構成: BuiltWithUnrealBuildTool Win64 ------
1>プロジェクトはこのソリューション構成に対してビルドするように選択されていません。
2>------ ビルド開始: プロジェクト: Test, 構成: DebugGame_Editor x64 ------
2>Using bundled DotNet SDK version: 6.0.302
2>Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" TestEditor Win64 DebugGame -Project="F:\Blog\Test\Test.uproject" -WaitMutex -FromMsBuild -architecture=x64
2>Log file: C:\Users\AppData\Local\UnrealBuildTool\Log.txt
2>testbat call
2>start logicalbeat!
2>Target is up to date
2>Total execution time: 0.61 seconds
========== ビルド: 成功 1、失敗 0、最新の状態 48、スキップ 1 ==========
========== ビルド は 17:27 に開始され、01.275 秒 かかりました ==========
おまけ
最後の前におまけですが、上記で紹介したuproject内では特定の変数を定義する事で合致した文字列に置換してくれます。
エンジン内を調べたところエンジンのあるディレクトリやプロジェクトのディレクトリ名などが取得できそうです。
"PreBuildSteps":{
"Win64": [
"echo start logicalbeat!",
"echo $(EngineDir)",
"echo $(ProjectDir)",
"echo $(TargetName)",
"echo $(TargetPlatform)",
"echo $(TargetConfiguration)",
"echo $(TargetType)",
"echo $(ProjectFile)"
]
}
上記に変更しビルドした後PreBuild-1.bat内を確認すると以下のようになっています。
@echo off
echo start logicalbeat!
echo C:\Program Files\Epic Games\UE_5.4\Engine
echo D:\Test
echo TestEditor
echo Win64
echo DebugGame
echo Editor
echo D:\Test\Test.uproject
どの設定でビルドされているかが取得出来たりするのは便利ですね!
終わりに
今回は主にUnrealEngineのビルドステップについて説明していきました。
ビルドステップでビルド前にSVNのバージョンを取ってきてテキストを更新する事でROM上のバージョン表記を変化させたり、ビルド後に作成されたexeファイルを他の場所にコピーする事等も出来て便利です。
UnrealEngineでは設定の仕方や呼び出し方法が分かり辛いですが、慣れるとVisualStudioで設定するのと変わりなく使用できると思うので是非活用してみてください!
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。