「Standalone VR Meetup #01」のメモ

# 概要

[Standalone VR Meetup #01 - connpass](https://standalone-vr.connpass.com/event/121923/) の自分用メモです！
各種リンクなど間違っていましたらコメント頂けると幸いです。

# VR焚き火シミュレータの技術と工夫

[oreno_dinner(@oreno_dinner)さん | Twitter](https://twitter.com/oreno_dinner) さん。
[BONFIRE~焚き火~ - oreno.dinner.Store - BOOTH](https://orenodinner.booth.pm/items/952450) について。
資料: [190318_VR焚き火の技術と工夫.pdf - Speaker Deck](https://speakerdeck.com/orenodinner/190318-vrfen-kihuo-falseji-shu-togong-fu)

- VRMを外部ファイルから読み込める
- 音声ファイルを朗読させることが出来る
- モデルは全てBlenderで自作 (初めて使ったが問題無かった)
- 複数のアセットを混ぜるより自作モデルのほうが世界観統一出来る
- ローポリゴンでも、ライトとシャドウは重要
- ライティング負荷が高いが、これは外せなかった (クオリティに関わる)
- 3DoFだとバイノーラル音源がそのまま使える
- Virtual Virtual Reality と Dead and Buried のコントローラ入力を参考にした
- 例えば、タッチパッドフリックによるコントローラモードの変更等
- 見た目より動きを重視する
- 予告は大切、ある動作の前には何かの効果を付ける (ラインや音の変化等)
- 薪火に集中させる物の配置
- αテスト超大事、操作方法の変更はリリース前のが絶対良い

## 軽量化について

- Start() で可能な限り先読み
- シーン開始時の負荷はフェードインでごまかす
- マルチスレッドレンダリングとシングルパスステレオレンダリングがかなり効く
- OnCollision判定 (重い) より速度変化で反応する方が処理が軽い
- 人は動きには敏感だが変化には鈍感なので処理を間引く
- 間引いた処理が重ならないように、処理共通カウンタを作って重ならないようにした

#  Oculus Storeへの申請で、初心者のわたしがハマった5つのポイント（Oculus Go向け）

[tamu(@tamusan100)さん | Twitter](https://twitter.com/tamusan100) さん。
資料: [Oculus Storeへの申請で、わたしがハマった5つのポイント（Oculus Go向け） - Speaker Deck](https://speakerdeck.com/tamusan100/oculus-storehefalseshen-qing-te-watasikahamatuta5tufalsehointo-oculus-goxiang-ke)

- キーの承認のみしか出来ず、ストアには並べて貰えなかった
- Oculusに申請するとどうなるか、まずテクニカルレビューを丁寧に貰える
- レビューを順番に直していけば良い
- 1つ目、Backボタンに対応しなければならない
- `OVRManager.PlatformUIConfirmQuit()` をバックで実行するだけで良い
- 2つ目、利き手対応をしなければならない
- 直接 RightHandAnchor を指定しているのが駄目
- `OVRInput.GetActiveController()` で利き手を検知する
- 3つ目、過度にユーザ権限を要求してはいけない (オーディオ・マイク等)
- OculusIntegration はデフォルトでマイク権限を勝手に要求してしまう
- マイク権限を求めるスクリプトを削除したら対応出来た
- 4つ目、再び利き手対応、設定不足だった
- 5つ目、限られたコンテンツだと言われてしまう
- ボリューム不足だということの可能性が出た (ステージが1つしか無い等)
- また、ホラー風だったのが駄目だったのかと思ってレーティングを変えたら通った

## 参考になったリンク

- [Common Oculus Store Review Submission Issues | Oculus](https://developer.oculus.com/blog/common-oculus-store-review-submission-issues/)
- [Oculus Discussion Forums](https://forums.oculusvr.com/community/discussions)
- [Oculusデベロッパー助け合い所](https://www.facebook.com/groups/1535715303335703/)

#  VR展示しようぜ！〜様々なケースで展示してわかったノウハウっぽいもの〜

[さわぐち@VRとか教育とか(@amidaSawaguchi)さん | Twitter](https://twitter.com/amidaSawaguchi) さん。
[Tiny Magic Carpet | Oculus](https://www.oculus.com/experiences/go/2249360641769891/)やギロチンVRの人。
資料: [VR展示しようぜ - Google スライド](https://docs.google.com/presentation/d/1mI2Z1Yr13d79q2Hi0JT0PD1TKHXaq9I63UFeZUKSVeo/edit)

## 展示へ向けた開発
 
- コンテンツに「始まり」と「終わり」を設ける (どこで外せば良いか分からない)
- 操作やUIは可能な限り削る、コントローラの説明は未経験者には難しい
- 操作説明はコンテンツ内にも実装、VR被ってから何をすれば良いか分かるようにする
- 展示でもFPS意識しておく、ローポリモデルとMobileシェーダーを使用
- リアルタイムライティングは1つが限界影が必要なら焼く
- パフォーマンスに意識すると展示中のバッテリー持ちも良くなる
- VR酔いは対策しておく、[VRコンテンツ開発ガイド 2018 | Amazon](https://www.amazon.co.jp/VR%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-2018-%E3%81%82%E3%82%8B%E3%81%97%E3%81%8A%E3%81%86%E3%81%AD/dp/4844367846/ref=sr_1_1?ie=UTF8&qid=1552907123&sr=8-1&keywords=vr%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89)、[Introduction to Best Practices](https://developer.oculus.com/design/latest/concepts/book-bp/)が参考になる
- 類似コンテンツはプレイしておくと参考になる

## 展示準備

- 被らなくてもコンテンツが分かる物を用意しておく
- 例えば、録画済みの物を垂れ流す、操作説明の紙等
- 衛生面には気を配ろう
- 展示前にフェイスカバーは洗っておこう
- ニンジャマスク、ウェットティッシュは必ず用意しておく
- コンテンツ次第ではヘッドバンドは取っておいた方が良さそう
- 複数台インストールはOculus開発者センターにアップしとくと便利
- 余裕があればアンケート用意

## 展示中

- 前髪で画面がブラックアウトする
- 屋外展示でレンズが焼ける
- 充電を忘れる
- 夏場の屋外は汗がヤバイ
- Oculusアプリのミラーリングはうまく行かなかった
- 人間では無い何かがプレイする場合もある

# 開発中アプリをOculusGoへ自動ビルド＆配信

[ふーなん(@kannan_xiao4)さん | Twitter](https://twitter.com/kannan_xiao4) さん。
クラスターの人。
資料: [20190318_開発中アプリをOculusGoへ自動ビルド_配信.pdf - Speaker Deck](https://speakerdeck.com/kannan_xiao4/20190318-kai-fa-zhong-apuriwooculusgohezi-dong-birudo-pei-xin)

- ビルドとデプロイは自動化しておきたい
- 開発PCにつないでもらうの面倒くさい
- 少なくともチーム内では気軽に試せる状態にしておきたい
- apkを作るだけなのでビルドは特に問題ない
- UnityならAndroidBuildスクリプトをそのまま使える
- DeployGateを使うことも出来るが、推奨では無い
- adb install は面倒、Oculusのリリースチャンネルを使うのが順当 (公式サポート)
- Apk Signing をしておく、BundleVersionを指定する必要がある
- 開発者モードにする必要は無い
- [Oculus Platform Command Line Utility](https://developer.oculus.com/distribute/latest/concepts/publish-reference-platform-command-line-utility/) を使うとターミナルからアップ可能
- app_idとapp_secretはデベロッパーサイトの「APIについて」から確認可能

## DeployGate とは

- 開発中アプリの配布が簡単に出来る (無料)
- AndoirとiOS対応
- webサイトからバイナリアップロード可能
- デバッカーやビジネスサイドに簡単にアプリを試してもらえる
- APIが提供されており、CLIからアップロード出来てめっちゃ便利
- OculusGo でも使いたいと思っていたらサポートされてないが使える方法があった
- DeployGateをOculusGoで使う方法については下記写真参照 (写真貼る)
- OculusTVの非公式な使い方をしている
- 普通のAndroidアプリみたいにOculusGoのアプリが配布出来る
- DeployGate apk を adb install するので開発者モードにする必要あり
- BundleVersionやApk Signingをする必要が無い

![image](https://i.gyazo.com/57bd7c5c65ca6c1ad369cdf72f2b8859.jpg)

# 初めてOculusでアプリを作る際にデバッグで気を付けたこと

[ナナキ@ Standalone VR Meetup(@nanaki_pg)さん | Twitter](https://twitter.com/nanaki_pg) さん。

- 実機でConsoleログを取るのが難しい
- ADBでログを探すのは大変
- OculusGo内でもログが見えるようにしたい
- `logMessageReceived` に `OnLogMessage` イベントハンドラを追加
- これで任意の場所に Canvas でエラーを表示
- 他の人にテストしてもらう時もSSをエビデンスにして貰うことが出来る
- SiwtchのコントローラがOculusGoのコントローラとして利用可能らしい

## 軽量化について

- FPSを表示出来るように実装
- DrawCall に気をつける
- DrawCall 70の時、OculusGoでは40FPS代になり始める
- GameObject を静的オブジェクト(Static) にすることでバッチを減らした
- メモリープロファイラーを使用してメモリを食っているところを調整する
- DeepProfiler を利用することで原因を探すことが可能
- Debug.Log() のコールが 500 まであったのが原因

# 被らないOculus Goアプリを作ってみた&デバイスを持ち運ぼう

[しちE(@shichi_14)さん | Twitter](https://twitter.com/shichi_14) さん。 ([作ったVRアプリ](https://twitter.com/i/moments/916069846894354432))
資料: [被らないOculus Goアプリを作ってみた & デバイスを持ち運ぼう - Google スライド](https://docs.google.com/presentation/d/1gjRFl-ZUoDRcnPbRx2zkkgjwuY0BY9-Dx9V0MDlCLeM/edit#slide=id.g1276827f2e_0_5)

- OculusGo はスタンドアロン,3DoF, コントローラ, ヘッドホン, 安価
- この中でヘッドホンに注目、ヘッドホンから音出せば楽器になるのでは？？？
- OculusGo を振ったら音が出るアプリを作った → スマホでも出来た
- スマホと同じでは...？いや、OculusGo にはコントローラがある！！！
- コントローラを振っても音がなるようになった！！！！！
- OculusGo はどうやって持ち運ぶ？「カバンに直入れ」が一番多かった
- 無印のメイクボックスやカメラボックスに入れる人もいた
- Mirage Solo は固めの箱に入れる人が多い
- 両方持ち運ぶには、「Mirage Solo ケース」を買う
- Mirage Solo と OculusGo とニンジャマスクとコントローラが全部入る！
- ただ、網棚にケースを置いておいたらそのまま忘れてきてしまった

# USBシリアル通信で外部デバイスを動かしてみた

[組長＠白井圧(@kumi0708)さん | Twitter](https://twitter.com/kumi0708) さん。

- [ゆるUnity電子工作部(@kosaku360)さん | Twitter](https://twitter.com/kosaku360)
- 腹筋VRで女の子に雑な感じに踏んで貰いたかった → 肩もみ機をハック
- マイコンボードから制御出来るようにした
- 元々 HTC VIVE 用だったが、重いので Mirage Solo に移植したかった
- ただ、Unity5.5 から Unity2017 にしなければならなかった
- Unity のアップデートでシェーダ周りがおかしくなったり、外部ライブラリに変更があったりした
- Android コンパイルに対応させる為に #ifdef で切り分けて対応出来た
- Mirage Solo の充電用の USB C に USB OTG を指すことでデバイスの認識は可能
- これは OculusGo でも同じ
- Androidでシリアル通信に対応する必要がある (これが一番大変だった)
- USBシリアルの石毎に初期化が違うのでプログラムで吸収する必要があった
- 詳しくは[サークル詳細 | ゆるUnity電子工作部 | 技術書典6](https://techbookfest.org/event/tbf06/circle/36280014)で販売予定

# 客観的リアリティと主観的リアリティ

[桜花一門@OculusGo用VR会議、桜花広場 作成中(@oukaichimon)さん | Twitter](https://twitter.com/oukaichimon) さん。
資料: [客観的リアリティ と 主観的リアリティ - Google スライド](https://docs.google.com/presentation/d/14g7eRXIp9O-Rg6ssTMOHlZlB2BXBULDqLFJWgRV3E4w/edit#slide=id.g5226b472e6_2_0)

- 客観的: 他人が体験しているのを自分が見る
- 主観的: 自分が体験する
- 悲しい気分にさせたければ、ペットが死んで悲しい人の姿を見せれば良いだけ
- ミラーニューロンが悲しんでる人と同じ状況にする
- 主観でやると、知らない生き物が死んでいてただ気持ち悪いだけ
- 主観と客観の何が違うの？
- 客観的リアリティに必要なのは視覚、聴覚
- 主観的リアリティに必要なのは記憶、猫に掛けた時間と金
- 主観と客観では求められているものは違う
- 客観で求められている物: 映像をリアルに、音を良くする、物語などえ対象に感情移入させる
- 主観で求められている物: 記憶の形成、記憶を呼び起こさせられる物
- 今のVRは制約が多すぎて主観的リアリティが出しづらい
- SAOのキリトさんかっけーは客観、SAOを実際に作っても面白くない (剣を振る等)
- VRでヤンキーの後輩を作った方が面白い

# まとめ

スタンドアロンVRの知見はまだまだ少ないのでめちゃめちゃ勉強になりました！
主催して下さった [あまおか@xRエンジニア(@like_amaiokashi)さん | Twitter](https://twitter.com/like_amaiokashi) さん本当にありがとうございます！
(勢いで Qiita にアップロードしましたが、もし適切で無いようであればブログの方に移転します)