CodemagicでOculus用VR Unityゲームを作って公開！

![Codemagic-blog-header-Unity-Apps-to-Oculus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/03731aed-d216-fbc9-1381-a9ffe01c22cc.png)

**TL;DR:** *CodemagicとOculus CLIツールを使って、Unity VRアプリのOculus Storeへの公開を自動化できます。*

VR Unityアプリの作成は、本当にいけてます...。が、開発段階で簡単に友人と共有するにはどうしたらいいのでしょうか？

[以前の記事](https://blog.codemagic.io/unity-firebase-app-distribution/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)で、なぜ**Unityプロジェクトのビルドと公開の自動化**が興味深く有用なのか、特に、素敵なベータテスターから**継続的にフィードバックを得たい**場合について述べました。それを示すために、「Slash'n'crack」というAndroidのモバイルゲームを例に挙げました。

多くの開発プロジェクトは似たようなものですが、いくつかのケースで違いがあります。先日、去年のクリスマスに買ったVRヘッドセット「Oculus Quest 2」で遊んでいたら、沸々と以下のような考えが芽生え始めました。「どうやったら**自分でVRアプリを作れる**んだろう…」、また、「どうすれば、**開発者仲間とそれらを共有**できるのか」…そう、まさに、「Slash'n'crack」ゲームでやったように！　そんな風に考えた結果、1つの考えが生まれ、独自のプロジェクトに発展していきました。

Unityは最近、XR（eXtended reality、仮想現実、拡張現実、複合現実を含む用語）機能を多く統合し、様々なタイプのVRヘッドセット用の小さなプロトタイプゲームを作ることがとても簡単になりました。このエンジンを使えば、例えばOculusのセットに対応した簡単なVRプロトタイプをすぐにセットアップできるようになりました。

そこで、今回も**別の基本的なアーケードゲーム**として、物体を破壊するものを作りました。ただし、こちらは360°の部屋の中で、入ってくるターゲットに向かって撃つことになります。私の新作プロトタイプゲーム「Ico-pop」のデモをご紹介します！

{{< youtube UToA7T7WTqM >}}

_プロジェクト自体をご覧になりたい場合は、無料で[こちらのGitHubで](https://github.com/MinaPecheux/Unity-IcoPop)公開しています 🚀_

Androidアプリと同様、VRアプリの共有は、特に開発段階においては、時には少々面倒なことがあります。ありがたいことに、**[Codemagic](https://unitycicd.com/)**と[**Oculus CLIツール**](https://developer.oculus.com/resources/publish-reference-platform-command-line-utility/) の予備知識の一部を再利用して、私の小さなゲームのようなUnity VRプロジェクトのビルドとOculus Storeへのリリースを自動化できることを発見しました。

そこで、今回は、以下についてご説明いたします：

- Codemagicを使用して私のUnity VRアプリを構築する方法
- Ico-popのテスター数名とOculusアプリをセットアップする方法
- Codemagicからビルドを新しいOculusのリリースとして自動的に公開する方法

飛び込む準備はよろしいですか？ では、まいりましょう！:)

## Oculusの配信自動化について一言

開発者として、私たちは様々な公開ツールを使用し、**ワークフローを自動化**するための**API**や簡単に呼び出せるURLを持っていることに慣れています（例えば、Microsoft Partner Center、Google Play、Apple App Storeが提供するものなど）。

しかし、実はOculus Storeでは、そのような気軽に使えるツールは見つかっていないのです (_何かご存知の方がいらっしゃいましたら、教えてください_)

しかし、幸いなことに、自動化のための解決策は実はあります。例えば、Oculusを所有するMetaは、[**Oculusコマンドライン（CLI）ツールのセット**] (https://developer.oculus.com/resources/publish-reference-platform-command-line-utility/) をリリースしました。これを使うと、ダッシュボードやUIのボタンをわざわざたくさんクリックしに行かずに、プログラムでいくつかアクションを実行できるようになります。このCLIユーティリティは、アプリの現在のビルドに関する情報の取得、新しいビルドの作成、特定のバージョンのダウンロードなどを簡単にできます。Codemagic とともに、このCLIユーティリティは、クラウドでOculusアプリをビルドして配布するために頼りになるツールセットを提供してくれます。

## パート1：Oculus用VRアプリをビルドするためのUnityプロジェクトの設定

[Unity公式ドキュメント](https://docs.unity3d.com/Manual/VROverview.html)を見ればすぐにわかることですが、UnityでVRアプリを作るということは、実はAndroid用にコンパイルしてパッケージを作るということです。そのため、Android用にビルドするためのプロジェクトを準備する必要がありますが、プロジェクトの設定がOculus配布に適しているかどうかも確認する必要があります。

_気をつけてください。UnityのAndroidビルドに共通する設定があっても、Oculus特有の要件や制限もあります！_

### ビルドターゲットの選択

もし、あなたのプロジェクトがまだAndroid用にビルドするように設定されていない場合は、まずこれを変更する必要があります。このステップは簡単です。「_ファイル_」>「_ビルド設定_」パネルで、**ビルドターゲットとして「_Android_」を選択し、「_プラットフォームの切り替え_」をクリックします。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-build_settings.jpg)

プロジェクトの再コンパイルが必要なため、しばらく時間がかかるかもしれませんが、完了すると、下部のボタンが「Build」と表示されているのが確認できます。

その間に、ビルドに必要なシーンをすべてこのリストに追加したことを確認します。ビルド開始時にUnityからアクセスできるのは、このリストだけです。 ;)

また、すでに他のビルドプラットフォーム用にXRを設定している場合、「_編集（Edit）_」 > 「_プロジェクトの設定（Project Settings）_」ウィンドウで、**設定を再更新し、正しいXR管理プラグインを選び直す必要がある場合があります**。これは、「_XRプラグイン管理（Plug-in Management）_」タブに移動して、Androidオプションを設定して行います：

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-xr_settings.jpg)

### 正しいプロジェクト設定の選択

ここからが面白いんです!　「_プレイヤー_タブの「_編集_」>「_プロジェクト設定_」に移動すると、調整できる設定項目がかなりあることがお分かりになると思います。

[Oculusドキュメント](https://developer.oculus.com/documentation/unity/unity-conf-settings/#build-settings)と [CodemagicのAndroid公開用のドキュメント（Codemagic docs for Android publishing）](https://docs.codemagic.io/yaml-quick-start/building-a-unity-app/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)によると（`.apk`パッケージを作るので、`.aab`\関連のオプションは無視するとしても）、以下の3つを設定する必要があります：

- 「_その他の設定（Other Settings）_」ブロックで、**最小APIレベル（Minimum API Level）**と**ターゲットAPIレベル（Target API Level）**がAndroid 10.0 (API Level 29)以下に設定されていることを確認してください。これは、Oculusアプリに必要です。
- また、「**_スクリプトバックエンド（Scripting Backend）_**"を「IL2CPP」に設定します。
- 次に、一番下の「_公開設定（Publishing Settings）_」ブロックで、「**_カスタムベースのGradleテンプレート（Custom Base Gradle Template）_**」のトグルにチェックを入れます。

このオプションを有効にすると、プロジェクト内の`アセット/プラグイン/Android（Assets/Plugins/Android）` フォルダに`baseProjectTemplate.gradle`という新しいファイルが自動的に作成されます。では、このファイルを開いて、次の内容をそこにコピーしてください：

```
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

allprojects {
    buildscript {
        repositories {**ARTIFACTORYREPOSITORY**
            google()
            mavenCentral()
        }

        dependencies {
            // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
            // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
            // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
            // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
            classpath 'com.android.tools.build:gradle:4.0.1'
            **BUILD_SCRIPT_DEPS**
        }
    }

    repositories {**ARTIFACTORYREPOSITORY**
        google()
        mavenCentral()
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```

### アプリを保護するためのキーストアファイルの作成

最後に、リリース時にOculusのチェックをすべてクリアできるよう、アプリの安全性をもう少し高めたいと考えています。これを行うには、**キーストア認証情報ファイル**を作成します。このタイプのファイルは、[こちら]（https://developer.android.com/training/articles/keystore]で説明されているように、**コンテナに暗号化キーを保存する**安全な方法です。

新しいキーストアファイルを生成するには、**[`keytool`ユーティリティ](https://docs.oracle.com/en/java/javase/12/tools/keytool.html)**を使用します。これは、Javaと一緒に提供されているので、ほとんどの場合、すでにお使いのコンピューターにあるはずです。しかし、念のためお持ちでない場合、[こちらの短い記事](https://www.misterpki.com/install-keytool/)でインストール方法を説明していますので、ご覧ください。

以下のオプションをつけて `keytool` を呼び出すと、素敵な新しいキーストアファイルが入手できます (`<` and `>`記号間の部分を調整するのを忘れないでください)。

```
keytool -genkey -v -keystore <keystore_name>.keystore -alias <alias_name> -keyalg RSA -keysize 2048 -validity 10000
```

このコマンドを実行すると、2、3個の質問に答えるように促されます。ここで、いくつかのパスワードやその他の設定を選ぶ必要があります。特に、これらの「パスワード」は、実際には、お持ちの暗号鍵ペアの秘密鍵と公開鍵です。細かい設定は必要ありませんが、ツールに渡した「キーストアパスワード」と「キーパスワード」は、私たちのCodemagicアプリのセットアップですぐに必要になるので、必ず覚えておいてください。

> **重要な注意事項：**これらのキーストアの認証情報は、Gitリポジトリに**絶対にコミットしてはいけません**。 間違って追加してしまわないように、`.gitignore`に追加しておきましょう！　Unityプロジェクトで正しい`.gitignore`を設定する方法については、[こちらの記事](https://blog.codemagic.io/versioning-unity-project-with-git/#setting-up-a-unity-project-for-git-versioning?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)でご説明しております。


## パート2：CodemagicによるVRアプリビルドの自動化

すでにCodemagicのワークフローに慣れている方は、どうぞ[Oculusアプリのセットアップに関するパート3へ直接ジャンプ](#oculus-app-setup)してください！

> **重要な注意事項:**CodemagicでUnityアプリをデプロイするには、**ProまたはPlus Unityライセンス**がご必要です!

[過去記事](https://blog.codemagic.io/unit-testing-automation-unity/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)で詳しくご説明いたしましたが、**[Codemagic](https://unitycicd.com/)**はCI/CDツールで、本当に使いやすく、拡張性が高く、あらゆる種類のプロジェクトを素早く構築できます。React Native、Flutter、Android、iOS...さらにもちろん、Unityも!　素晴らしいことに、専用のビルドマシンを使用しているため、ご希望のターゲットプラットフォームを選択することも可能です。これにより、Androidの`.apk`成果物を簡単に作成できます。

CodemagicをUnityプロジェクトで使用するために必要なことは、**Gitでプロジェクトをバージョン管理**し、そこからCodemagicアプリを作成できるようにすることです。

Unityプロジェクトを**Gitプロバイダー**（GitHub、GitLab、Bitbucketなど）に追加したら、Codemagicアカウントにログインして、ダッシュボードに移動します。新しいアプリを追加し、適切なGitプロバイダーを選択し、ソースコードを取得したいレポを選択することができるようになります。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-codemagic-dashboard.jpg)

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-codemagic_new-app.jpg#center)

次に、2つのファイルをプロジェクトに追加します：

- `Build.cs`スクリプト。これは、Codemagicのワークフローで、コマンドラインからプロジェクトを実行し、自動的にビルドするためのものです（これは、「ビルド設定」パネルを開いて「ビルド」ボタンをクリックするのと同じことです）。
- `codemagic.yaml`設定ファイル。これは、Gitリポジトリのルートにあり、使用する作業環境と、ビルドや追加のデプロイ段階用のさまざまなステップを定義します。

**`Build.cs`ファイル**は、`Editor/`フォルダ内のアセットフォルダに置きます。

```c#
using System.Linq;
using System;
using UnityEditor;
using UnityEngine;

public static class BuildScript
{

    [MenuItem("Build/Build Android")]
    public static void BuildAndroid()
    {

        PlayerSettings.Android.useCustomKeystore = true;
        EditorUserBuildSettings.buildAppBundle = false;

        // Set bundle version. NEW_BUILD_NUMBER environment variable is set in the codemagic.yaml 
        var versionIsSet = int.TryParse(Environment.GetEnvironmentVariable("NEW_BUILD_NUMBER"), out int version);
        if (versionIsSet)
        {
            Debug.Log($"Bundle version code set to {version}");
            PlayerSettings.Android.bundleVersionCode = version;
        }
        else
        {
            Debug.Log("Bundle version not provided");
        }

        // Set keystore name
        string keystoreName = Environment.GetEnvironmentVariable("CM_KEYSTORE_PATH");
        if (!String.IsNullOrEmpty(keystoreName))
        {
            Debug.Log($"Setting path to keystore: {keystoreName}");
            PlayerSettings.Android.keystoreName = keystoreName;
        }
        else
        {
            Debug.Log("Keystore name not provided");
        }

        // Set keystore password
        string keystorePass = Environment.GetEnvironmentVariable("CM_KEYSTORE_PASSWORD");
        if (!String.IsNullOrEmpty(keystorePass))
        {
            Debug.Log("Setting keystore password");
            PlayerSettings.Android.keystorePass = keystorePass;
        }
        else
        {
            Debug.Log("Keystore password not provided");
        }

        // Set keystore alias name
        string keyaliasName = Environment.GetEnvironmentVariable("CM_KEY_ALIAS");
        if (!String.IsNullOrEmpty(keyaliasName))
        {
            Debug.Log("Setting keystore alias");
            PlayerSettings.Android.keyaliasName = keyaliasName;
        }
        else
        {
            Debug.Log("Keystore alias not provided");
        }

        // Set keystore password
        string keyaliasPass = Environment.GetEnvironmentVariable("CM_KEY_PASSWORD");
        if (!String.IsNullOrEmpty(keyaliasPass))
        {
            Debug.Log("Setting keystore alias password");
            PlayerSettings.Android.keyaliasPass = keyaliasPass;
        }
        else
        {
            Debug.Log("Keystore alias password not provided");
        }
        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
        buildPlayerOptions.locationPathName = "android/android.apk";
        buildPlayerOptions.target = BuildTarget.Android;
        buildPlayerOptions.options = BuildOptions.None;
        buildPlayerOptions.scenes = GetScenes();

        Debug.Log("Building Android");
        BuildPipeline.BuildPlayer(buildPlayerOptions);
        Debug.Log("Built Android");
    }

    private static string[] GetScenes()
    {
        return (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToArray();
    }

}
```

このファイルでは、環境変数を2、3個取得し、ビルドオプションを設定します。次に、ビルド設定からシーンのリストを取得し、**`android.apk`成果物を作成します**。

これらの**環境変数**は、私たちのアプリ用にCodemagicのインターフェイスで定義されています。一方で、それらはなぜ必要なのでしょうか？　そうですね、今回のUnityプロジェクトをCodemagicで構築するために、Codemagicのコンピューターをしばらく「お借り」することになりました。ですので、たとえビルトインや事前インストールされたツールがあったとしても、私たち自身の作業環境に合わせて適切にセットアップする必要があるのですが、これはenv vars のおかげで可能になりました。

環境変数を設定するには、Codemagicアプリのダッシュボードで、「環境変数（Environment variables）」タブに移動し、キーバリューペアをいくつか定義する必要があります。私たちは8つの変数を設定したいと思います：

- `UNITY_SERIAL`
- `UNITY_PASSWORD`
- `UNITY_USERNAME`
- `CM_KEYSTORE`
- `CM_KEYSTORE_PATH`
- `CM_KEY_ALIAS`
- `CM_KEYSTORE_PASSWORD`
- `CM_KEY_PASSWORD`

最初の3つは「unity」グループに、残りの5つは「keystore_credentials」グループに追加する必要があります(これを行うには、「変数グループ（Variable group）」列にグループ名を入力し始めるだけで作成でき、すでに存在する場合はドロップダウンリストから選択します)。

`UNITY_SERIAL`、`UNITY_USERNAME`、`UNITY_PASSWORD`は、あなたご自身のUnityアカウントの認証情報です。残りの変数は、先ほど作成したキーストアファイルに関連するものです。`CM_KEY_ALIAS`、`CM_KEY_PASSWORD`、`CM_KEYSTORE_PASSWORD`は、キーストアファイルを作成する際に設定した各種オプションです。

`CM_KEYSTORE_PATH`は `keystore.keystore` に設定する必要があります。

最後に、`CM_KEYSTORE`はキーストアファイルの実際の内容で、[base64でエンコードされたもの](https://docs.codemagic.io/variables/environment-variable-groups/#storing-sensitive-valuesfiles)です。

最終的にはこんな感じになります：

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-env_vars.jpg)

すべて準備ができたので、あとはGitリポジトリに**`codemagic.yaml`ファイルをコミット**するだけです。Codemagic Macマシンでのビルドの例は次のとおりです：

```yaml
workflows:
  unity-android-workflow:
    name: Unity Android Workflow
    max_build_duration: 120
    environment:
      groups:
        - unity # <-- (Includes UNITY_SERIAL, UNITY_USERNAME, UNITY_PASSWORD)
        - keystore_credentials # <-- (Includes CM_KEYSTORE, CM_KEYSTORE_PASSWORD, CM_KEY_PASSWORD, CM_KEY_ALIAS)
      vars:
        UNITY_BIN: /Applications/Unity/Hub/Editor/2020.3.28f1/Unity.app/Contents/MacOS/Unity
        BUILD_SCRIPT: BuildAndroid
        PACKAGE_NAME: "com.minapecheux.Icopop"
    scripts:
      - name: Activate Unity License
        script: | 
          $UNITY_BIN -batchmode -quit -logFile -serial ${UNITY_SERIAL?} -username ${UNITY_USERNAME?} -password ${UNITY_PASSWORD?}      
      - name: Set up keystore
        script: | 
          echo $CM_KEYSTORE | base64 --decode > $CM_BUILD_DIR/keystore.keystore
      - name: Build Unity app
        script: | 
          $UNITY_BIN -batchmode -quit -logFile -projectPath . -executeMethod BuildScript.$BUILD_SCRIPT -nographics -buildTarget Android
    artifacts:
      - android/*.apk
    publishing:
      scripts:
        - name: Deactivate License
          script: $UNITY_BIN -batchmode -quit -returnlicense -nographics
```

> **重要な注意事項：**Oculus CLIツールは [**WindowsかMacでのみ利用可能**です](https://developer.oculus.com/resources/publish-reference-platform-command-line-utility/#download-and-install-the-utility)。また、[Linuxサポートはまだロードマップにはないようです](https://forums.oculusvr.com/t5/Tool-Feedback/Oculus-Platform-Command-Line-Utility-for-Linux/td-p/822577)。つまり、Oculusアプリのビルドとリリースを自動化したい場合は、この2つのOSのどちらかに限定されることになります。;)

`environment`ブロックでは、先ほど定義したenv varグループを再注入して、スクリプトやコマンドの中で8つの変数にアクセスできるようにしています。次に、コマンドラインからUnityを呼び出し、ビルドロジック(`Build.cs`ファイル)を使用してAndroid パッケージを作成するだけです。

**ビルドコマンドで`-buildTarget Android`オプションを指定するのは非常に重要**です。そうしないと、UnityがXRやVR関連のアセットを集めるのに苦労しそうです！

これで、**Unity VRアプリの最初のCodemagicビルドを試すことができるようになりました**。右上の「新規ビルドを開始（Start new build）」ボタンをクリックし、Gitブランチかタグを選択して、ワークフローを開始するだけです！

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-codemagic_start_build.jpg)

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-codemagic_start_build2.jpg#center)

数分後、ワークフローが終了し、**`.apk`成果物が生成された**ことが確認できます：

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-codemagic_artifact.jpg)

この`.apk`パッケージは、Oculusで自動的に配布したいものです...ですがその前に、Oculusアプリ自身をセットアップする必要があります。それにより、そこに接続し、Codemagicのワークフローから直接新しいビルドをアップロードできるようになります！

## パート3：Oculusアプリのセットアップ

### アプリの作成

あなた独自のVR Oculusアプリを作って共有するには、[Oculus開発者プログラム](https://developer.oculus.com/)にサインアップする必要があります。参加するには、単にあなたのOculusアカウントかFacebookアカウントと接続するだけです。すると、開発者用ダッシュボードに直接移動し、あなたの既存の全アプリリストを取得したり、新しいアプリを作成したりできます。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-dashboard.jpg)

例えば、私は「IcoPop」アプリを作成し、そのダッシュボードでアプリ情報の概要を把握できるようになりました。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-app_dashboard.jpg)

ユーザーに**アプリを配布**するには、それを利用可能なさまざまな**リリースチャンネル**に登録する必要があります。また、開発用のOculus CLIツールを使ってアプリのデプロイを自動化したいので、テストリリースチャネル、つまり、**RC、BETA、ALPHAチャネル**のいずれかを使用する必要があります。Oculusのドキュメントによると、アプリは最初ALPHAチャネルに入り、その後チャネルを選択し、ご希望の場合チャネルの公開もできます。

ここでは**ALPHAチャネル**を選びますので、まず、このチャネルに**テスターをいくつか**追加します。チャネルをクリックして「ユーザー」タブを開き、購読したいさまざまなテスターのメールアドレスを入力するだけでオッケーです。なお、テスターはOculusに登録されている必要があります。そうでなければ、エラーを投げます。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-channel_alpha_users.jpg)

> 注意：有効なOculusアカウントを持っているユーザーのメールのみを追加できます！

購読者が招待を受け入れると、チャネルユーザーにリストアップされます。チャネル全体のダッシュボードでは、ユーザー数が増加したことも確認できます：

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-channels_dashboard.jpg)

### Oculusアプリの認証情報を取得

最後のステップは、Oculus CLIツールを使用して、Codemagicワークフローからビルドをアップロードできるように、アプリに関するいくつかの情報を取得することです。具体的には、アプリIDと、CLIが代理で動作するためのトークン認証情報を取得する必要があります。

これらの情報はすべて、アプリの「API」タブで確認できます。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-oculus_api_info.jpg)

まず、**アプリID**を取得します。次に、アクセストークンを取得します。

CLIツールで認証を行うには、実際には2つ方法があります：

- アプリの主管者であれば、**アプリの秘密**で
- ベーシックな消費者であれば、**生成されたユーザートークン**で

ここでは、私のアプリの秘密を使用します。ユーザートークンを使用したい場合は、「トークンの生成（Generate Token）」ボタンをクリックして、トークンをコピーしてください。

## パート4：Codemagicのワークフローの設定を終了する

OculusアプリIDとアプリの秘密（またはユーザートークン）を手に入れたので、ついにOculus「ALPHA」チャネルへの`.apk`成果物の配布を自動化できます。すべて、CLIツールとCodemagicワークフローを使用して行えます。

そのために、まず、2つの新しい環境変数を「oculus」グループのCodemagicアプリに追加する必要があります：

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-env_vars2.jpg)

> 注意：Oculusアプリにユーザートークンを使用している場合、もちろん`OCULUS_APP_SECRET`変数を `OCULUS_USER_TOKEN`変数で置き換えることができます。

その後、このenvグループと最終的な指示を`codemagic.yaml`設定ファイルの`publishing`ブロックに追加するだけです：

- まず、**Oculus CLIツール**をインストールします。[こちらのドキュメント](https://developer.oculus.com/resources/publish-reference-platform-command-line-utility/#download-and-install-the-utility)の説明をご覧ください。本記事の公開時では、Codemagicのコンピューターに事前インストールされていません。
- 次に、このツールを使って、**私たちのアプリ用の新規Oculusビルド**として、[`.apk`ファイルをアップロード](https://developer.oculus.com/resources/publish-reference-platform-command-line-utility/#upload-quest)します。

```yaml
workflows:
  unity-android-workflow:
    name: Unity Android Workflow
    max_build_duration: 120
    environment:
      groups:
        ...
        - oculus # <-- (Includes OCULUS_APP_ID, OCULUS_APP_SECRET)
      vars:
        ...
        OCULUS_RELEASE_CHANNEL: ALPHA # should be a test channel, not "store" (= Production)
    scripts: ...
    artifacts: ...
    publishing:
      scripts:
        - name: Deactivate License
          script: $UNITY_BIN -batchmode -quit -returnlicense -nographics
        - name: Install Oculus CLI tools
          script: |
            wget -O ovr-platform-util "https://www.oculus.com/download_app/?id=1462426033810370&access_token=OC%7C1462426033810370%7C"
            chmod +x ./ovr-platform-util
        - name: Publish app on a Oculus test release channel
          script: |
            ./ovr-platform-util upload-quest-build --app_id $OCULUS_APP_ID  --app_secret $OCULUS_APP_SECRET --apk android/android.apk --channel $OCULUS_RELEASE_CHANNEL
```

> 注意：ユーザートークンを使っている場合は、最後のコマンドを以下に置き換える必要があります：

```yaml
./ovr-platform-util upload-quest-build --app_id $OCULUS_APP_ID --token $OCULUS_USER_TOKEN --apk android/android.apk --channel $OCULUS_RELEASE_CHANNEL
```

この`publishing`ブロックは、`scripts`の後に自動的に実行されるので、先ほど作成した`.apk`成果物を取得し、新しいビルドアップロードとしてOculusアプリに送信することが可能になります。

この新しいワークフローを実行すると、Oculusアプリの「ALPHA」チャネルに新しいリリースがあるはずです! :)

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-oculus-release.jpg)

このビルドをクリックすると、さらに詳細な情報、特に、すべての設定とバージョンの詳細なリストが表示されるようにもなっています。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-oculus-release-info.jpg)

あるいは、チャネルへのリリース時に実行されたテストを再確認できます。

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-oculus-tests.jpg)

ユーザー側では、**あなたの購読者はすべて、ヘッドセットの装着時に、彼らのOculusライブラリであなたのアプリの最新のビルドを自動的に取得**します。:)

![](https://blog.codemagic.io/uploads/2022/03/202202_oculus-demo-screenshot.jpg)

また、アプリの詳細を少し閲覧することもできます。ここで、あなたの最高の宣伝文句を作り、あなたの製品をよりよく宣伝するために風景画像をいくつか追加したくなるのではないでしょうか。**あなたのアプリのメタデータを変更する**方法についての詳細については、[Oculusドキュメント](https://developer.oculus.com/resources/publish-content-updating/)を確認してください!

{{< youtube YUAbulLZnVQ >}}

## 結論

VRアプリを作るのは確かに楽しいのですが、開発段階で友人や開発者仲間と共有するのは少し面倒なこともあります。しかし、CodemagicやOculus CLIツールのような素晴らしいツールのおかげで、**自動化されたCI/CDワークフローを設定し、Unity VRプロジェクトをビルドして、ご希望の**Oculus Storeリリースチャンネル**に配布できます。これらすべてが、ボタンを1つクリックするだけで！　

このチュートリアルをお楽しみいただけましたら幸いです。また、もちろん、私にUnityチュートリアルを作ってほしい他のDevOpsトピックについてのアイデアがございましたら、お気軽にお伝えください！　[CodemagicのSlack](http://codemagicio.slack.com)、[Medium](https://mina-pecheux.medium.com/)、[Twitter](https://twitter.com/MinaPecheux)で私を見つけることができます。

また、「Ico-pop」プロジェクトの全貌は、[こちらのGitHubで](https://github.com/MinaPecheux/Unity-IcoPop)ご覧いただけます。