Amazon Web Services ブログ

Apple Vision Pro向けUnityアプリをAWS上でビルドする

はじめに

技術の進歩が進む中で、次のイノベーションの重要な要素としてSpatial Computingがあげられます。ゲーム、メディア、製造業や建築業に至るまで様々な業界の企業がSpatial Computingの導入や活用に取り組んでいます。最近のSpatial Computing領域での最も大きなニュースはAppleからVision Proが発売されたことでしょう。Vision Proを利用することでSpatial Computingの世界で、より直感的なインタラクティブかつ没入的な体験をすることが可能になります。

Amazon Web Services(AWS)ではSpatial Computingに関連した施策としてNVIDIA Omniverseの活用や、Visual Assets Management System(VAMS)などの取り組みがありますが、本記事ではVision Pro向けUnityアプリケーションのビルド方法について解説していきます。

AWSを利用したビルドパイプライン

以前の記事で、UnityモバイルアプリのビルドパイプラインをAWS上に実装する方法を、実際にデプロイできるコードとともに紹介しました: Unityモバイルアプリのビルドパイプラインを実装する

元記事からの再掲にはなりますが、AWSでビルドパイプラインを構築する利点は以下のとおりです:

  • レジリエンス: AWS上のビルドパイプラインは耐障害性が高く、無停止で動き続けることができます。
  • スケーラビリティ: 開発のフェーズに合わせてキャパシティを柔軟に調整できます。
  • セキュリティ: AWSでは多くのセキュリティサービスが利用でき、パイプラインに統合することでシステムの信頼性を高め、お客様の制作物を保護します。

Vision Proのアプリケーション開発においても、安定したビルドパイプラインの存在は重要でしょう。iOSアプリビルドの環境はVision Proアプリのビルドにも利用できるため、本記事でも上記記事のパイプライン実装をそのまま利用することができます。

アーキテクチャ

あらためて、今回のビルドパイプラインのアーキテクチャをおさらいしましょう。GitHub に本アーキテクチャを実装したサンプルを公開しています: Unity Build Pipeline with Jenkins and EC2 Mac

このサンプルには以下が含まれます:

  • ECS Fargate 上の Jenkins マスター
  • EC2 Linux spot インスタンスと EC2 Mac インスタンス上の Jenkins エージェント
  • Linux 上では Docker エージェントも利用可能
  • EC2 Linux 上 の Unity Accelerator (オプショナル)
  • ビルドキャッシュをスポットインスタンス間で共有する仕組み (記事を参照)
  • AWS CDK による自動化されたデプロイ

上記はご利用の AWS アカウントにデプロイしてすぐに試せるようになっていますので、ぜひご確認ください。

またUnityビルドにおいて必要となることも多い、Unity のフローティングライセンス管理サーバーを AWS 上に構築するIaC実装も合わせて公開しています。こちらも合わせてご確認ください: Unity Build Server with AWS CDK

実際にビルドしてみよう

それでは上記のアーキテクチャを利用してVision Proアプリケーションをビルドする手順を簡単に紹介します。

なお、ビルドパイプラインは構築できているものとしますが、構築のための詳細な方法はこちらをご参照ください: ビルドパイプラインのCDKプロジェクトのデプロイ手順。AWS CDKを利用してデプロイでき、2〜3個のCLIコマンド実行だけでデプロイが完了します。

今回は、ビルド対象のVisionOSプロジェクト例として、こちらを利用します: aws-samples/unity-vision-os-sample-app

上記をローカルに git clone し、Unityでプロジェクトを開くと、以下のようなプロジェクトであることが分かります。

今回のJenkinsパイプラインでは、以下の手順でビルドします:

  1. EC2 Linux (spot)上のUnityでUnityプロジェクトからXcodeプロジェクトを生成する
  2. 1のプロジェクトをS3にコピー
  3. EC2 Mac上に2をコピーし、Xcodeでビルドする

まず、1の準備をします。Unityを含むコンテナイメージとして、game-ci/dockerが利用可能です。しかしながら、2024年7月現在において、VisionOS向けのモジュールを含むイメージはDocker Hubに公開されていません。このワークアラウンドとして、自分でイメージをビルドし、Amazon ECRレポジトリにイメージをプッシュすることができます。下記はイメージをビルドするためのコマンド例です:

git clone https://github.com/game-ci/docker.git
cd docker/images/ubuntu/editor
# Unityのversionは適宜変更してください
docker build --build-arg="module=visionos" --build-arg="version=2022.3.31f1" --platform linux/amd64 .

イメージがビルドできたら、ECRレポジトリにプッシュしましょう。上記のCDKプロジェクト内でレポジトリを作成するため、そのレポジトリにプッシュすることをお勧めします。Jenkinsからイメージを利用するために必要なクレデンシャルも、そのレポジトリ向けにすでに設定されているためです。

また、3のためにEC2 Macをセットアップする必要があります。具体的には、以下の操作です:

  • Xcodeのインストール
  • provisioning profileや証明書の設定

EC2 MacにはVNC経由で接続でき、通常のMac端末と同じGUIで操作することが可能です。EC2 Macインスタンスに接続するための手順は、こちらを参照してください: EC2 Macインスタンスのセットアップ。provisioning profileなどの設定は会社により方法が異なると思われるため、本手順では割愛します。検証用の手順としては、こちらが参考になるかもしれません: AWS Game tech workshop

これで準備ができました。あとはJenkinsのGUIからパイプラインを作成するだけです。サンプルのJenkinsfileは先程のリポジトリに同梱されています: aws-samples/unity-vision-os-sample-app

ポイントは以下のとおりです:

  • カスタムのgame-ciコンテナイメージを利用: 以下のagentブロックで、先ほどビルドしたコンテナイメージを参照しています。registryCredentialsId$ECR_REPOSITORY_URL などは、CDKデプロイ時に設定された値です。
agent {
    docker {
        label 'linux'
        image "${ECR_REPOSITORY_URL}:latest"
        args '-u 0 --entrypoint= '
        registryCredentialsId "ecr:${AWS_REGION}:ecr-role"
        registryUrl "$ECR_REGISTRY_URL"
    }
}
  • UnityのビルドターゲットをVisionOSに設定: executeMethodによるビルド実行時に、ターゲットをVisionOSに設定しています
unity-editor \
    -quit \
    -batchmode \
    -nographics \
    -executeMethod ExportTool.ExportXcodeProject \
    -projectPath "./"
  • XcodeのSDKをVisionOSに設定: xcodebuildコマンド呼び出し時に -sdk xros オプションを指定します
xcodebuild -scheme Unity-VisionOS -sdk xros ...

公開されたリポジトリを使って、下図のように直接Jenkinsパイプラインを試すこともできます:

ビルドが完了したら、Jenkinsからアーティファクトをダウンロードして確認することができます。

なお、今回はスケーラビリティやコスト効率のためにEC2 Linux スポットインスタンスを活用していますが、より小規模なワークロードなどでは、EC2 Macのみ使うこともできます。EC2 Mac上にUnityエディタをインストールし、Xcodeプロジェクトの生成からビルドまで完結させる方法です。どの種類のEC2インスタンスをJenkinsエージェントとしてデプロイするかは、bin/jenkins-unity-build.ts から設定できますので、そちらもご確認ください。

まとめ

この記事では、EC2 MacやEC2 Linuxスポットインスタンスを利用したJenkinsパイプラインを構築し、Vision OSアプリケーションをビルドする方法を紹介しました。本方法により、パイプラインのリジリエンス・スケーラビリティ・セキュリティを高く実現することができます。いくつかの簡単なコマンドを実行するだけで本パイプラインをデプロイできるようになっているので、ぜひお試しください。