関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2016.03.04UE4UE/ C++
改訂バージョン: Unreal Engine 4.21 |
今回は、UE4のC++ビルドシステムのオプションの1つである、Unityビルドシステムについてご紹介します。
某ゲームエンジンとは全くの無関係です。あくまでUE4のお話です。
また、C++についての知識を前提とした、プログラマ向けの内容になりますので、ご了承下さい。
今回の説明には、公式サンプルの1つであるShooterGameプロジェクトを使用します。
UE4公開初期からある、C++コードを使用したプロジェクトです。
まずは、さくっとこのプロジェクトをビルドしてみて下さい。
構成はデフォルトのまま、「Development Editor」でOKです。
ココで、ビルドログを確認します。
1 2 3 4 5 6 7 8 9 10 11 |
[1/11] ShooterGame.rc [2/11] PCLaunch.rc [3/11] SharedPCH.Slate.cpp [4/11] ShooterGameLoadingScreen.cpp [5/11] UE4Editor-ShooterGameLoadingScreen.lib [6/11] UE4Editor-ShooterGameLoadingScreen.dll [7/11] PCH.ShooterGame.cpp [8/11] Module.ShooterGame.gen.cpp [9/11] Module.ShooterGame.cpp [10/11] UE4Editor-ShooterGame.lib [11/11] UE4Editor-ShooterGame.dll |
こんな感じでビルドログが流れて、ShooterGameモジュールがビルドされているのが分かるかと思います。
ココで、1つ疑問が出てきます。
上記のログは、各C++ソースコードのコンパイルから、dllの生成までのログです。
しかし、ShooterGameプロジェクトに含まれている、多数のソースコードをコンパイルしている形跡がありません。
実は、ログのなかにある「Module.ShooterGame.cpp」に、このモジュール内の全てのcppファイルが含まれているのです。
どういうことなのか、確認してみます。下記のフォルダを覗いてみて下さい。
ShooterGame/Intermediate/Build/Win64/UE4Editor/Development/ShooterGame
ココは、ビルドのための中間ファイルが保存されるフォルダです。リンク前のobjファイルもココに配置されています。
先ほどのビルドログに出ていた「Module.ShooterGame.cpp」も見つかりました。
早速、中身を見てみます。
1 2 3 4 5 6 7 8 9 |
// This file is automatically generated at compile-time to include some subset of the user-created cpp files. #include "中略\ShooterGame\Source\ShooterGame\Private\Bots\BTDecorator_HasLoSTo.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Bots\BTTask_FindPickup.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Bots\BTTask_FindPointNearEnemy.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Bots\ShooterAIController.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Bots\ShooterBot.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Effects\ShooterExplosionEffect.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Effects\ShooterImpactEffect.cpp" #include "中略\ShooterGame\Source\ShooterGame\Private\Online\ShooterGame_FreeForAll.cpp" |
ハイ、なかなかに恐ろしいですね。コレがUnityビルドシステムです。
リンク時間の短縮などの目的で、モジュール内のソースコードを全てincludeして、まとめてコンパイルしているそうです。
1つのモジュール内のソースコードが多い場合には、いくつかに分割されるようです。
UE4本体のソースコードをビルドした事があれば、ビルドログから下記のようなファイル名を見たことがあるかと思います。
Module.Core.1_of_7.cpp
Module.Core.2_of_7.cpp
…
UE4のC++ビルドでは、デフォルトでUnityビルドが有効になっています。
そのため稀に事故が起きてしまう場合もあります。
といった場合には、ココを疑ってみても良いかもしれません。
Unityビルドは、必要であれば無効化することも出来ます。
その場合には、モジュールの .Target.cs に以下のように記述します。
1 |
bUseUnityBuild = false; |
この状態でビルドし、ビルドログや先ほどの中間ファイルの保存先を見てみると、各cppファイルが個別にコンパイルされていることが分かると思います。
下記のように書けば、DebugGame構成でのみUnityビルドを無効化する、といったことも出来ます。
1 2 3 4 |
if(Target.Configuration == UnrealTargetConfiguration.DebugGame) { bUseUnityBuild = false; } |
Unityビルドが有効な場合、リンク時間が短縮される代わりに、少しの編集でもコンパイル時間が長くかかってしまうことになります。
状況に応じて使い分けると、少し快適に開発が出来るようになるかもしれません。