KazumaLab.

流行りとリラックマと嵐が大好きです。

HTC Vive の開発まとめ Pert 2.

かずまです。

HTC Viveでの開発方法がめっちゃ簡単になっているので最低限メモっておきます。

ちなみに作ったものはTwitterに乗ってます。

これとかサクッとできちゃいます。
あとはお絵かきとかもろもろ。


前回はものをつかむコードだけをのっけたのですが使い方がいまいち載ってなくて、自分でも見返したときに死んだのでもう一度書き直そうかと思います。

ちなみにこちらは前回。


blog.kazumalab.com

結構僕の中ではだめな記事。笑
参考になりません。

準備

Asset Store

これをまずプロジェクト内に入れます。

シーンを新しく作り、PlaneをVector3.zeroの位置で作成します。
そのあとさっき入れたPluginのPrefab内にある、

  • [CameraRig]
  • [Status]
  • [SteamVR]

をシーンに入れておきます。位置はそれぞれVector3.zeroです。

これであとはVIVEをPCにつないでおけば再生するたびにSteamVRを起動してくれて、VR空間内に入ることができます。
めっちゃ便利ですね。

ちょっとした小技

標準ではSteamControllerが表示されています。
それを変更する場合は

f:id:kazumalab:20161202021402p:plain
まず、先ほど入れたCameraRig内のControllerの子になっているModelを選択します。

f:id:kazumalab:20161202021452p:plain
その後InspectorからSteamVR_RenderModelのEnableをOffにします。
これで再生時に表示されなくなりました。

あとはModelと同じ階層に自分が手やControllerとして表示したいものを置くだけです。(positionはVector3.zero)

あとは開発!

今回はSteamVRのメニューと同じような仕様のControllerからRayCastを飛ばして当たったところに合わせて線を短くするという方法をメモっておきます。

めっちゃ簡単なのですが忘れるのも早いので。

RayCastとは

わからないものはreferenceを見る!
docs.unity3d.com

まぁいうとオブジェトから目に見えないビームを飛ばして、当たったら反応する、みたいな感じです。
目に見えないのが今回の胆!

さて見えないのをどう可視化するかというと

みなさんご存じLineRendererを使います。

Unity5.5で少し改良が入ったみたい。

blogs.unity3d.com

APIも少し変わりました。
SetVerticsCountがなくなってnumPositionsを使うようになったとか、あとは頂点数もいじれますね。

今回目指すもの

RayCastのヒットしたタグが'Point'というものであればその位置にポインターを合わせる、という方法です。

f:id:kazumalab:20161202023546g:plain

まずは先ほど作ったシーンのController、今回はRightControllerにLineRendererのコンポーネントを付けます。
f:id:kazumalab:20161202024013p:plain

設定するところはここ。

  • Material
  • Positions
  • Width

この3つです。

Material

今回はMaterialを静的につけます。
まずは
Project -> Materialで作成、その後Materialの中身をこう設定します。
f:id:kazumalab:20161202024345p:plain

このMaterialをLineRendererのMaterialにD&Dしてくっつけます。

Positions

これはデフォルトでSize2になってるとおもうので0に変更してください。

Width

デフォルト値は1ですが太すぎるので0.01ぐらい?に設定する。

ここまでできたら次はコードです。

こんな感じで書いていきます。
あとは処理させたいことを書いていくだけ!

注意

Start()二行目のnumPotisionsはいくつLineを書くためのPositionをいれるか?という設定なのでここでは始点と終点の2つなので2と設定しています。設定しないと"LineRenderer.SetPosition index out of bounds!"とエラーが出るのでご注意を。

Point

当たってないときはEnableをFalseにして消すこと。

RayCastではoutの引数を取ってその中にHitした情報が渡されるのでhit.pointと書いているのは当たったところのWorld座標を取ってこれるのでそれをLineRendererの終点にしている、というわけです。

今回は以上です。

簡単でしたが終わります。
不明点、間違いはコメントいただけると嬉しいです。