🛠️

UE5 ソースから Installed Build した Engine を共有する

2024/07/21に公開

はじめに

こんにちは。
今回はソースビルドした Unreal Engine をチームメンバーで共有する方法について記載します。

エンジンビルドの必要性

通常 Unreal Engine は Epic Game Launcher からインストールして使うようになっています。
大抵の開発ではそのままのエンジンを使っていても問題はないと思います。

ただ Epic さんはエンジンのソースコードをすべて公開していて、これを直接ビルドして使用する事もできるようになっています。
これには以下のようなメリットがあります。

  • エンジンを改造して使える (Shading Model の拡張なども可能)
  • エンジンの不具合を修正できる
  • Epic さんが日々更新している最新の変更をすぐに取り込める
  • エンジンを特定バージョンに固定して使い続ける事ができる
  • エンジンプラグインをビルドに含められるので各メンバーでのインストールの手間が省ける

こうした目的のためにエンジンを改造して使うためには、そのビルドしたカスタムなエンジンをチームメンバーで共有する必要が出てきます。
今回の記事は Git や SVN を使う環境でカスタムエンジンを共有する方法についてを紹介します。

ちなみに Perforce をお使いの場合は UnrealGameSync というツールで共有する方法もあるようです。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/unreal-game-sync-ugs-for-unreal-engine

エンジンのビルド方法

ではエンジンのビルド方法について記載します。
大体は公式ドキュメントのとおりにビルドしていく流れになります。

Visual Studio の準備

Visual Studio の環境が整っていない場合は下記ページを参考に環境を整えましょう。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/setting-up-visual-studio-development-environment-for-cplusplus-projects-in-unreal-engine
なおページにも記載があるとおり UE 5.4 からは Visual Studio 2022 必須 となっています。
これ以降のバージョンは VS 2019 だとビルドできないので注意してください。

ソースコードの入手

Engine のソースコードの入手方法については公式ページの手順を参照してください。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/downloading-unreal-engine-source-code

なおこのページには「Visual Studio 2019 をインストールします」と記載がありますが前項に書いたように UE 5.4 以降は VS 2019 ではビルドできません。
Visual Studio 2022 を使用するようにしましょう。

GitHub にアクセスできたらお好みのブランチからソースを Fork や Clone あるいは zip でダウンロードします。
公式では release ブランチを推すような記載になっていますが release は常に最新バージョンに更新されていくので、バージョンを固定したい場合は Tags から 5.4.2-release 等のお好みのバージョンの Tag を Clone すると良いです。

ソースを入手したら Setup.bat も忘れずに行いましょう。

ちなみにこのソースビルド環境を他のメンバーと共有する場合は開発中のプロジェクトとは別のリポジトリで管理すると良いです。
プロジェクト内に配置すると容量が大きいのでソース管理ツールの動作が重くなり悲しい事態になります。(特に SourceTree はひどく重くなる)

また別リポジトリで管理していれば他のプロジェクトとも同じエンジンを共有する事ができるようになるので便利です。

Visual Studio で ビルド

ソースを入手し Setup.bat の実行が終わったらこちらの公式ページの手順を参照してビルドを行いましょう。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/building-unreal-engine-from-source

ビルドが成功すれば Engine/ 配下にビルドされたエンジンが出来上がります。
このエンジンはそのまま使えますので個人開発の場合はこれをを直接使うのが良いと思います。

チーム開発の際でもエンジン改造を行うメンバーは改造作業中にこのエンジンを直接使う場面が出てくると思います。
その場合は後述の エンジンパスを登録するツール を使うと同じ Engine Association でエンジンパスを登録できるので便利です。

エンジンプラグインの追加

たとえば Visual Strudio Integration Tool などのエンジンプラグインは通常は Epic Game Launcher から各エンジンにインストールしますが、ソースビルドエンジンの場合は Engine/Plugins の中にプラグインのソースを配置してエンジンをビルドする事でインストールできるようになっています。
こうする事で各メンバーがいちいち Launcher からインストールの操作を行わずにプラグインが利用可能になるので便利です。
インストール方法などは各エンジンプラグインの Readme 等を参照してください。

Installed Build って?

Installed Build は配布用のエンジンをビルドするための仕組みです。
Installed Build でビルドすると Epic Game Launcher でインストールしているものと似たようなコンパクトなエンジンが出来上がります。(と言っても 100 GB 以上ありますが)

ビルド環境がなかったりエンジンソースを触る必要のないメンバーには Installed Build を作成して配布すると良いでしょう。

公式ドキュメントはこちらです。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/using-an-installed-build-of-unreal-engine

Installed Build を作成する

ではいよいよ配布用の Installed Build を作成しましょう。
とはいっても先ほどの公式サイトに記載のあるコマンドを実行するだけです。

ターゲットプラットフォームやコンフィギュレーションをコマンドのオプションに設定します。
オプション設定が結構多いのでエンジンビルドの度にコマンドを手打ちすると間違えそうです。
下記のようなバッチをコンフィグ毎に作成しておくと良いと思います。

MakeInstalledBuild.bat
cd Engine/Build/BatchFiles/
RunUAT.bat BuildGraph -script=Engine/Build/InstalledEngineBuild.xml -target="Make Installed Build Win64" -nosign -set:GameConfigurations=Development;Shipping -set:WithWin64=true -set:WithAndroid=false -set:WithDDC=false -set:WithLinux=false -set:WithLinuxArm64=false -set:WithIOS=false -set:WithTVOS=false -set:WithMac=false -clean

ビルドには数時間かかるので気長に待ちましょう。私の環境では 6 時間ちょっとかかりました。
コマンド実行後は LocalBuilds/ 配下にビルドしたエンジンが出来上がります。
これを Zip などで圧縮してチームメンバーに配布します。

Zip 圧縮をする前に後述の エンジンパスを登録するツール も同梱しておくと良いです。

Engine Association について

Switch Unreal Version で使用可能、だけど・・・

さてここまでで Visual Studio でビルドしたエンジン と Zip 配布する Installed Build のエンジン の 2 通りのエンジンが使用可能になりました。
これらのエンジンをプロジェクトから使う手順はどちらの場合も同じで、使用するプロジェクトの .uproject の右クリックメニュー Switch Unreal Version を選択し、エンジンが置かれたパスを指定するだけです。
そうすると .uproject の中に記載されている 'Engine Association' に適当な ID が設定され、(windowsであれば)レジストリにその Engine Association とエンジンへのパスが登録されます。
これでこのプロジェクトがビルドしたエンジンを使用できるようになりました!

・・・なのですが。
こうして各メンバーごとに Switch Unreal Version を行うとそれぞれが適当な Engine Association を生成してしまうので .uproject に差分が出てしまいます。
これをコミットするわけにもいかないし、かといってバージョン管理外にする事もできません。かゆい。

固定のパスに配置する事でも一応解決できる

この問題を回避する方法として .uproject からの相対パスに Engine を配置するという方法があり、公式の InstalledBuild のページにはこんなふうに説明されています。

.uproject ファイル内の「EngineAssociation」フィールドでは、プロジェクトを開くエンジンのバージョンを指定します。非外部プロジェクトの場合、必然的にプロジェクトのディレクトリ階層からの (既知の) 相対位置にエディタが存在するため、このフィールドは空白になります。

ちょっと分かりにくいですが、この相対位置というのは .uproject の親階層にある Engine/ フォルダ を指しています。
そこに設置した Engine を使用した場合 EngineAssociation は空欄になるため、チームメンバー毎に .uproject が更新される事はないというわけです。

・・でもその場所にエンジンを配置するというのにはちょっとしたデメリットがあります。

  • エンジンの配置場所が自由に選べない
  • .uproject の親階層がリポジトリ内の場合は邪魔になる
  • 複数のプロジェクトで同じエンジンを共有するのが難しい

Engine フォルダを ignore したり各プロジェクトの配置を工夫したりすれば何とか解決はできますが、特に .uproject がリポジトリルートではないプロジェクトと混在する場合はなかなか厄介な制約になってきます。

そこで登場するのが エンジンパスを登録するツール です。

エンジンパスを登録するツール

このツールを使うことで任意のパスに置いたエンジンを同じ Engine Association 値で扱えるようになります。
ツールといっても大げさなものではなく単純にレジストリ登録を行うだけのシェルスクリプトです。

RegisterEnginePath.sh
#!/bin/bash
#
# Unreal Engine パスを指定のキーで登録するスクリプト
#
# 登録するエンジンの相対パスを EngineRelativePath に設定し、
# EngineAssociation にエンジンを共有する .uproject の EngineAssociation の値を設定して使用してください。
#

# engine フォルダの相対パス
EngineRelativePath="./"

# 登録キー ( .uproject の EngineAssociation )
EngineAssociation="{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}"

RegKeyPath="HKCU\SOFTWARE\Epic Games\Unreal Engine\Builds"

echo "RegisterEnginePath start."

# posix パスを windows パスに変換
EngineFullPath=$(cd ${EngineRelativePath} && pwd)
DriveLetter=$(echo "$EngineFullPath" | cut -d '/' -f 2 )
WinPath=$(echo "$EngineFullPath" | cut -d '/' -f 3- )
WinPath="${DriveLetter^^}:/${WinPath}"
WinPath="$WinPath" | iconv -f UTF-8 -t CP932

echo "Engine path : $WinPath"

# registry キー新規登録
reg query "$RegKeyPath" > /dev/null 2>&1
if [ $? -ne 0 ]; then
	reg add "$RegKeyPath" > /dev/null 2>&1
	if [ $? -ne 0 ]; then
		echo "Failed to reg add. key :$RegKeyPath"
	exit 1
	fi
fi

# registry キー配下の値名にパスを設定
reg add "$RegKeyPath" -v "$EngineAssociation" -t REG_SZ -d "$WinPath" -f 
#  > /dev/null 2>&1
if [ $? -ne 0 ]; then
	echo "Failed to reg add. key :$RegKeyPath\\$EngineAssociation value: $WinPath"
	exit 1
fi	

echo "Successfully reg add. key :$RegKeyPath\\$EngineAssociation value: $WinPath"

まずツールの準備として以下の設定を行います。

  1. ツール内の EngineAssociation 変数の値を .uproject で生成された値に書き換える。
  2. ツールを置く場所を決め Engine/ フォルダの親階層へのパスを EngineRelativePath 変数に設定する

設定が終わったらこのツールを Installed Build の Zip に同梱、あるいはエンジンビルド環境にコミットしておきましょう。

あとは各メンバーが配布されたエンジンを好きな場所に配置した後でこの shell を実行するだけです。
これでメンバー全員と同じ Engine Association でこのエンジンのパスが登録されるので、.uproject を更新する事なく配布したエンジンが使えるようになります!

Engineというフォルダ名だと認識されない

なおこの EngineAssociation を共有する方法を使う際、配布した Installed Build のフォルダ名を Engine にするとうまく行かないという現象に遭遇しました。
具体的には Zip 配布したルートを Engine という名称で配置、つまりエンジン本体が Engine/Engine/ というパスになっている場合、そのパスがレジストリに正しく登録されていてもなぜか .uproject 起動時にエンジンを認識してくれずバージョン選択を迫られるという症状です。
これについてはいまのところ原因は分かっていません。機会があれば深堀りしてみたいと思います。

ひとまずは Installed Build を配布するとき
「設置する際には Engine というフォルダ名を使用しないでください」
などと開発メンバーにアナウンスして解決することにしました。

ビルドエラーについて

UE 5.4.2 のビルド中に遭遇したエラーについての情報はこちらの記事にまとめました。
エラー回避の参考になれば幸いです。

https://zenn.dev/piteki/articles/piteki-ue-engine-builderror-5_4

おわりに

今回は Installed Build をチームで共有する方法をご紹介しました。
カスタムなエンジンを共有する際の一例として参考にしていただけたらと思います。
もっと良い方法などがあれば是非お知らせいただけるとうれしいです。

Discussion