BLOGブログ

2015.11.05UE4UE/ C++

[UE4] 環境変数を利用してビルドオプションを変更する

今回は、最近発見したちょっと便利な .Build.cs の使用方法をご紹介したいと思います。

プログラマ向けの内容になります。

 

例えば、

  • 新機能の開発中に、全体に共有したくはないけれどバックアップのためにコミットはしておきたい
  • 製品版では必要な機能だけれど、開発中は無効にしておきたい
  • 手元のビルドでは有効にしておきたいが、Jenkinsで共有されるビルドには反映したくない

などといったケースは、ゲーム開発ではよくあることと思います。

 

こういった場合、C++では #ifdef などのプリプロセッサ命令を使うのが一般的です。

通常のC++プロジェクトでの開発ではVisualStudioなどのプロジェクト設定に定義を記述し、目的ごとに構成を用意するところですが、UE4のC++プロジェクトでは基本的には「Development Editor」「Shipping」などの、予め用意された構成を使用することになります。

 

UE4プロジェクトの場合は、プロジェクト設定に記述する代わりに、モジュールの「.Build.cs」ファイルに記述することで、define定義を追加することが出来ます。

「.Build.cs」ファイル内で、「Definitions」という配列変数に要素を追加することで、そのモジュール内で指定したdefineが定義された状態でC++ビルドが実行されます。

.Build.cs 
 Definitions.Add(“MY_LOCAL_TEST”);
.cpp 
#ifdef MY_LOCAL_TEST

 

これだけでは、定義を変更するためには、毎回「.Build.cs」ファイルを書き換える必要があり、それほどのメリットは感じられません。

しかし、「.Build.cs」は単なる設定ファイルではなく、実行されるC#言語のコードです。
つまり、C#言語の機能による動的な変更が可能であるということです。

 

例えば、下記のような使い方が可能です。

 .Build.cs
if(System.Environment.GetEnvironmentVariable(“BUILD_OPTION_XXX”) == “1”)
{
Definitions.Add(“BUILD_XXX”);
}

これで、環境変数によって、目的のビルド環境のみで有効になるようなコードを記述することが出来ます。

他にも、System.Environment.UserName を用いて個人環境のみで有効なデバッグコードを実装したり、外部テキストファイルに独自の設定を記述して読み込み、反映させるようなことも可能です。

 

Jenkins等でバッチビルドする場合には、コンソールコマンドの「set」と組み合わせれば、簡単にビルドを切り替えられるようになります。

ある程度以上の規模のプロジェクトでは、とても便利に使えるテクニックだと思いますので、是非お試し下さい。