TL;DR: CodemagicとOculus CLIツールを使って、Unity VRアプリのOculus Storeへの公開を自動化できます。
VR Unityアプリの作成は、本当にいけてます...。が、開発段階で簡単に友人と共有するにはどうしたらいいのでしょうか?
以前の記事で、なぜ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で公開しています 🚀
Androidアプリと同様、VRアプリの共有は、特に開発段階においては、時には少々面倒なことがあります。ありがたいことに、**Codemagic**とOculus CLIツール の予備知識の一部を再利用して、私の小さなゲームのような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公式ドキュメントを見ればすぐにわかることですが、UnityでVRアプリを作るということは、実はAndroid用にコンパイルしてパッケージを作るということです。そのため、Android用にビルドするためのプロジェクトを準備する必要がありますが、プロジェクトの設定がOculus配布に適しているかどうかも確認する必要があります。
気をつけてください。UnityのAndroidビルドに共通する設定があっても、Oculus特有の要件や制限もあります!
ビルドターゲットの選択
もし、あなたのプロジェクトがまだAndroid用にビルドするように設定されていない場合は、まずこれを変更する必要があります。このステップは簡単です。「ファイル」>「ビルド設定」パネルで、**ビルドターゲットとして「Android」を選択し、「プラットフォームの切り替え」をクリックします。
プロジェクトの再コンパイルが必要なため、しばらく時間がかかるかもしれませんが、完了すると、下部のボタンが「Build」と表示されているのが確認できます。
その間に、ビルドに必要なシーンをすべてこのリストに追加したことを確認します。ビルド開始時にUnityからアクセスできるのは、このリストだけです。 ;)
また、すでに他のビルドプラットフォーム用にXRを設定している場合、「編集(Edit)」 > 「プロジェクトの設定(Project Settings)」ウィンドウで、設定を再更新し、正しいXR管理プラグインを選び直す必要がある場合があります。これは、「XRプラグイン管理(Plug-in Management)」タブに移動して、Androidオプションを設定して行います:
正しいプロジェクト設定の選択
ここからが面白いんです! 「_プレイヤー_タブの「編集」>「プロジェクト設定」に移動すると、調整できる設定項目がかなりあることがお分かりになると思います。
Oculusドキュメントと CodemagicのAndroid公開用のドキュメント(Codemagic docs for Android publishing)によると(.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
ユーティリティ**を使用します。これは、Javaと一緒に提供されているので、ほとんどの場合、すでにお使いのコンピューターにあるはずです。しかし、念のためお持ちでない場合、こちらの短い記事でインストール方法を説明していますので、ご覧ください。
以下のオプションをつけて 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
を設定する方法については、こちらの記事でご説明しております。
パート2:CodemagicによるVRアプリビルドの自動化
すでにCodemagicのワークフローに慣れている方は、どうぞOculusアプリのセットアップに関するパート3へ直接ジャンプしてください!
**重要な注意事項:**CodemagicでUnityアプリをデプロイするには、ProまたはPlus Unityライセンスがご必要です!
過去記事で詳しくご説明いたしましたが、**Codemagic**はCI/CDツールで、本当に使いやすく、拡張性が高く、あらゆる種類のプロジェクトを素早く構築できます。React Native、Flutter、Android、iOS...さらにもちろん、Unityも! 素晴らしいことに、専用のビルドマシンを使用しているため、ご希望のターゲットプラットフォームを選択することも可能です。これにより、Androidの.apk
成果物を簡単に作成できます。
CodemagicをUnityプロジェクトで使用するために必要なことは、Gitでプロジェクトをバージョン管理し、そこからCodemagicアプリを作成できるようにすることです。
UnityプロジェクトをGitプロバイダー(GitHub、GitLab、Bitbucketなど)に追加したら、Codemagicアカウントにログインして、ダッシュボードに移動します。新しいアプリを追加し、適切なGitプロバイダーを選択し、ソースコードを取得したいレポを選択することができるようになります。
次に、2つのファイルをプロジェクトに追加します:
-
Build.cs
スクリプト。これは、Codemagicのワークフローで、コマンドラインからプロジェクトを実行し、自動的にビルドするためのものです(これは、「ビルド設定」パネルを開いて「ビルド」ボタンをクリックするのと同じことです)。 -
codemagic.yaml
設定ファイル。これは、Gitリポジトリのルートにあり、使用する作業環境と、ビルドや追加のデプロイ段階用のさまざまなステップを定義します。
Build.cs
ファイルは、Editor/
フォルダ内のアセットフォルダに置きます。
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でエンコードされたものです。
最終的にはこんな感じになります:
すべて準備ができたので、あとはGitリポジトリに**codemagic.yaml
ファイルをコミット**するだけです。Codemagic Macマシンでのビルドの例は次のとおりです:
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でのみ利用可能です。また、Linuxサポートはまだロードマップにはないようです。つまり、Oculusアプリのビルドとリリースを自動化したい場合は、この2つのOSのどちらかに限定されることになります。;)
environment
ブロックでは、先ほど定義したenv varグループを再注入して、スクリプトやコマンドの中で8つの変数にアクセスできるようにしています。次に、コマンドラインからUnityを呼び出し、ビルドロジック(Build.cs
ファイル)を使用してAndroid パッケージを作成するだけです。
ビルドコマンドで-buildTarget Android
オプションを指定するのは非常に重要です。そうしないと、UnityがXRやVR関連のアセットを集めるのに苦労しそうです!
これで、Unity VRアプリの最初のCodemagicビルドを試すことができるようになりました。右上の「新規ビルドを開始(Start new build)」ボタンをクリックし、Gitブランチかタグを選択して、ワークフローを開始するだけです!
数分後、ワークフローが終了し、.apk
成果物が生成されたことが確認できます:
この.apk
パッケージは、Oculusで自動的に配布したいものです...ですがその前に、Oculusアプリ自身をセットアップする必要があります。それにより、そこに接続し、Codemagicのワークフローから直接新しいビルドをアップロードできるようになります!
パート3:Oculusアプリのセットアップ
アプリの作成
あなた独自のVR Oculusアプリを作って共有するには、Oculus開発者プログラムにサインアップする必要があります。参加するには、単にあなたのOculusアカウントかFacebookアカウントと接続するだけです。すると、開発者用ダッシュボードに直接移動し、あなたの既存の全アプリリストを取得したり、新しいアプリを作成したりできます。
例えば、私は「IcoPop」アプリを作成し、そのダッシュボードでアプリ情報の概要を把握できるようになりました。
ユーザーにアプリを配布するには、それを利用可能なさまざまなリリースチャンネルに登録する必要があります。また、開発用のOculus CLIツールを使ってアプリのデプロイを自動化したいので、テストリリースチャネル、つまり、RC、BETA、ALPHAチャネルのいずれかを使用する必要があります。Oculusのドキュメントによると、アプリは最初ALPHAチャネルに入り、その後チャネルを選択し、ご希望の場合チャネルの公開もできます。
ここではALPHAチャネルを選びますので、まず、このチャネルにテスターをいくつか追加します。チャネルをクリックして「ユーザー」タブを開き、購読したいさまざまなテスターのメールアドレスを入力するだけでオッケーです。なお、テスターはOculusに登録されている必要があります。そうでなければ、エラーを投げます。
注意:有効なOculusアカウントを持っているユーザーのメールのみを追加できます!
購読者が招待を受け入れると、チャネルユーザーにリストアップされます。チャネル全体のダッシュボードでは、ユーザー数が増加したことも確認できます:
Oculusアプリの認証情報を取得
最後のステップは、Oculus CLIツールを使用して、Codemagicワークフローからビルドをアップロードできるように、アプリに関するいくつかの情報を取得することです。具体的には、アプリIDと、CLIが代理で動作するためのトークン認証情報を取得する必要があります。
これらの情報はすべて、アプリの「API」タブで確認できます。
まず、アプリIDを取得します。次に、アクセストークンを取得します。
CLIツールで認証を行うには、実際には2つ方法があります:
- アプリの主管者であれば、アプリの秘密で
- ベーシックな消費者であれば、生成されたユーザートークンで
ここでは、私のアプリの秘密を使用します。ユーザートークンを使用したい場合は、「トークンの生成(Generate Token)」ボタンをクリックして、トークンをコピーしてください。
パート4:Codemagicのワークフローの設定を終了する
OculusアプリIDとアプリの秘密(またはユーザートークン)を手に入れたので、ついにOculus「ALPHA」チャネルへの.apk
成果物の配布を自動化できます。すべて、CLIツールとCodemagicワークフローを使用して行えます。
そのために、まず、2つの新しい環境変数を「oculus」グループのCodemagicアプリに追加する必要があります:
注意:Oculusアプリにユーザートークンを使用している場合、もちろん
OCULUS_APP_SECRET
変数をOCULUS_USER_TOKEN
変数で置き換えることができます。
その後、このenvグループと最終的な指示をcodemagic.yaml
設定ファイルのpublishing
ブロックに追加するだけです:
- まず、Oculus CLIツールをインストールします。こちらのドキュメントの説明をご覧ください。本記事の公開時では、Codemagicのコンピューターに事前インストールされていません。
- 次に、このツールを使って、私たちのアプリ用の新規Oculusビルドとして、
.apk
ファイルをアップロードします。
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
注意:ユーザートークンを使っている場合は、最後のコマンドを以下に置き換える必要があります:
./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」チャネルに新しいリリースがあるはずです! :)
このビルドをクリックすると、さらに詳細な情報、特に、すべての設定とバージョンの詳細なリストが表示されるようにもなっています。
あるいは、チャネルへのリリース時に実行されたテストを再確認できます。
ユーザー側では、あなたの購読者はすべて、ヘッドセットの装着時に、彼らのOculusライブラリであなたのアプリの最新のビルドを自動的に取得します。:)
また、アプリの詳細を少し閲覧することもできます。ここで、あなたの最高の宣伝文句を作り、あなたの製品をよりよく宣伝するために風景画像をいくつか追加したくなるのではないでしょうか。あなたのアプリのメタデータを変更する方法についての詳細については、Oculusドキュメントを確認してください!
{{< youtube YUAbulLZnVQ >}}
結論
VRアプリを作るのは確かに楽しいのですが、開発段階で友人や開発者仲間と共有するのは少し面倒なこともあります。しかし、CodemagicやOculus CLIツールのような素晴らしいツールのおかげで、自動化されたCI/CDワークフローを設定し、Unity VRプロジェクトをビルドして、ご希望のOculus Storeリリースチャンネル**に配布できます。これらすべてが、ボタンを1つクリックするだけで!
このチュートリアルをお楽しみいただけましたら幸いです。また、もちろん、私にUnityチュートリアルを作ってほしい他のDevOpsトピックについてのアイデアがございましたら、お気軽にお伝えください! CodemagicのSlack、Medium、Twitterで私を見つけることができます。
また、「Ico-pop」プロジェクトの全貌は、こちらのGitHubでご覧いただけます。