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



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



■ 状態のチェック

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



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

◯ 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



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

①対象を動かせるようにする



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

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



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



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

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

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

③リンク付けを行う



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

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

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



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

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

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



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