Unity2017.1×HTC vive開発メモ(標準機能のみ)

絶対にSteemPluginを使わないという確固たる意志。

#自己紹介
Unityで３Dゲームをリファレンスとか先人のサイトとか参考にしながらAsetStore使いまくって一本完成させたぜレベルの技術力の大学生。

#何をしたのか
Unity標準機能(VRSample含む)とHTC viveでクレー射撃みたいなの作った。

#動機
研究室にHTC viveがあったから。

#使った機能
- ゲイズ(視線)
- コントローラー

#陥った罠とか
##個人でPSVR＋Unity開発はどう頑張っても(たぶん)無理
PSVRの開発ライセンスは法人でしかとれないので
PSVR＋SteemVR ＋TrinusPSVR＋Unityでどうにか動かねえかなと思ったんですけど動かなかった。
具体的には、画面は映るんだがUnityにVR機器として認識されないので再生してもVRモードにならない。没。


##ゲイズ取得は軽い気持ちで自作してはいけない。
３Dでのゲーム制作経験があるからってそのノリで書いてると死ぬ。
多分詳しい人なら当たり前なのだろうが、まずScreanPointToRayは無力。そしてVRに映る画面はScrean扱いできないので
`Ray = new Ray(x座標,y座標)`
みたいな形で指定して出さなきゃいけないがそれもなんか上手くいかなかった。よっぽどのことが無い限りVRSample使うが吉。
自作したい場合は、下のレーザーポインターを作った記事や視線コントローラーの記事なんかが役に立つんだと思うが理解してる時間がなかった。

##Unity.VR使うかSteemPlugin使うか
どっちでも良い、というかSteemPlugin使った方が参考サイトが沢山あるし振動使えるので分かりやすいのでは。
ただ、UnityのVRSampleで使ってるギミックに興味があるなら、落とせばサンプルシーン入ってるのでVRSampleは使える。
今回Unity.VR使ったのは意地。
###Unity2017.1でのエラー
Unity2017.1でVRSampleｗ開くと`UnityEngine.XR`使ってるすべてのスクリプトでエラーが吐かれる。2017.3は大丈夫だった。
だいたいはサンプルシーン用のスクリプトなので、その部分だけコメントアウトしてしまえば使える。間違っても消さないように。(やった)(不都合が生じる)

##Unity VRSampleの使い方で詰まったところ
各種解説は下の公式が出してるインタラクションとかその解説とかUnity　VRsampleを読む記事とかを参考のこと。
###VRIntaractiveItemとかの関数を使うには名前空間を呼ぶ
使えるクラスや関数は沢山あるが、使うためには`using VRStandardAssets.Utils;`をC#ファイルの冒頭に書いておかなくてはならない。これを書いてさえ置けば`m_InteractiveItem.IsOver`とか記述するだけでゲイズが乗ってるかどうかの判定が取れたりする。
###Eventの使い方
>Eventの名前　+=　Event発生時に呼ぶ関数の名前

これでいいのか不安。`ExampleInteractiveItem.cs`使うと良いと思う。使わなくても目を通す価値あり。
###VR Eye Raycaster + VR InteractiveItemでひっかかったこと
Rayを照射される側のオブジェクトにVRInteractiveItemがふたつついていると上手く動かない。開発中謎に分裂することがあった。

##VRでのUI・レティクルとか
まずCanvas上にあるものはVRで実行すると見えない。というか、プレーヤーに近すぎるものは見えない。CanvasをWorldSpaceにして、z座標をいい感じに調節する。
そして、大きいものも見えない。ここの3Dと違うとこ。どのくらい小さくするかというと**0.1とかそのくらい**。Textは**フォントサイズ１**くらいだった。
レティクルは、「GUIのImageをターゲットオブジェクトの座標に表示する」という形で実装する。つまりZ軸が存在する。3DだったらCanvasの二次元上に表示しておけばいいが、WorldSapceにしてあってもそれをやるとVRで見た時視界のすべてをレティクルで覆うことになる。
VRSampleについてる`Reticle.cs`が法線ベクトルによる回転までサポートしてて優秀なのでそれをMain Cameraにアタッチしちゃうと吉。
>※法線ベクトルによる回転
VR時のレティクルは、カメラ中央につけちゃうと見えないので、「Rayを照射して当たったオブジェクトの位置」に描画するようにするのだが、
物体を横から見ている時はレティクルを回転させないとレティクル自体も横から見ることになってしまう。そしてレティクルはただのImageで厚さがないので横から見ると見えない。
そこで、「レティクルだけは常にユーザーの方に正面が向くよう回転させる」という処理が必要。この時使うのが法線ベクトル。

レティクルのImageがあるCanvasはMain Cameraの子オブジェクトにしてしまう。

また、CanvasがWorldSpaceの時のTextのぼやけはCanvasScalerのふたつのパラメータのうち上の方をいい感じに上げると解決する。



##HTC viveコントローラーをSteemPluginなしで取得する
[Unity公式のマニュアル](https://docs.unity3d.com/ja/current/Manual/OpenVRControllers.html)にIDが書いてあるので、それをUnityのEdit>PlojectSetting>inputから好きなものに割り振り
axis系(倒し具合によって入力数値が変わるボタン等)はTypeをJoyStick axisに、button系はKey or Mouse Buttonにし、button系はID名をPositive Buttonに入力する(IDが数字の場合は`joystick button 数字`の形)
あとはInputクラスの関数で呼べる。ボタン名はInput ManagerにてNameの部分に登録した名前。





#参考にしたもの・したかったもの
- Unity5.3のVR機能(インタラクション) | TaoVisor http://taovisor.com/news/unity-interaction-vr/
- VRでのインタラクション｜Unity公式チュートリアル　https://unity3d.com/jp/learn/tutorials/topics/virtual-reality/interaction-vr#anchor
- Unity VRSamplesを読む https://qiita.com/neon-izm/items/ad184bbe8efcaa98b052
- 【Unity】VRレーザーポインター（ビーム）を作る http://fantom1x.blog130.fc2.com/blog-entry-259.html
- 102 1 視線コントローラー　https://github.com/yumemi-inc/vr-studies.wiki.git
- unity+htc vive開発メモ　https://framesynthesis.jp/tech/unity/htcvive/
- 【UnityではじめるVR開発！】VRに適したUI設計（2/3） https://vracademy.jp/blog/?p=967
- VRでのユーザーインターフェース https://unity3d.com/jp/learn/tutorials/topics/virtual-reality/user-interfaces-vr
- Unity標準のVR機能（UnityEngine.XR）メモ　https://framesynthesis.jp/tech/unity/xr/#ボタン-トリガーの状態を取得するには
- [Unity] データを保存する(外部ファイルCSV) https://high-programmer.com/2017/12/10/unity-savedata-otherfile/
- 【Unity】シーン間でスコアを共有　まとめ - テラシュールブログ http://tsubakit1.hateblo.jp/entry/2015/11/07/024350

- http://tsubakit1.hateblo.jp/entry/20140613/1402670011#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E8%A6%9A%E3%81%88%E3%82%8B