BLOGブログ

2016.03.04UE4UE/ C++

[UE4] Unityビルドシステム

改訂バージョン: Unreal Engine 4.21

今回は、UE4のC++ビルドシステムのオプションの1つである、Unityビルドシステムについてご紹介します。
某ゲームエンジンとは全くの無関係です。あくまでUE4のお話です。

また、C++についての知識を前提とした、プログラマ向けの内容になりますので、ご了承下さい。

 

今回の説明には、公式サンプルの1つであるShooterGameプロジェクトを使用します。
UE4公開初期からある、C++コードを使用したプロジェクトです。

 

まずは、さくっとこのプロジェクトをビルドしてみて下さい。
構成はデフォルトのまま、「Development Editor」でOKです。

ココで、ビルドログを確認します。

こんな感じでビルドログが流れて、ShooterGameモジュールがビルドされているのが分かるかと思います。

 

ココで、1つ疑問が出てきます。
上記のログは、各C++ソースコードのコンパイルから、dllの生成までのログです。
しかし、ShooterGameプロジェクトに含まれている、多数のソースコードをコンパイルしている形跡がありません。

 

実は、ログのなかにある「Module.ShooterGame.cpp」に、このモジュール内の全てのcppファイルが含まれているのです。

 

どういうことなのか、確認してみます。下記のフォルダを覗いてみて下さい。

ShooterGame/Intermediate/Build/Win64/UE4Editor/Development/ShooterGame

ココは、ビルドのための中間ファイルが保存されるフォルダです。リンク前のobjファイルもココに配置されています。

先ほどのビルドログに出ていた「Module.ShooterGame.cpp」も見つかりました。
早速、中身を見てみます。

ハイ、なかなかに恐ろしいですね。コレがUnityビルドシステムです。

リンク時間の短縮などの目的で、モジュール内のソースコードを全てincludeして、まとめてコンパイルしているそうです。

 

1つのモジュール内のソースコードが多い場合には、いくつかに分割されるようです。
UE4本体のソースコードをビルドした事があれば、ビルドログから下記のようなファイル名を見たことがあるかと思います。

Module.Core.1_of_7.cpp
Module.Core.2_of_7.cpp

 

UE4のC++ビルドでは、デフォルトでUnityビルドが有効になっています。
そのため稀に事故が起きてしまう場合もあります。

  • 必要なincludeを記述していないのに、コンパイルが通ってしまう
  • 無名ネームスペース内で定義した変数名や関数名が衝突する
  • 特定のコード内でしか使用しないつもりのマクロが、他のコード中でも反映されてしまう

といった場合には、ココを疑ってみても良いかもしれません。

 

Unityビルドは、必要であれば無効化することも出来ます。

その場合には、モジュールの .Target.cs に以下のように記述します。

この状態でビルドし、ビルドログや先ほどの中間ファイルの保存先を見てみると、各cppファイルが個別にコンパイルされていることが分かると思います。

 

下記のように書けば、DebugGame構成でのみUnityビルドを無効化する、といったことも出来ます。

Unityビルドが有効な場合、リンク時間が短縮される代わりに、少しの編集でもコンパイル時間が長くかかってしまうことになります。
状況に応じて使い分けると、少し快適に開発が出来るようになるかもしれません。