Unityで作った占いゲームをOculus Quest2アプリとして動かす

# Unityで作った占いゲームをOculus Quest2アプリとして動かす

Unity入門の定番、占いゲームをOculus Quest2で動かすまでメモとしてまとめておく。

完成イメージ↓
![スクリーンショット 2021-02-26 19.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/29919b4b-8656-9801-0847-e5d2651ef84c.png)


まず、ゲームに使う素材を作る。
今回はIllustratorを使用。
針の部分は適当に三角形を作って塗りつぶせば良い。
![スクリーンショット 2021-02-26 20.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/a4051514-1577-fa26-ae6c-c68f59092171.png)

ルーレットの円盤は同心円グリッドツール等を使えばお手軽にできます。
または、円を描いて、直線描画ツールで区切って、
ウインドウ→パスファインダー
でオブジェクトを選択し、「分割」して色を変えるといい感じです。

![スクリーンショット 2021-02-26 20.30.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/b2134e42-2e0c-c1f0-2abb-27fdb56c90f5.png)

![スクリーンショット 2021-02-26 20.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/d6215f9e-5f8c-ea7b-7080-f53827778180.png)

![スクリーンショット 2021-02-26 20.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/bbc72586-ecf6-80f4-d619-cdee4d84b4b3.png)



作った素材(※Adobe Illustratorを使用して作成)
![valueinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/bae5b41e-7782-c6fb-42be-3af1aa77bd23.png)
valueinfo.png

![point2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/6f8060fa-8fa4-7885-f4af-acd37a1386b0.png)
point.png

(aiファイルを上げておきます。お試しで動かす等、自由に使っていただいて構いません。)
https://1drv.ms/u/s!Apotz-GvRNC9gudRPQ9mxTdrjZqHdQ?e=9lNjMq

次にUnityを開きます。インストールがまだの人はインストールしましょう。
使用したバージョンは以下の通りです。

Unity
![スクリーンショット 2021-02-26 20.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/fab5a1ff-48bc-0628-90ab-c233f0d6fa7c.png)
![スクリーンショット 2021-02-27 0.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/24160e83-ca98-9992-acc9-b87adeb891a4.png)

ちなみに、今回はmacOSを使用していますが、バージョン等は以下の通りです。
![スクリーンショット 2021-02-27 0.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/29735a88-ba88-3f5c-d8d7-280615a945f0.png)

Unityが立ち上がったら、用意した素材をインポートします。
![スクリーンショット 2021-02-27 0.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/728b8076-1f8b-4b2e-aef3-a1fe1be7a02d.png)

また、初期状態だと景色がなく味気ないので、Assets Storeから景色をダウンロードして使用する。
今回はこのAssetsを使う。
![スクリーンショット 2021-02-27 0.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/dad5d399-4bb7-3dd6-a7fd-0d2b2441709d.png)

まず、Assets Storeへアクセスし、ダウンロードする。
![スクリーンショット 2021-02-27 0.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/5df47c4b-ca6c-9429-b139-1fa77ebe5989.png)

その後、パッケージマネージャーからダウンロードし、インポートする。
Window→Package Manager→Import
![スクリーンショット 2021-02-27 0.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/e1096283-27cd-e77c-bf53-db821d9ae5df.png)

次に、Oculus関係のパッケージもダウンロードしておく。[^1]
その前に、まず、以下の手順を終えておかなければImportに非常に長い時間がかかってしまうので、順番に気をつけること。

Build Settingsを開いてプラットフォームをAndroidにスイッチする。
![スクリーンショット 2021-02-27 0.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/d2514cd0-e578-39c9-9f32-b90f636c4c5c.png)

ASTC、LZ4に変更してスイッチすること、
![スクリーンショット 2021-02-27 0.27.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/fee3395f-582e-76f5-cf57-ddb7e5df6464.png)

また、PlayerSettingsを開き、次の設定をしておく。

![スクリーンショット 2021-02-27 0.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/660ba0f1-51eb-81df-93b7-0c351fd5df2f.png)

OtherSettings→GraphicsAPIsのVulkanを削除、
ColorSpace→Linearに変えておきましょう。

また、MinimumAPILevelをAndroid6.0 Marshmallow(APIlevel23)に変更しなければなりません。
![スクリーンショット 2021-02-27 0.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/f9a5263b-0251-d414-b283-9d319ad66086.png)

次に、XR Plug-in ManagementでOculusをインポートしておきましょう。
![スクリーンショット 2021-02-27 0.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/698776d9-aa5b-9c09-e38d-567eb3692dd8.png)
チェックを入れると自動的にインポートされますので、チェック間違いに注意しましょう。

最後にOculusIntegrationをインポートします。
Asset StoreにあるOculusIntegrationをプロジェクトにインポートします。

![スクリーンショット 2021-02-27 0.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/7b5c3e63-f1c3-d9db-4d1d-31dc15ed1ecd.png)

![スクリーンショット 2021-02-27 1.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/985f14a5-b4a9-e42c-ddad-3067ba7b830b.png)

![スクリーンショット 2021-02-27 1.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/9ccab7a5-77d0-d037-12f7-3ad538db9307.png)

ちなみに、初回では、OculusIntegrationのインポートに長時間かかります。 
インポートが完了すると ダイアログメッセージが出るので以下のように進んでください。
![スクリーンショット 2021-02-27 1.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/1302d24f-67f0-b16c-e8bc-ecba04f748d9.png)
![スクリーンショット 2021-02-27 1.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/40376c07-0495-7d02-fa59-4da9ec92360d.png)
![スクリーンショット 2021-02-27 1.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/ca4ead07-ed1e-47d1-ce12-0304a1467c6f.png)
![スクリーンショット 2021-02-27 1.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/2c98e19e-6d5e-c9ed-9f00-bfdd6a45f64b.png)
![スクリーンショット 2021-02-27 1.10.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/e2b326f5-a1ec-c1a1-4c4f-b39bed549bd2.png)

ここで、Unityが自動的に再起動します。

以上でOculus関係のライブラリ等のインポートは完了です。

次に、先ほどインポートした「Free HDR Sky」のゲームシーンをCopyしておきます。
![スクリーンショット 2021-02-27 1.16.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/e3697c0b-5f29-789d-9dc9-972c474142ba.png)
ここにあるmainSceneを以下の場所におきます。
![スクリーンショット 2021-02-27 1.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/2260e5d8-f4f9-9d51-91b7-9c5b6aa8e4b4.png)

次に、ControllerModelsにあるOVRPlayerController等をそのまま利用したいので、Copyし先ほどCopyしたmainSceneに貼り付けます。

![スクリーンショット 2021-02-27 1.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/12fb2ff8-4d2d-2b08-764a-5b2950e5391f.png)
![スクリーンショット 2021-02-27 1.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/9d51a5c8-d4d7-807d-734f-b9777fd34dd9.png)

![スクリーンショット 2021-02-27 1.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/941c080a-1151-f169-e051-eef1b87ac42e.png)

貼り付け↓
![スクリーンショット 2021-02-27 1.20.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/5f3aa07f-53f3-be6a-42c5-bc01e5849c4f.png)

ちなみに、囲ってあるRoom等のオブジェクトは足場になるTileオブジェクト(Grabbables等)以外は必要ないので取り除いておきます。
また、Tileのテクスチャーはデフォルトだとダサいので、好みに応じて変えると良いと思います。
![スクリーンショット 2021-02-27 1.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/2b83a79d-fe4b-16dc-2d2e-bc0afe1e4a3c.png)
![スクリーンショット 2021-02-27 1.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/48290daf-454b-ca1f-679c-95a88da749ed.png)
Selectで変更できます。
![スクリーンショット 2021-02-27 1.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/c754832b-3fbe-a664-ca1f-6d119347330b.png)

次に、序盤でインポートしていた占い盤や針等を画面に配置します。
簡単に座標系を示しておくと、
占い盤の座標系は以下の通りです。
![スクリーンショット 2021-02-27 1.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/62df79e4-cfe8-4fdb-1fe6-c8ac9e559048.png)

グローバル座標系は以下の通りです。
![スクリーンショット 2021-02-27 1.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/a77dc455-a480-e41a-b49f-4656b7edfb84.png)

配置には、3Dオブジェクトを追加し、画像を表面に貼り付ける。
![スクリーンショット 2021-02-27 1.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/1f623317-59e8-8fe2-949d-25a6afb597da.png)

![スクリーンショット 2021-02-27 1.53.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/aad4af16-ced5-3a0d-cbc6-c336d5cca170.png)


配置後の様子
![スクリーンショット 2021-02-27 1.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/c6ee43ac-7266-021f-457d-27ec1b9e40ec.png)

最後にスクリプトを書いて、占い盤を制御します。
ちなみに、Oculusのコントローラーの値を取得する場合は次のように記述します。

```c#
if (OVRInput.GetDown(OVRInput.RawButton.A)){
		    Debug.Log("Aボタンを押す(押された瞬間に一度だけTrueを返す)");
	    }
```
詳細は公式サイトをみてください。
https://developer.oculus.com/documentation/unity/unity-ovrinput/

ひとまず、全体像を示しておきます。

```c#:RouletteController.cs

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

public class RouletteController : MonoBehaviour
{
    float xrotSpeed = 0;
    float yrotSpeed = 0;
    float zrotSpeed = 0;

    void Start()
    {   
        this.yrotSpeed = 10;	    
    }

    // Update is called once per frame
    void Update()
    {
	    if (OVRInput.GetDown(OVRInput.RawButton.A)){
		    Debug.Log("Aボタンを押す(押された瞬間に一度だけTrueを返す)");
		    this.yrotSpeed = 10;
	    }

	    if (Input.GetMouseButton(0)){
		    this.yrotSpeed = 10;
	    }

	    transform.Rotate(this.xrotSpeed,this.yrotSpeed,this.zrotSpeed);

	    this.yrotSpeed = this.yrotSpeed * 0.99f;
    }
}
```
ソースコードのアタッチは以下のようにドラッグ&ドロップすれば良い↓
![スクリーンショット 2021-02-27 1.55.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/d9bf7be3-eb95-d012-a577-c8c83ddae335.png)


ちなみに、プログラムはUnityの教科書を参考にしました。[^2]
詳しくは、この教科書を読んでください。
https://www.sbcr.jp/product/4815606657/

最後に動作している様子を上げておきます↓
https://youtu.be/KfKJXmgHHpQ

また、適当ですが、こんな感じにオブジェクトを配置してみるのもいいかもしれません↓
https://youtu.be/A35ygDLtsZU

お疲れ様でした、Unityを使うとこんなに簡単にVRアプリケーションが作れてしまうことに驚きですが、ここから、面白いものを作るのは非常に難しそうです、Unity初心者ですが、これから色々と勉強したいと思います。

間違い、問題等ございましたらご指摘いただければ幸いです。

### 参考
[^1]: 「Unity + Oculus Quest 2 開発メモ」 https://framesynthesis.jp/tech/unity/oculusquest/
[^2]: 「Unityの教科書 Unity 2020完全対応版 2D＆3Dスマートフォンゲーム入門講座」 https://www.sbcr.jp/product/4815606657/