Apple の M1 プロセッサが登場したことで、2021 年以降の Mac には iOS デバイスと同じ ARM64 アーキテクチャが使用されています。また、Intel ベースの前世代型 Mac では x86-64 アーキテクチャが使用されています。
Apple では、「Rosetta2」と呼ばれるインストラクション トランスレータを提供してレガシー アプリケーションをサポートしていますが、Apple Arcade では、デベロッパーに対して、両方のアーキテクチャに対する明確なサポートを含む、ゲーム向けの単一のユニバーサル バイナリを提供することを必須としています。こうすることで、両方の世代のハードウェアで最善のパフォーマンスと安定性を引き出すことが可能になります。
このページでは、このレベルのサポートを含む Unreal Engine (UE) プロジェクトをビルドするための以下の情報を提供します。
両アーキテクチャとの Unreal Engine の互換性に関する情報。
両アーキテクチャを別々にサポートする方法。
両アーキテクチャをサポートするユニバーサル バイナリをビルドする方法。
前提条件
このページでの説明や手順では、MacOS で実行する Xcode を使ってプロジェクトをビルドすることを想定しています。先に進む前に、Unreal Automation Tool (UAT) と BuildCookRun コマンドについて十分に理解している必要があります。
互換性に関するメモ
Unreal Editor
2021 年後期の時点で、Unreal Editor では M1 Mac 以降で使用されている ARM64 アーキテクチャをサポートしておらず、その代わりに Rosetta2 トランスレータに依存しています。
Unreal Engine の将来のバージョンでは M1 Mac に対する直接的なサポートを装備する予定ですが、それまでは Unreal Editor を M1 Mac 以降で実行した際に、パフォーマンスに影響が及ぶことがあります。
Unreal Engine プロジェクト
Unreal Editor は現在 Rosetta2 で実行されますが、Unreal Engine では ARM64 のサポートを含むプロジェクトのパッケージ ビルドを出力できます。
ARM64 および x86-64 向けのバイナリを作成する
異なるバイナリを作成する
それぞれのアーキテクチャ向けにバイナリをビルドするには、Unreal Automation Tool の BuildCookRun コマンドを使ってビルドを開始し、ターゲット アーキテクチャを設定する必要があります。
まず、コマンド ラインで Unreal Engine のインストール ディレクトリに移動します。
cd /Users/Current.User/Epic\Games/UE4.27
次に、BuildCookRun
引数を含む「RunUAT.sh
」 を実行してビルドを開始します。
Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project=MyProject -platform=Mac -architecture=arm64 -build -cook -stage -deploy
-architecture=
コマンドを BuildCookRun
に加えることで、どちらのアーキテクチャ向けにビルドするかを指定します。
たとえば、次のコマンドでは ARM64 向けのビルドを作成します。
-architecture=arm64
次のコマンドでは x86 向けのビルドを作成します。
-architecture=x86_64
それぞれのアーキテクチャ向けにプロジェクトを初めてビルドする際は、通常より時間がかかります。その後、クック済みのデータが UAT によってキャッシュされ、それ以降はより短い時間でビルドされます。
x86-64 と ARM64 のバイナリを別々にコンパイルすることで、両方のアーキテクチャをサポートするプロジェクトをビルドできます。その後、ビルドをこれらのバイナリとともにそれぞれ適切なマシンに配布します。ただし、Apple Arcade 向けにはマージされたユニバーサル バイナリを作成する必要があります。また、配布の面ではユニバーサル バイナリのほうがより便利です。
UAT を使用してユニバーサル バイナリを作成する
ユニバーサル バイナリを含むプロジェクトをビルドするには、BuildCookRun
で次をアーキテクチャとして使用します。
-specifiedarchitecture=arm64+x86_64
こうすることで、ARM64 と x86-64 の両方のアーキテクチャをサポートするプロジェクトがビルドされます。これらのビルドをデバイスに配布すると、そのデバイスのアーキテクチャに適切なバイナリが自動的に使用されます。