Immersive Stream For XRをとにかく最短で動かしてみる方法

# はじめに

Google Cloud（以下、GCP）が提供する Immersive Stream For XR をみなさんご存知でしょうか。

2023/02 に[一般提供が開始](https://cloud.google.com/blog/ja/products/networking/immersive-stream-for-xr-is-ga)されたUnrealEngine（以下、UE）を手軽にクラウドレンダリングで利用できるマネージドサービスです。



私が所属する開発チームでは、本サービスを活用した商用サービスの開発、運用について、１年以上協力した実績があり、色々感動したり苦戦したりでナレッジが蓄積しているので、この素晴らしいサービスを改めて紹介したり、開発、運用上で気つけるポイント、tipsなどを紹介していきます。
本サービスがもっと認知、活用されて流行ることを心より願っております（笑）

まず今回は、Immersive Stream For XRの概要ととにかく最短（といっても待ち時間が結構かかる）で動作確認する方法を紹介します。

# Immersive Stream For XR とは

Immersive Stream For XR（以下、is4xr）とは、UEプロジェクトのビルドからインスタンス作成等を全てGCP側で行い、インスタンス作成時に発行されるURLへWEBブラウザでアクセスするとクラウドレンダリングを体験することができます。
クラウドレンダリングとは、高度なグラフィックス処理や計算を端末やアプリではなく、クラウド上のコンピューティングリソースを活用して行う技術です。

このサービスがすごいところは、

**自分で作るとかなり難しいクラウドレンダリング環境をインスタンスをぽちぽと起動するくらいの感覚で手軽にはじめられてしまう。おまけにビルドやバージョンの管理までしてくれる。**

というところだと思います。イメージは以下の通りです。

![is4xr_overview_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/a7c49c69-3164-b3f6-e4d5-e146edeaa846.png)


- UEプロジェクトをGoogle Cloud Storage（以下、GCS）にアップロードするとビルド以降全てGCP側で管理、実行されます
    - ビルドのバージョン管理やインスタンス管理等も行なってくれます
- インスタンスを作成すると一意のURLが発行され、そのままアプリ等のインストール無しにWEBブラウザで体験できます
    - Googleアプリを利用して体験するとARモードも利用できます
- WEBブラウザ上での視点などのカメラ操作が動的にクラウドレンダリングに反映されて画面操作ができます


詳細な仕組みや利用方法なども含めてクイックスタートとしてまとめられていますが、軽い気持ちで試してみようとすると途中で挫折して本サービスの素晴らしさを体験できずに忘れ去られてしまう可能性がある（例えば、windowsPCを持ってない、UnrealEngine動くような性能のPCがない等々）ため、今回はローカルでの作業を極力飛ばして最短で動作確認する方法を紹介します。

https://cloud.google.com/immersive-stream/xr/docs/quickstart


# 事前準備

通常の流れではローカルPCでUEをインストールして、、、となりますが、今回は必要ないので何かしらのPC（windowsでもmacでもよい、低スペックでよい）を準備します。

## Google Cloudの準備

is4xrを動かすためのGCPプロジェクトが必要です。Googleアカウントを使って作成します。既にプロジェクトを持っている場合は不要です。

:::note info
今回の動作確認で少しだけお金かかります
- GCSの料金（$0.02/GB ※今回の動作確認では1GB未満になります）
- is4xrの料金（$1.25/h ※今回の動作確認では1時間程度になります）
:::


### IAMの設定

GCPプロジェクトの作成時に`オーナー`や`編集者`などになっていればそのまま進めます。それ以外の場合、本サービスを使うには、以下のロールを追加します。

- ストレージ管理者（GCS）
- ストリーム管理者（is4xr）

:::note info
どちらも動作確認だけを目的に強い権限をつけているので実運用時には用途に応じて選択するか、カスタムロールを作成して利用するのが望ましいです。
:::


### is4xrサービスの有効化

is4xrはデフォルトでサービスが無効になっているので有効化します。

- GCPメニューの`APIとサービス`から`Immersive Stream for XR API`を有効にします

![is4xr_enable_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/31f6c643-2df0-30c6-d093-52c0a37165b9.png)


### GCSバケットの作成

UEプロジェクトをアップロードするためのバケットを作成します。

- GCPメニューの`Cloud Storage`から、バケットの`作成`をします
- ロケーションタイプを`Region`にしてリージョンを選択します。今回は、`us-central1`を選択します

![gcs_create_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/3254cf2d-5c30-1a8f-9545-85392f2a1471.png)


# 動作確認


[immersive Stream For XR とは](#immersive-stream-for-xr-とは) のイメージで記載したステップに沿って確認します。

## 1. UEプロジェクト作成

GoogleがUEのテンプレートプロジェクトをgithubで公開しているのでダウンロードします。

https://github.com/GoogleCloudPlatform/immersive-stream-for-xr-templates

:::note info
今回はUEの中身には触れずこのプロジェクトをそのままデプロイします。
:::


## 2. GCSへのアップロード

テンプレートプロジェクト内の`Unreal_Template_Project`の中身をまるっとバケットにアップロードします。

![gcs_update_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/29b3a747-e2fe-77dd-d25b-2be013fa1d4c.png)

:::note info
本当は全てアップロードする必要はありませんがここでは簡素化のためにまるごとアップロードしてしまいます。

:::


## 3. コンテンツ作成

### ビルダーの作成（初回のみ）

コンテンツのビルダーを作成します。これにより、以降このビルダーを使ってビルドを実施してバージョンを作成することで継続的な開発が可能となります。

- GCPメニューの`Immersive Stream`から、`コンテンツリソース`を選択します
- コンテンツリソースの作成で先ほど作成したバケットを選択して作成します

![contents_create_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/e92f0624-22be-9715-7f98-4f28fdb334b9.png)


:::note info
1時間弱かかります。
:::

コンテンツリソースのステータスが`Ready`になるまで待ちます

![contents_ready_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/0d7ffe25-5cff-c117-085f-4a04144a02fa.png)

### ビルドバージョンの作成

先ほど作成したビルダーがコンテンツをビルドしてバージョンを作成します。具体的には、GCSバケットにアップロードされたUEプロジェクトをインスタンスで実行するためにビルドする処理を行います。通常Unrealエディタなどでプラットフォーム向けにビルドしますが、それ自体をGCP上で実行するイメージです。
この作成されたバージョンが管理されるため、好きなバージョンを指定してインスタンスを作成して利用するイメージです。

![contents_create_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/862060d9-fc26-c1cd-8f53-c8c6cdbc16a5.png)

:::note info
2-3時間弱かかります。プロジェクトによっては5-6時間かかったりもします。
:::

コンテンツリソースのビルドが完了すると、ビルドステータスにビルド時間が表示され、最新のビルドバージョンも表示されます。

![contents_create_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/2ed14fb3-26eb-25b5-3b5c-969a4952bbab.png)


## 4. インスタンスの作成

ビルドしたバージョンを指定してインスタンスを作成します。
今回はWEBアクセスでの確認のみ行いますのでモードは`3Dのみ`で作成します。

- モード: 3Dのみ
- GPUクラス: NVIDIA T4
- ロケーション: us-central1(capacity 1)

![instance_create_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/17bbf32f-d5ff-3984-00a3-63ba5d1effdc.png)

![instance_create_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/6e156e52-45f8-4329-7ee8-82c346859a67.png)

:::note info
1時間弱かかります。
ここで選択するリージョンはGCSバケットのリージョンと同じである必要はありません。
:::

インスタンスのステータスが`Ready`になるまで待ちます。

![web_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/6a891e8e-9f6a-e1cb-b114-338f5ff5365c.png)


## 5. WEBアクセス

起動したインスタンスへのアクセス用のURLを発行してWEBブラウザからアクセスします。

インスタンス詳細の`ストリーミングURL`をクリックします

![web_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/20f6e7d7-4375-1592-a01b-b10fdc2a5d5e.png)

Link Generator Tool（URL生成ツール）でURLを生成します


![web_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/3d538fb1-1329-fd4a-21da-f24e934c7c24.png)


URLにアクセスします。以下の左図のようにUEで開発されたテンプレートプロジェクトの内容が表示されます。
オブジェクトをタップしたりピンチインアウトなどカメラ操作をクラウドレンダリングで遅延も少なく体験できると思います。

- もしLink Generator ToolでQRコードからアクセスした場合、Googleアプリがインストールされているとそちらで優先して表示されます
- 画面下部にARモードで表示する`View in your space`が表示されますが今回は反応しません（Googleアプリでのアクセスかつ、インスタンスのモードをAR/3Dモードにしている場合のみ体験できます）

参考までに以下の右図はインスタンスがまだ起動していなかったり、枯渇している場合などに表示されるエラー画面になります。

![web.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489259/a2020d92-82c6-905d-9c47-52ee5c7297d6.png)

:::note info
１インスタンス１セッションとなるため、１インスタンス起動の場合は１人だけアクセスが可能となります。
:::

## 片付け

インスタンス、コンテンツ、GCSバケットを削除します。

継続して開発する場合には、費用がかからない環境の残し方をすると次回以降待ち時間を（ある程度）削減ができます。

- インスタンスを削除でなく、台数を0台に変更します
    - インスタンス0台とすることで削除と同様にインスタンス費用はかかりません
    - インスタンス作成と0->1台の変更では、後者の方が起動時間を20-30分短縮されます
- コンテンツはそのまま残します
    - ビルダーやバージョン管理などの部分は費用がかからないためそのまま残します
- GCSバケットの中身だけを削除します
    - コンテンツとGCSバケットが紐づいてビルダーが管理されているため、バケット自体を削除するとコンテンツ作成から必要になるため、GCSバケットは残して課金対象になる中身のプロジェクトデータだけ削除します
    - 次回ビルドするときはまたプロジェクトを同じバケットにアップロードしてビルドします

# おわりに

今回はis4xrがどんなサービスかと最短で動作確認する方法を紹介しました。
各ステップの詳細や重要な説明などをほとんど飛ばしていますので、今後それぞれについて深掘りした内容を紹介していきたいと思います。