unityで作成したVR空間をoculusに実装する方法-レーザーポインターでオブジェクトを選択する方法-

# OculusとUnityの接続が無茶苦茶ハマる
OculusとUnityの接続に関して、ネット上に数多くの屍が散見します。
その屍を乗り越えて、下のような実装を行ったので、今後の自分のためにもナレッジを残そうと思います。
完成したVR空間がこちら↓
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unityメモ24<br>Oculus上にUnityで作成した空間を表現し、右手のコントローラーからボタンを操作する設定の実装。<br>これはかなりハマった。<br>成功してよかった〜。、ナレッジをQiitaにまとめよう。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><a href="https://twitter.com/hashtag/%E3%82%82%E3%81%84%E3%81%9B%E3%82%93?src=hash&amp;ref_src=twsrc%5Etfw">#もいせん</a> <a href="https://t.co/6aqwe4q8NT">pic.twitter.com/6aqwe4q8NT</a></p>&mdash; Unity勉強中の整形外科医：北城雅照|医療者向けプログラミングスクール「もいせん」開校！ (@teru3_kitashiro) <a href="https://twitter.com/teru3_kitashiro/status/1404615493336502273?ref_src=twsrc%5Etfw">June 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


一応公式ドキュメントも貼っておきますが、このドキュメントを乗り越えるのがムチャクチャ大変です。
どMの方は、どうぞ読みといてください。

##　開発環境
[![Image from Gyazo](https://i.gyazo.com/9042fdc9cd22d8405f6dfa826888987c.png)](https://gyazo.com/9042fdc9cd22d8405f6dfa826888987c)

## Oculusの初期設定
公式ドキュメントは[こちら](https://developer.oculus.com/documentation/unity/unity-enable-device/)
### 1 Oculusアプリをスマホに入れ、Oculusの初期設定を行う
この際に、facebookアカウントとリンクさせると、その後の設定がスムーズになります。
### 2 アプリからデバイスを選択し、その他の設定から開発者モードをオンにする
これをオンにすることで、自分が作ったアプリをOculus上に上げることができます。
### 3 PCとOculusを接続し、PCとのデータのやりとりをOculu上で許可する
この設定により、PCから作成したVR環境のデータをOculusに送信することができます。

### Unityの初期設定
公式ドキュメントは[こちら](https://developer.oculus.com/documentation/unity/unity-conf-settings/)
### 1 プロジェクトの立ち上げ
[![Image from Gyazo](https://i.gyazo.com/57ffe1218c23f515319ff72da61c35c5.png)](https://gyazo.com/57ffe1218c23f515319ff72da61c35c5)

### 2 ビルド設定を修正
「テクスチャ圧縮」をASTCに変更
「デバイスを実行」を一度refreshを押した後に、自分のデバイスが選択できるようになるので、自分のデバイスを選択
その後「Switch Platform」を選択
終了後、左下の「Player設定」を選択
[![Image from Gyazo](https://i.gyazo.com/f31aa6fc129544f7310af0b1ef0f83a0.png)](https://gyazo.com/f31aa6fc129544f7310af0b1ef0f83a0)

### 3 Player設定を修正
企業名とプロダクト名を固有のものに設定
[![Image from Gyazo](https://i.gyazo.com/6ba38d202ddac0ff7f2dabc9830402c2.png)](https://gyazo.com/6ba38d202ddac0ff7f2dabc9830402c2)

最低APIレベルを「Android 6.0」に設定
[![Image from Gyazo](https://i.gyazo.com/3b687197617882abc9f98fd46875f8b1.png)](https://gyazo.com/3b687197617882abc9f98fd46875f8b1)

### 4 XRPlugin Managementのインストール
[![Image from Gyazo](https://i.gyazo.com/c14d0269fe660423cb0b72061bc72139.png)](https://gyazo.com/c14d0269fe660423cb0b72061bc72139)

インストールが完了すると下図のような設定になっていればOK
[![Image from Gyazo](https://i.gyazo.com/5459274eeb25e9b464d0e5af567e7e4c.png)](https://gyazo.com/5459274eeb25e9b464d0e5af567e7e4c)
[![Image from Gyazo](https://i.gyazo.com/28ea15054c26914e596db5597cd3cb58.png)](https://gyazo.com/28ea15054c26914e596db5597cd3cb58)
[![Image from Gyazo](https://i.gyazo.com/c52d7c4dbb39708fa1ea5a04f0bfc943.png)](https://gyazo.com/c52d7c4dbb39708fa1ea5a04f0bfc943)

### 5 Oculus Integration（Oculus統合パッケージ）のインストルール
**＊必ず上記の設定が終了してからOculus Integrationをインポートしてください！！！
もう一度書きます！
必ず上記の設定を終了させてからOculus Integrationをインポートしてください。まじでハマります。**

公式ドキュメントは[こちら](https://developer.oculus.com/documentation/unity/unity-import/)
アセットストアで「Oculus Integration」と検索し、左下のOculusのマークのパッケージをUnityにインストール＆インポート。
[![Image from Gyazo](https://i.gyazo.com/97df8ea3ad26070a27dab03b78822c0a.png)](https://gyazo.com/97df8ea3ad26070a27dab03b78822c0a)
インポートを軽くするために、Avatar,LipSync,SampleFrameworkのチェックを外しておく。
[![Image from Gyazo](https://i.gyazo.com/cd3a49cd78163d6a4b5089a5e43f1671.png)](https://gyazo.com/cd3a49cd78163d6a4b5089a5e43f1671)
インポート中にアップグレードを勧められるの、全て「yes」を選択。UnityがRestartされる。


##  VR環境の構築
### 1 OVRGazaPointerをprehab化する。
Sceneの中のUIを選択[![Image from Gyazo](https://i.gyazo.com/5f46f9c4ba080539e6e15b5aa3a67d32.png)](https://gyazo.com/5f46f9c4ba080539e6e15b5aa3a67d32)

Hierarchyの中のOVRGazaPointerをPrefabsの中にドラック＆ドロップする。
[![Image from Gyazo](https://i.gyazo.com/dc3f07784271f0d74de5532a4c8f4d29.png)](https://gyazo.com/dc3f07784271f0d74de5532a4c8f4d29)

### 2 OVRCameraRigの設定
#### 1)　新しくSceneを作成し、Hierarchyの中に、prefabsからOVRCameraRigをドラック＆ドロップする。
#### 2)　元々あったMian Cameraは削除する。
[![Image from Gyazo](https://i.gyazo.com/8a3376d28866c9c8a9eb07e2a730815d.png)](https://gyazo.com/8a3376d28866c9c8a9eb07e2a730815d)
#### 3)　OVRCameraRig/TrackingSpace/RightHandAnchor/RightControllerAnchorの下にPrefabsからOVRControllerPrefabをアタッチする。自動的にコントローラーとしてR Tracked Remoteが設定される。
[![Image from Gyazo](https://i.gyazo.com/893ad16a98e298251939f55651c99c25.png)](https://gyazo.com/893ad16a98e298251939f55651c99c25)

### 3 uGUIを構成する
#### 1 Canvasを作成
[![Image from Gyazo](https://i.gyazo.com/01dd7d1c0a1f36310cb2add545471e39.png)](https://gyazo.com/01dd7d1c0a1f36310cb2add545471e39)
Canvasのインスペクターを以下のように設定する。
##### 1)CanvasのRender Modeをスクリーンスペース・カメラに変更。
##### 2)CanvasのEventCameraをOVRCameraRig/TrackingSpace/CenterEyeAnchorに設定。1)と2)よって常に正面にCanvasが設定されるようになる。
##### 3)CanvasのGraphicRaycasterコンポーネントを削除。
##### 4)CanvasにOculus/VR/Scripts/UtilのOVRRaycasterを追加。
##### 5)OVRRaycasterのBlocking Objects欄を"すべて"に変更。
以下のようになればOK
[![Image from Gyazo](https://i.gyazo.com/43df3e0b2f0b1a23c29e603d8d2f528f.png)](https://gyazo.com/43df3e0b2f0b1a23c29e603d8d2f528f)

#### 2 OVRGazaPointerの設定
##### 1)PrefabsからOVRGazaPointerをHierarchyにドラック＆ドロップする。
[![Image from Gyazo](https://i.gyazo.com/6bb88733ed71e94c9d5388105916fe6e.png)](https://gyazo.com/6bb88733ed71e94c9d5388105916fe6e)
作成したOVRGazePointerのRay Transform欄は、OVRCameraRig/TrackingSpace/RightHandAnchorを設定する。
[![Image from Gyazo](https://i.gyazo.com/d56febabe4ed8355f39b39439707744e.png)](https://gyazo.com/d56febabe4ed8355f39b39439707744e)

#### 3 EventSystemの設定
##### 1)EventSystemからStandaloneInputModuleコンポーネントを削除
##### 2)EventSystemのOculus/VR/Scripts/UtilのOVRInputModuleを追加
##### 3)OVRInputModuleのRay TransformにOVRCameraRig/TrackingSpace/RightHandAnchorを設定
##### 4)カーソルにOVRGazaPointerを設定
##### 5)Joy Pad Click Keyにone(Aボタン),Two(Bボタン),Secondary Index Trigger(Triggerボタン)を設定し、作動するボタンを設定する。
以下のようになっていればOK
[![Image from Gyazo](https://i.gyazo.com/77d6ac66642da7f113176a85f3cb94e4.png)](https://gyazo.com/77d6ac66642da7f113176a85f3cb94e4)

#### 4 UI部品を設置
試しにボタンを設置する設定を記載します。
##### 1)CanvasにButtonを設置。
##### ２)AssetsにButtonAction.csを作成し、以下のスクリプトを追加。

```C#:ButtonAction.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonAction : MonoBehaviour
{
    [SerializeField] Image image;

    public void OnClick()
    {
        image.color = Color.red;
    }
}
```

##### 3)Button ObjectにButtonAction.csを設定
##### 4)クリック時のイベントにButtonAction.OnClickを設定

## Build & Run
作成したVR空間をOculus上に表見するために、Build & Runを行います。
「デバイスを実行」は自身のデバイを選択してください。
[![Image from Gyazo](https://i.gyazo.com/3a0841d5e7f05f113f7fabd0a306e819.png)](https://gyazo.com/3a0841d5e7f05f113f7fabd0a306e819)

完成したVR空間がこちら（再掲）↓
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unityメモ24<br>Oculus上にUnityで作成した空間を表現し、右手のコントローラーからボタンを操作する設定の実装。<br>これはかなりハマった。<br>成功してよかった〜。、ナレッジをQiitaにまとめよう。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><a href="https://twitter.com/hashtag/%E3%82%82%E3%81%84%E3%81%9B%E3%82%93?src=hash&amp;ref_src=twsrc%5Etfw">#もいせん</a> <a href="https://t.co/6aqwe4q8NT">pic.twitter.com/6aqwe4q8NT</a></p>&mdash; Unity勉強中の整形外科医：北城雅照|医療者向けプログラミングスクール「もいせん」開校！ (@teru3_kitashiro) <a href="https://twitter.com/teru3_kitashiro/status/1404615493336502273?ref_src=twsrc%5Etfw">June 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>