Unity
VR
Vive

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

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

自己紹介

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

何をしたのか

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

動機

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

使った機能

  • ゲイズ(視線)
  • コントローラー

陥った罠とか

個人でPSVR+Unity開発はどう頑張っても(たぶん)無理

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

ゲイズ取得は軽い気持ちで自作してはいけない。

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

Unity.VR使うかSteemPlugin使うか

どっちでも良い、というかSteemPlugin使った方が参考サイトが沢山あるし振動使えるので分かりやすいのでは。
ただ、UnityのVRSampleで使ってるギミックに興味があるなら、落とせばサンプルシーン入ってるのでVRSampleは使える。
今回Unity.VR使ったのは意地。

Unity2017.1でのエラー

Unity2017.1でVRSamplew開くと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はフォントサイズ1くらいだった。
レティクルは、「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公式のマニュアルに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の部分に登録した名前。

参考にしたもの・したかったもの