OculusPlatformについて

[はてなブログ](https://xrdeveloper.hatenablog.com/entry/2018/12/19/040432)に投稿したものを転載しました。

## 前回

OculusRoomsみたいなアプリを作りたくて、OculusPlatformを使ってみようとなったいきさつを書きました。

[OculusRoomみたいなアプリを作りたい - 海外で生活したいXRエンジニアのブログ](https://xrdeveloper.hatenablog.com/entry/2018/12/19/024425)

今回はOculuPlatformのことはじめを書いていこうと思います。

## 概要

[Introduction to the Platform SDK](https://developer.oculus.com/documentation/platform/latest/concepts/book-plat-sdk-intro/)

> The Platform SDK contains features that you can use to create engaging and social game experiences.

ドキュメントによると、OculusPlatformにはソーシャルゲームを作る事が出来る機能が含まれているようです。

使ってみての私の理解は、
OculusPlatformはBaaS(Backend as a Service)だと思っています。

本来サーバーが必要な部分をOculus側が用意してくれていて、機能ごとにAPIが用意されていて、

開発者は必要なAPIを利用するコードを書くだけで、ソーシャルVRを実現できる。

そのAPIを叩きやすくしたものが、OculusPlatformSDK。という認識をしています。

## OculusPlatformの機能

OculusGo、特に[Oculus Rooms](https://www.oculus.com/experiences/go/1101959559889232/)をイメージすると分かりやすいかもです。


- ユーザーはアプリ内で写真を撮りFacebookに投稿することが出来る

    [Sharing](https://developer.oculus.com/documentation/platform/latest/concepts/dg-sharing/)

- ユーザーはアプリ内で友人を招待し一緒にゲームをプレイできる

    [Rooms](https://developer.oculus.com/documentation/platform/latest/concepts/dg-rooms/)

- ユーザーはアプリ内で音声通話をすることが出来る

    [Voice Chat (VoIP)](https://developer.oculus.com/documentation/platform/latest/concepts/dg-cc-voip/)

- ユーザーはアプリ内で世界中のユーザーとマッチングし一緒に遊ぶことが出来る(Dead and Buriedや、Bigscreen、Oculus Venueをイメージすると良いかもです)

    [Matchmaking](https://developer.oculus.com/documentation/platform/latest/concepts/dg-matchmaking-1intro/)

これ以外にもOculusが用意してくれている機能をふんだんに使えます！

もちろん、OculusPlatformの機能を使用しなくても出来る機能はあると思います。

## OculusPlatformの良いところ

通信をする相手を指定する際にOculusアカウントを簡単に使えるのは便利です。

多分他のネットワークライブラリなどを使う際には、通信する相手を指定するのはちょっと面倒、か、ユーザーにIDを打たせるなどのUIを与えてしまいそうな気がしました。

## OculusPlatformの注意点

Oculusデバイスのみしか使えません。(OculusRift, GearVR, OculusGo, OculusQuest...)

Oculusデバイスのみを考えれば良くなるので私は良いな。と思ってました。

が、既存のマルチプレイのゲームをVR化したい、なんて時は使いづらいというかいらないですよね。

でも、そんな人でもOculusStoreに出したいなら、

絶対にやらなきゃいけない事があります。

## Entitlement Checkは必須

[https://developer.oculus.com/documentation/platform/latest/concepts/pgsg-unity-gsg/](https://developer.oculus.com/documentation/platform/latest/concepts/pgsg-unity-gsg/)

> Verifying that the user is entitled to your app is required to sell an app on the Oculus Store.

OculusStoreにアプリを売り出すには、提出するアプリのユーザーが、そのアプリを使う・持つ資格があるか(entitled)を検証する必要があるそうです。

なので、OculusPlatformの機能を使わなくとも、Storeに出したいなら
EntitlementCheckは必須です。

## OculusPlatform使ってみる

最初のセットアップは今回ざっくり書きます。

まずはOculusの[Oculus Developer Dashboard](https://dashboard.oculus.com)からアプリを作成します。



作った際のappIDというものを控えておく。

参考

[https://developer.oculus.com/distribute/latest/concepts/publish-create-app/](https://developer.oculus.com/distribute/latest/concepts/publish-create-app/)

↑のCreating an App Page参照  


次に、Unityのセットアップをします。

UnityのAssetStoreからOculusIntegrationをインポート。

Unityの上のメニューから、OculusDashboardで作ったアプリのappIDを記述する。

参考

[https://developer.oculus.com/documentation/platform/latest/concepts/pgsg-unity-gsg/](https://developer.oculus.com/documentation/platform/latest/concepts/pgsg-unity-gsg/)

↑のConfigure Your Development Environment

かなり飛ばしましたが、これでOculusPlatformを使う下地は整いました。

## EntitlementCheck

何か一つGameObjectを作成し、Startなどに下のメソッドを書きましょう。

    using Oculus.Platform;
    
    Start()
    {
    		// Oculus.Platform.Entitlementsのメソッドを呼ぶ
    		Entitlements.IsUserEntitledToApplication().OnComplete(IsEntitledCallback);
    }

Entitlements.IsUserEntitledToApplicationで、↑で設定したappIDに紐づいたアプリに資格があるかを検証します。

そして検証した結果が、`IsEntitledCallback`
にMessageとして渡されます。

このCallbackは自分で記述する必要があります。

    void IsEntitledCallback(Message msg)
    {
        if (msg.IsError)
        {
            // EntitlementCheckに失敗した場合、msg.IsErrorがTrueになる
    	　  // ①
            return;
        }
    		// EntitlementCheckが成功
    		// ②
    }

1番について。

このエラーをハンドリングするようドキュメントにはあります。

また、アプリを終了するよう促す文言もありました。

> You may not allow the user to proceed in your app after a failed entitlement check.

Sampleシーンでは、メソッドを呼び、そこでUnityEngine.Application.Quit()を実行し、アプリを強制終了していました。

2番について。

OculusPlatformを使って実行したいような処理を記述します。

例えば、アプリを使っているユーザーの情報を取得するメソッド

    Users.GetLoggedInUser().OnComplete(GetLoggedInUserCallback);

ここのCallbackは割愛しますが、さっきと同じようにMessageをハンドルする処理を書くのみです。

## 次回

今回はここまでとします。

次回は、私はこれでも失敗したので、OculusDashboardの設定や、Rooms機能について書いていこうと思います。