2017/08/26

Stingray(VRテンプレート)のコントローラ処理を調べてみる(リンクとスポーン)

blog-post-19-content5

前々回前回と続いてきた StingrayVRテンプレートにおけるコントローラの実装調査ですが、 いよいよ 今回で最後 です。

最後ということで、キーになることも多いです。
ただし、ここで覚えることが
StingrayにおけるVR開発において最も重要なこと になります。

最後はこの3つのグループになりますが、
実際は右2つのグループB,Cは左のグループAに繋がっているので、
大きな1つのグループと見ることができます。

blog-post-19-content1

一見ややこしいように見えますが、処理の内容自体はシンプルです。


blog-post-19-content2

画像内のグループAで、ここでの処理が終わると、
下で説明している2つのグループB,Cへと続きます。

1.外部イベントの作成

ここの処理の始まりとなっているのは 『External In Event』 です。 このノードは独自にイベントを作ることができ、 外部から このイベントが呼ばれた際に以後の処理が呼ばれる ようになります。 (UnrealEngine4のカスタムイベントなどが近いです)

つまり、 『ここより後の処理はコントローラのユニットフロー単体では動作せず、
外部よりこのイベント(link_controller)が呼ばれた時にのみ実行される』 という事になります。

ちなみに、このVRテンプレートの場合、
link_controllerの呼び出し元は『steam_vr』という名前のLuaスクリプトになります。

blog-post-19-content3

それ以外でも『Level Unit』などのノードからも呼び出すことができます。

2.ユニットとコントローラのリンク

続いては 『SteamVR Link Node To Tracker』 ノードです。
このノードは『Link to』に設定されたHMDやコントローラの位置に 引数に指定したユニットのメッシュをリンクさせる(くっつける)処理です。

これまで、何気なくVR画面でコントローラを動かしていましたが、
VR画面でコントローラが見えていたのはこの処理があったおかげだったのです。

この先ではグループB,グループCに処理が分かれますが、
『どちらかを行う』などではなく、両方の処理を行います。


※『Spawn Pickup Unit to get the Pickup Functionality』

blog-post-19-content4

画像内のグループBです。 ここでは 『物を持ち上げる為の前準備』 を行っています。

1.スクリプトデータをチェック

最初は 『Branch』 ノードが実行されます。
『Branch』ノードは引数として受け取ったbool型の結果によって
TrueかFalseに処理を分岐させるというノードです。
一般的なプログラムにおけるif文であり、
他のビジュアルスクリプティングにおいても同名で使用されているなど
これなしでプログラムは成り立たないほどの 基本的なノード です。

今回はTrueなら処理を続け、Falseなら処理が終了する、といった形になっています。

2.持ち上げ処理のスポーン

Trueから続く処理は 『Spawn Unit on Position』 ノードです。
このノードは引数のUnitに指定したユニットをスポーンさせるという処理を行います。 PositionやRotationをセットするとスポーンさせる位置や向きを指定できます。

ここでスポーンしているのは 『functionality_pickup』 というユニットになります。
このユニットについてはまた後で説明しますが、 簡単に言うと 『対象を持ち上げる処理』 になります。

スポーンしたユニットに『Set Unit String Data』を使用してユニット変数controller_indexを設定します。

3.スポーンしたユニットとリンク

最後に使用するノードは『SteamVR Link Node To Tracker』です。
今回はコントローラではなく、
先ほどスポーンしたfunctionality_pickupとリンクさせています。

つまり、ここでの処理は
『持ち上げる為の処理をスポーンさせ、コントローラの位置にリンクさせる』 という物です。


※『Spawn Teleport Unit to get the Teleport Functionality』

blog-post-19-content5

画像内のグループCです。 こちらのグループでは 『プレイヤーのテレポート処理の前準備』 を行っています。

1~3までの処理は②でスポーンしているユニットが 『functionality_teleport』 である以外は全く同じです。

4.キー入力の取得

更に下側の処理は『Level Update』によって実行されています。 キー入力を取得しており、前々回でも登場した『SteamVR Touch』を使用しています。 ただし、今回は入力された座標が欲しいわけではないため、使用する返り値は 入力した時/離した時を表すPressed/Releasedのみです。

5.外部イベントの呼び出し

Pressed/Releasedの両方から、『Unit Flow Event』 に繋がっています。 『Unit Flow Event』はユニットが持つ外部イベントを呼び出すノードです。

つまり、 Pressedの場合はfunctionality_teleportが持つ 『press_teleport』 イベント、 Releasedの場合は同じくfunctionality_teleportが持つ 『release_teleport』 イベント へと処理が続きます。


これで、コントローラのユニットフローの処理は一通り見ることができました。。 しかし、今回の調査で新しく functionality_pickupとfunctionality_teleport という新しいユニットが出てきました。

次回からはこの2つのユニットフローについて、ご説明していきます。