2017/08/30
Stingray(VRテンプレート)の持ち上げ処理を調べてみる(持ち上げ編)
今回も引き続き、『物を掴む処理』 を見ていきます。
次回を含め、覚えることが盛りだくさんです。
画像の中の青い部分は前回にやった『物に触れている間の処理』です。
緑の部分はまだ特に触れてはいませんが、
基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。
状態のチェック
コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。
ここでは、触れている物の状態をチェックし、『持ち上げることができるか』 を判定しています。
◯ 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
続いて、物体を持ち上げる処理を見ていきます。
画像の中の黄色のエリアですが、
かなり量が多いので幾つかのグループに分割して処理を見ていきます。
1.対象を動かせるようにする
まず、『SteamVR Set Actor Kinematic』 を使用して、対象を自由に動かせるようにします。
2.スナップをきかせるかどうかをチェック
続いて、現在触れているユニットがスナップをきかせるような物(バット)であるかをチェックするために、 触れているユニットが持つ『snap』というスクリプトデータが『yes』かどうかをチェックしています。
『snap』が『yes』である場合、
『preserve_world』をFalseに変更し、
ユニットのローカル位置とローカル回転を0に変更しています。
こうすることで、どんな状態の物を拾っても必ず同じ位置、同じ向きに向くようになります。
『snap』が『yes』以外であった場合、
『preserve_world』をTrueに変更します。
どちらの場合でも終了後は次の処理に遷移します。
3.リンク付けを行う
次は『SteamVR Unlink Node From Tracker』を使用して、 現在手に触れている物のリンクを外しています。
その後、コントローラに対してユニットのリンク付けを行います。
4.各種イベントの実行と変数の設定
最後に、リンク付け後に必要な処理を行っています。
コントローラがリンク中であるかを示す変数『is_linked』をTrueにしてから
『Sequence』 ノードに続いています。
『Sequence』 ノードは上から順に繋げられた処理を実行するというものです。
実装に必須な処理というわけではありませんが、
『Flow』の可読性向上に役立つ ことが多いです。
持ち上げたユニットの『pickup_sound』イベントの実行、
持ち上げられたユニットにコントローラの情報をセット、
持ち上げたユニットの『Linked』イベントの実行、
持ち上げたユニットの『hilight_off』イベントの実行。
という順に行っています。
こうすることで、『対象を持ち上げる処理』は実装されています。
しかし、これだけではまだ 『対象を手放す』 事はできません。
次回は、『対象を手放す処理』 を見ていきます。