nrealアプリを作りたい人がはじめに読む記事（随時更新中）

## 本記事について
本記事では、nrealアプリ開発に関して、機器セットアップ～アプリ開発、参考情報などを随時更新しています。個人的な備忘録のような記事になるか思いますが、これからnrealアプリの開発をはじめる方々の参考になれば幸いです。

## デバイスセットアップ
### デバイス設定から本体の起動まで
nreal lightを開封すると、本体、付属品と、クイックスタートガイド（小さな冊子）が同梱されています。
クイックスタートガイドを見ると使用するまでの手順が書いてあると思いきや、デバイスのスイッチなどの説明、付属品の付け方が書いてあるだけで、本体を起動して使用するまでの手順は書いていません。
そのあたりの手順は公式サイトにも見当たらなかったのですが（見つけた方コメントください）、[こちらの記事](https://qiita.com/mhama/items/a79834c39606d1c40ee3)で事細かに解説されているので、こちらを参考にしましょう。
また、「ランプが点灯しているけどどういう意味？」「Wifiへの接続どうするの？」といった動作、設定に纏わる情報は[公式のFAQ](https://developer.nreal.ai/faq)で紹介されてるので、設定の類はFAQを読みましょう。

### Computing Unitのセットアップ
Nreal Computing Unitは画面のないAndroidデバイスであるため、Android開発者におなじみのadbコマンドなどを使用して設定をすることができます。ただ、より簡単に設定をしたい場合は[scrcpy](https://github.com/Genymobile/scrcpy)を使うのが圧倒的に簡単なのでオススメです。
scrcpyを簡単に説明すると、PCに接続しているAndroid端末の画面を表示し、操作できるようにしてくれるツールです。またアプリのインストールも画面上にapkファイルをドラッグ＆ドロップするだけでできてしまう優れモノです。。
[公式のFAQ](https://developer.nreal.ai/faq)で紹介されている設定手順の中に、scrcpyを使った操作で説明しているものもあるので、インストール必須のツールと思っていた方が良いでしょう。

## 開発環境
### 動作したUnityとNRSDKが組み合わせ
nrealの開発環境は、各ツールの最新版を組み合わせてもうまく動作しないことがあります。
nrealがサポート、動作確認したバージョンの組み合わせで使用する方が吉。
以下は、デモアプリのビルド＆実行まで動作できた組み合わせです。

|#|Unityバージョン|NRSDKバージョン|
|---|----|----|
|1|2018.4.24f1|1.2.1|
|2|2020.3.33f1|1.8.0|

## 用語に関する補足
・NRInputのRaycast Modes は、「Gaze」「Lazer」。[公式の説明](https://developer.nreal.ai/develop/unity/controller)だとLazerはRay Modeと記述されている。

## 公式デモの動かし方
* 基本的には[公式クイックスタート](https://developer.nreal.ai/develop/unity/android-quickstart)に従って進めれば大丈夫。以下、補足。
    * Player Settingsの設定をする前に、Build Settingsでプラットフォーム Androidを選択し、Switch Platformをしておくこと。
    * 2020/7/13時点では、Unity 2018.4.x、NRSDK1.2.1を使用する前提の手順になっている。異なるバージョンを使用する場合は適宜読み替えること。動作しなかったらツールのバージョンを疑ってみるのが良い。

## プログラミングTips
### カメラの使用方法
Unityを使ってPC／スマートフォンのカメラを使用する場合は、Unityが提供している [WebCamTexture](https://docs.unity3d.com/ja/current/ScriptReference/WebCamTexture.html) を使用するケースが多いと思います。が、nreal lightのカメラを使用する場合は、WebCamTexture ではなく、NRSDKが提供している NRRGBCamTexture を使用します。（NRRGBCamTextureは、2020/7/20時点では公式リファレンスに記載がないクラスです。詳細はソースコードを見ましょう）
NRRGBCamTextureは、公式サンプルの[RGB Camera](https://developer.nreal.ai/develop/unity/rgb-camera) で使用しています。ただ、公式ドキュメントにはあまり記述がないので、ソースコードを見た方が早いです。
ざっくり、WebCamTextureとの使い方の違いですが、WebCamTextureがTextureクラスを継承しているのに対して、NRRGBCamTextureはTextureを継承していません。NRRGBCamTextureからTextureオブジェクトを取得したい場合は、NRRGBCamTexture#GetTextureメソッドを使用して取得します。

```csharp:NRRGBCamTextureからTextureオブジェクトを取得する方法
    NRRGBCamTexture nrRgbCamTexture = new NRRGBCamTexture();
    Texture texture = nrRgbCamTexture.GetTexture();
```

あと細かい点ですが、Textureのwidth、heightは、GetTexture().width/heightで取得しても良いですが、NRRGBCamTexture.Width/Heightでも取得可能です。

### 平面検出をOFFにする方法
そもそも平面検出は実装しなければ検出されないのですが、NRSDKのデモでは既に平面検出が実装されているものもあります（HelloMRシーンには実装済みです）。そのため、NRSDKのデモをベースにアプリを作る場合に平面検出が不要なら、その実装を無効、または削除すれば平面を無効にできます。
平面は、NRFrame#GetTrackablesによって検出することができます。NRSDKのデモでは、PlaneDetectorというスクリプトで実装されており、同名のGameObjectにアタッチされています。
そのため、シーンに設定されているPlaneDetectorを無効にすることで平面検出をOFFにすることができます。

|![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43330/f401cb43-5c27-efab-01ba-3e4a3e6c150a.png)|
|:---:|
| *HierarchyからPlaneDetectorを選択、Inspectorで無効にする* |

## ちょっとした気付き（Tipsほどボリュームがないもの）
* IPointerDownHandlerはコントローラのTriggerボタンをハンドリングしていて、他のボタンには反応しない。（おそらくIPointerUpHandlerも）
    * Trigger以外のボタンのハンドリングをしたい場合は、Updateイベントで、NRInput.GetButtonDownをハンドリングする。 


## 課題
~~NRSDK 1.3.0 でビルドしたアプリはエラー「Glasses connect error.Please connect the device correctly」が表示されて起動しない。
    * (21/5/17)[こちら](https://note.com/nreal_first/n/n28da0d602a0d) にNRSDK 1.4.8で同事象の対応をされたという記事を発見。事象の原因はやはりデバイス側のファームウェア？がNRDSKに対応していないからという理由のよう。記事の中ではデバイス側にController Unitのほうにアップデートアプリを入れて対応しているようなのだけど、アプリのリンク先が切れているために、現状対応できず。~~
→(22/4/30) 遂に解決策発見。アップデート用のファームウェア（.apk）が提供されているので、adb install後、scrcpyなどで接続、「Update」アプリを実行することでアップデートNRSDKのアップデートに成功。
[Where are the Nreal System Software Update Files (.apk)](https://community.nreal.ai/t/where-are-the-nreal-system-software-update-files-apk/357)
[Specification of OTA cannot be Upgraded](https://docs.google.com/document/d/1gMKD-dbEMd58zMNDCAPSGiQv8L0JSyarTUFpcHw9zjc)
22/4/30時点でのファームウェアのバージョンは以下の通り。
|Nreal システムバージョン|Glasses Firmware Version|
|---|---|
|SDM845-202109120110-927|3.1.04.008.20200922|

* （8/10）Controllerのボタン位置が公式ドキュメントと異なる。[Controller](https://developer.nreal.ai/develop/unity/controller)の写真だとコントローラの上部がApp Button、下部がHome Buttonとなっているけど、NRSDK->Demo->Input-ControllerInfoを動かしてみると、各ボタンを押したときのApp/Homeの位置が逆になっている。

## 参考情報
1. [公式ドキュメント](https://developer.nreal.ai/develop/discover/introduction-nrsdk)
1. [公式FAQ](https://developer.nreal.ai/faq) 
    * 開発資料を読む前にこっちを読んだ方が良い。デバイスの起動方法や、ランプ点滅の意味など細かく説明されている
1. [Nreal Light Developer Kit開発手順（サンプルシーンの起動まで）](https://note.com/shuntaro20/n/n3bc4bbcd3cb8)
1. [Nreal / 3Dモデル表示と平面検出とコントローラ操作](https://note.com/npaka/n/n191653303cea#HCEgM)