経緯
Visual Studio 2019 での開発中、突如不具合を引き起こした。
画像左が正常な挙動、右が不具合が起きたときの挙動。
等高線のような黒い帯が出て、遠景の山がおかしな形になっているのがわかる。
このとき、地形に関するコードやマテリアル等は一切弄っていなかった。
これの原因は、時折行われるIDEのアップデートを何気なくしていた行為でした。
一般的なプログラマーなら「特定の環境から変えない」のが一番安全だが、やってしまったものは仕方がない。戻せばよい。そう思っていた。
しかし、Visual Studio のアップデートは(原則)元に戻せないという事実が発覚。 Visual Studio Installer でもマイナーバージョンレベルでは戻せるようだがビルド番号までは戻せなかった。
調べていくと、UE4のツールチェイン(ビルドに必要なコンパイラやリンカ一式を扱うもの)の選択で固定できれば、突然挙動不審になることもない、ということがわかった。
本題
ということで、ツールチェイン(※)を明示的に指定してコンパイラのバージョンを固定させる方法を紹介します。
※ Visual Studio では「ビルドツール」という名称になります。以降ビルドツールと呼びます。
上記経緯と同等のバグ報告と、回避策が下記リンクに記載されていますが、補足を含め、別の回避策も合わせて紹介します。
https://developercommunity.visualstudio.com/content/problem/734585/msvc-142328019-compilation-bug.html
基本説明と主旨
UE4 での(Windows 上での)C++開発(UBT)では、Visual Studio (以降VS) 2017、VS2019、VSCode のいずれかを利用しますが、執筆現在、 VS2017 と VSCode はビルドツールは VS2017 用のもの(UE4 で決まったバージョン)を使用し、 VS2019 では、原則最新のビルドツールを使用します。
最新版のものを使用している場合、執筆時点でのビルドツールのバージョンは 14.23.28105 でした。
このバージョンで不具合が起きているので、インストール可能な前のバージョン、 14.22.27905 を使用します。
また、UE4.22.3での内容です。
手順
1.使用するビルドツールのインストール
Visual Studio Installer を起動し、個別のコンポーネントから「MSVC v142 - VS 2019 C++ x64/x86 ビルド ツール (v14.22)」を選択し、インストールします。
インストールが終わると、 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC
(※)に、ディレクトリ名がバージョンの名前(執筆時点で 14.22.27905)でビルドツール一式が配置されます。ビルドツールの選択にはこのバージョン名を使用します(以下追記参照)。最新のバージョンの方も置かれていて複数あるはずなのでよく確認してください。
※ Visual Studio のエディションでパスが若干異なるはずなので適時読みかえてください。
1.a (追記)ビルドツールのバージョンについて
UE4.24(4.23は未確認)では、ディレクトリ名ではなく実際のツールにあるバージョンを参照するらしく、ディレクトリ名のバージョン表記と異なります(リビジョン番号がほんのちょっと違う)。
確認方法は対象ディレクトリ内にある bin フォルダ内以下のいずれかにある実行ファイルのツールチップに記載されたファイルバージョン、もしくはプロパティを開いて詳細タブ内で確認できます。
2.使用するビルドツールの指定
指定方法は2種類あります。
2.a.環境(ユーザー)ごとに指定する
プロジェクト内のファイルをいじらずにデフォルトのビルドツールとして指定する場合です。
%AppData%\Roaming\Unreal Engine\UnrealBuildTool
に、 BuildConfiguration.xml という、初期状態では内容が特に記載されていない xml ファイルがあります。
これを以下のように書き加えます。
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
<WindowsPlatform>
<Compiler>VisualStudio2019</Compiler>
<CompilerVersion>14.22.27905</CompilerVersion>
</WindowsPlatform>
</Configuration>
Compiler
タグには使用するIDE名を半角スペースなしで記入してください。CompilerVersion
タグには使用するビルドツールのフルバージョン名を半角で記入してください。
Compiler
タグがないと VS2019 上でビルドする際、v14.22は古いバージョンである=VS2017用と認識されてしまい、「VS2017のプロジェクトファイルじゃないとダメ」的なエラーを吐かれてしまいます。
2.b.プロジェクトごとに指定する
Target.cs ファイルに記述することでビルドツールを指定する方法があります。
複数人で開発するプロジェクトで有効な方法です。
using UnrealBuildTool;
using System.Collections.Generic;
public class ProjectNameTarget : TargetRules
{
public ProjectNameTarget(TargetInfo Target) : base(Target)
{
// - 中略 - //
WindowsPlatform.CompilerVersion = "14.22.27905";
}
}
※(ProjectName).Target.cs 、(ProjectName)Editor.Target.cs 双方に記述する必要があります。
3.リビルドする
後はリビルドするだけで、指定したビルドツールで実行されます。
以降はこの設定が有効である間は使われ続けます。