Tortoise Shell

Webサービスの会社で働くデザイナーが、デザインやライフハックについてゆるく書き連ねるブログです。

Unity製のVRゲームで、初めてOculus Storeに申請して引っかかったポイント

こちらは「Unity #3 Advent Calendar 2018」の、21日目の記事です。

こんにちは、tamuと申します。

先月ぐらいに、初めてUnityでVR向けのゲームを作成しまして、Oculus Storeに申請チャレンジしました。

しかし、何度もリジェクトを食らってしまい、かなりの時間をロスしてしまいました。

Oculus Storeへの申請に関しては、ノウハウも以前と比べてシェアされるようになってきましたが、それでもまだ情報は少ないと思います。

そこで今回は、わたしがUnity製のVRゲームで、初めてOculus Storeに申請して引っかかったポイントについてご紹介します。

なお、先に結論を言ってしまうと、わたしの場合は結局「キー承認のみ」で、ストアに並ぶまで至りせんでした。

作ったゲーム

今回申請したのは、以下のような、ハロウィン風のシューティングゲームでした。

魔法の杖から炎を出して、制限時間内に、何体のカボチャのお化けを退治できるか挑戦します。

1回目のレビュー

最初に申請した際には、次の3点について指摘を受けました。

VRC.Mobile.Input.3

Pressing the Back button doesn't go back one level in the menu UI hierarchy, nor does it display a menu with an option to quit the app.

Backボタンを押しても、メニューの1つ前に戻ったり、アプリケーションを終了するオプションが何も表示されないよ。と怒られました。

Oculus Storeのアプリでは、Backボタンに対して、システムダイアログかメニューの1つ上の階層へ戻れるようにしなければなりません。

対応するのは簡単で、以下のスクリプトを足すだけでOKでした。

if (OVRInput.GetDown(OVRInput.Button.Back)) {
    OVRManager.PlatformUIConfirmQuit();
}

今回の場合は、トリガーを引くと炎が飛ぶよう実装していたので、そこに足す形で対応しました。

void Update() {
        if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
        {
            // トリガーが引かれたら魔法を生成
            Instantiate(magicPrefab, staffEnd.position, staffEnd.rotation);

            // 発射時の音を再生
            magicAudioSource.Play();
        }

        if (OVRInput.GetDown(OVRInput.Button.Back))
        {
            // Backボタンが押されたら、システムダイアログを開く
            OVRManager.PlatformUIConfirmQuit();
        }
}

参考: Common Oculus Store Review Submission Issues | Oculus

VRC.Mobile.Input.6

When the device handedness is set to left-handed, the user's pointer line originates from the center of the user's Point-Of-View and becomes unresponsive.

デバイスの利き手が左に設定されている場合、ポインターはユーザーの視点の中心から発生し、応答しなくなります。と怒られました。

こちらもよくある指摘なようで、Oculus Goの場合、ユーザーはあらかじめ利き手の設定をしています。

わたしの場合、右利きということで、その前提で作り進めてしまいましたが、両手に対応させるのを忘れていました。

もともと、コントローラーをインスペクター上でアタッチしていたのですが、これだと常に決まった利き手にしか対応できません。

f:id:tamusan100:20181215235129p:plain
そこで、インスペクター上から設定するのをやめて、スクリプトで最初に利き手を判定させる仕様に切り替えました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shooter : MonoBehaviour {

    [SerializeField] Transform _RightHandAnchor; // 右手
    [SerializeField] Transform _LeftHandAnchor;  // 左手
    [SerializeField] Transform _CenterEyeAnchor; // 両目

    [SerializeField] GameObject magicPrefab; // 魔法のプレハブ
    [SerializeField] AudioSource magicSource; // 魔法の音源
    [SerializeField] Transform staff; // 魔法の発射位置

    // コントローラーを取得
    public Transform hand {
        get {
            var controller = OVRInput.GetActiveController();
            if (controller == OVRInput.Controller.RTrackedRemote)
            {
                return _RightHandAnchor;
            }
            else if (controller == OVRInput.Controller.LTrackedRemote)
            {
                return _LeftHandAnchor;
            }
            return _CenterEyeAnchor;
        }
    }

    void Update() {
// 杖を手の位置に合わせる staff = hand;
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)) { // トリガーが引かれたら魔法を生成 Instantiate(magicPrefab, staffEnd.position, staffEnd.rotation); // 発射時の音を再生 magicAudioSource.Play(); } if (OVRInput.GetDown(OVRInput.Button.Back)) { // Backボタンが押されたら、システムダイアログを開く OVRManager.PlatformUIConfirmQuit(); } } }

これによって、右利きにも左利きにも、対応できるようになりました。

VRC.Mobile.Security.2

Your app is asking for the following excessive or inappropriate user permissions: Record Audio / Access the microphone. Please remove all unnecessary permissions. If your app requires any of the permissions listed above please explain in detail why your app needs the permission in order to function.

あなたのアプリは、過度にユーザー権限(オーディオ・マイク)を要求しています。

不要な権限をすべて削除してください。もし必要なのであれば、その理由を説明してください。と怒られました。

え?オーディオとかマイクの権限を要求した記憶なんてないんだけど?

と思っていたのですが、「Oculus Integration」の以下のファイルが影響しているようです。

f:id:tamusan100:20181215234243p:plain

Assets/Oculus/Platform/Scripts/IMicrophone.cs
Assets/Oculus/Platform/Scripts/LivestreamingMicrophoneStatus.cs
Assets/Oculus/Platform/Scripts/MicrophoneInput.cs
Assets/Oculus/Platform/Scripts/MicrophoneInputNative.cs
Assets/Oculus/LipSync/Scripts/OVRLipSyncMicInput.cs
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMicInput.cs

これらをいったん削除することで、クリアすることができました。

参考: Oculus GO アプリで、マイクのパーミッションが出ないようにする - littlewing

2回目のレビュー

よっしゃ、今度こそ申請に通るぞ!と思ったのですが、もう1つ指摘を受けました。

VRC.Mobile.Input.6

When the device handedness is set to left-handed, the user's in-app controller asset disappears. The user can continue to fire projectiles in gameplay, but cannot make menu selections on the main menu.

左利きに設定されている場合、コントローラーのアセットが消えてしまいます。

ユーザーは、プレイ中に発射物(魔法)を射出することはできますが、メニュー上で選択することができません。と怒られてしまいました。

あれ〜おかしいな。両手対応はさっきやったはずなのに。

と思っていたら、基本的なことを忘れていました。

f:id:tamusan100:20181215234120p:plain

OVRCameraRigの中で、TrackRemoteのLeftHandAnchorの設定が、右手のままになっていたのです。

LeftHandAnchorと書いてあっても、デフォルトでは右手になっているので、変更しておきましょう。

この対応で、クリアすることができました。(これもよくある話らしいです。)

参考: OculusGoで左利き設定時、アプリ内でコントローラが表示されなかったときの確認箇所 - Qiita

3回目のレビュー

よし、3度目の正直だ!と言いたいところでしたが。

The following feedback

The following feedback is for your app during content review: -Your app currently contains limited content for a wide audience store launch.

テクニカルレビューは通過していたので、よっしゃ!と思っていたのですが、別のフィードバックが届いていました。

あなたのアプリは、幅広いオーディエンスに届けるのに、限られたコンテンツです。という意味でしょうか。

出たよ…ふわっとしたフィードバック\(^o^)/

ググってみても事例が見つからず、しばらく途方に暮れていたのですが、次の2つの仮説を思いつきました。

  1. ハロウィンでホラー風なので、幅広いユーザーに届けるには不適切
  2. コンテンツのボリュームが限られていて、ストアに並べられるレベルではない

真っ先に思いついたのは前者で、申請の際に、対象年齢を全年齢に設定していました。ホラーやバイオレンス等の指定もしていませんでした。

ひょっとしてこれか?と思い、対象年齢を引き上げて申請したところ…。

f:id:tamusan100:20181215225742p:plain

数日後に確認したら、「キーの承認のみ」の状態になっていました。

でも、ストアには並べてもらえないんですね...orz

ひょっとすると、コンテンツのボリュームが少ないというのも、同時に影響しているのかもしれません。

一応アプリとして配布できる状態になったので、いったんここまでで諦めることにしました。

おわりに

Unityについて、まだまだ理解が浅いこともあり、基本的なところで何度もつまづいてしまいました。

載せているコードなど、「こう書いた方がいいのでは?」という箇所があれば、ぜひご指摘いただけますと幸いです。(まだ体で覚えて、無理やり書いている自覚があるので)

それでは、来年も楽しいUnityライフをお過ごしください。メリークリスマス!