2017/08/30

Stingray(VRテンプレート)の持ち上げ処理を調べてみる(持ち上げ編)

blog-post-21-content1

今回も引き続き、『物を掴む処理』 を見ていきます。
次回を含め、覚えることが盛りだくさんです。

blog-post-21-content2

画像の中の青い部分は前回にやった『物に触れている間の処理』です。
緑の部分はまだ特に触れてはいませんが、
基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。


状態のチェック

コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。

blog-post-21-content3

ここでは、触れている物の状態をチェックし、『持ち上げることができるか』 を判定しています。


◯ Is the Wand Touching an Object?

最初に、変数『wand_is_touching』の値で『Branch』ノードを実行しています。
この変数は前回の 『Physics Trigger』 の処理で何かに触れている時にTrueに変更されています。

つまり、『何かに触れているか』 をチェックしています。

_____________

◯ check for no pick up in unit data

Trueならば今度は変数『touching_unit』の値が持つ『pick_up』のデータと『no』を 『Compare Objects』 ノードで比較しています。

『Compare Objects』 ノードは、A・Bに渡された値が同じであるかどうかを返します。

まとめると、ここでは 『触れているユニットが持つ持ち上げられる物体かどうかのデータを見て、その内容がnoであるかどうか』 をチェックしています。

_____________

◯ Is the Actor Dynamic?

上記処理で等しくなかった(noではなかった)場合、 『Is Actor Dynamic』 ノードの結果がTrueであるかという処理を行っています。

『Is Actor Dynamic』 ノードは、『Actor』に指定された物体が動的であるかどうかを返します。

つまり、『持ち上げようとしている物体が動かせるものか』 という確認になります。

ここまでの処理で、『物体を持ち上げるまでの確認』 が完了しました。


Attach the Object to the Wand

blog-post-21-content4

続いて、物体を持ち上げる処理を見ていきます。
画像の中の黄色のエリアですが、
かなり量が多いので幾つかのグループに分割して処理を見ていきます。

1.対象を動かせるようにする

blog-post-21-content5

まず、『SteamVR Set Actor Kinematic』 を使用して、対象を自由に動かせるようにします。

2.スナップをきかせるかどうかをチェック

blog-post-21-content6

続いて、現在触れているユニットがスナップをきかせるような物(バット)であるかをチェックするために、 触れているユニットが持つ『snap』というスクリプトデータが『yes』かどうかをチェックしています。

blog-post-21-content7

『snap』が『yes』である場合、
『preserve_world』をFalseに変更し、
ユニットのローカル位置とローカル回転を0に変更しています。
こうすることで、どんな状態の物を拾っても必ず同じ位置、同じ向きに向くようになります。

『snap』が『yes』以外であった場合、
『preserve_world』をTrueに変更します。

どちらの場合でも終了後は次の処理に遷移します。

3.リンク付けを行う

blog-post-21-content8

次は『SteamVR Unlink Node From Tracker』を使用して、 現在手に触れている物のリンクを外しています。

その後、コントローラに対してユニットのリンク付けを行います。

4.各種イベントの実行と変数の設定

blog-post-21-content9

最後に、リンク付け後に必要な処理を行っています。
コントローラがリンク中であるかを示す変数『is_linked』をTrueにしてから
『Sequence』 ノードに続いています。
『Sequence』 ノードは上から順に繋げられた処理を実行するというものです。
実装に必須な処理というわけではありませんが、
『Flow』の可読性向上に役立つ ことが多いです。

持ち上げたユニットの『pickup_sound』イベントの実行、
持ち上げられたユニットにコントローラの情報をセット、
持ち上げたユニットの『Linked』イベントの実行、
持ち上げたユニットの『hilight_off』イベントの実行。
という順に行っています。

こうすることで、『対象を持ち上げる処理』は実装されています。
しかし、これだけではまだ 『対象を手放す』 事はできません。


次回は、『対象を手放す処理』 を見ていきます。