2017/08/29

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

blog-post-20-content

今回からは、前回の最後に登場した 『function_pickup』 ユニットのユニットフローを見ていきます。

コントローラのユニットフローを見てもわかる通り、
『function_pickup』 ユニットには『物を持ち上げる』という処理が実装されています。

早速、function_pickupユニットを見ていきましょう。

アセットブラウザから 『vr_steam』->『models』->『functionality_pickup』 の中にあるユニットを開きましょう。

blog-post-20-content1

なお、画像の赤四角のようなアイコンはユニットフロー単体を表しています。
こちらのアイコンをダブルクリックして開くとユニットエディタとは異なる
ユニットフローを編集するための『FlowEditor』が開かれます。

ユニットフロー以外の要素がなく、
ユニットエディタを開く必要がない場合はこちらを開いてもいいかもしれません。

そうして開かれた 『functionality_pickup』のユニットフロー が以下の画像です。

blog-post-20-content2

非常に膨大な処理ではありますが、少しずつ進めていきます。

今回、説明していく箇所は、以下の画像で赤・青・緑の枠の部分です。

blog-post-20-content3


『Set Variables on Spawn』

青色の枠の箇所です。

blog-post-20-content4

『Unit Spawned』から始まっていることからわかるかもしれませんが、
ここでは一番最初に行うべき 『変数の設定』 を行っています。

以下の変数がここで設定されています。

_____________

スコープ:型:名前
_____________

ローカル:bool:touch_tracker:False
ローカル:bool:laser_on:False
ローカル:string:my_global_var:wand_extras_1 or 2
グローバル:unit:wand_extras_1 or 2:unit
グローバル:bool:keep_my_rotation_and_position:True
_____________


『Wand Velocity』

赤色の枠の箇所です。

blog-post-20-content5

『Level Update』にて常に行うべき処理が実装されています。

『Get Unit World Position』 を使用して自分のワールド座標を取得し、
その結果を変数 『wand_current_frame_pos』 に設定しています。
変数『wand_current_frame_pos』は現在位置を表しています。

この部分では変数『wand_current_frame_pos』から
変数『wand_last_frame_pos』の値を減算した値に
『Get Last Delta Time』 で取得した時間を除算、
その結果をユニットが持つスクリプトデータの『wand_velocity』と
変数の『wand_velocity』に代入しています。

この値はコントローラの 加速度 を表しています。

ちなみに、まだ値をセットしている個所の説明をしていませんが、
変数 『wand_last_frame_pos』 は直前のコントローラの位置をセットしています。

また、『Get Last Delta Time』 は 前回の更新から今回の更新までの間に経過した秒数を返します。

つまり、ここの計算は直前と現在のコントローラ位置を比較し、
その差の分を経過秒数で割り、1秒あたりの加速度 を計算しています。

最後に、現在のコントローラ位置を 変数『wand_last_frame_pos』にセットしています。


『Collision Events and Variables』

blog-post-20-content6

緑色の枠の箇所です。
『コントローラが特定のユニットに触れている間の処理』 が実装されています。

ここの処理の始まりは 『Physics Trigger』 というノードです。

『Physics Trigger』ノードは『引数に指定したメッシュが特定の対象に触れた時』に呼ばれます。
また、その際に触れているユニットなどを返します。

ここでは、特定のユニットに触れた場合、下記の処理を一気に実行しています。

_____________

触れた対象が持つ 『hilight_on』 イベントの実行、
触れている状態を示す変数 『wand_is_touching』 をTrueに変更、
触れているユニットをユニット変数 『touching_unit』 に格納、
触れているコントローラを表すグローバル変数 『controller_touch_index』 を設定。
_____________

また、ユニットから離れた場合も下記の処理を実行しています。

_____________

触れた対象が持つ 『hilight_off』 イベントの実行、 触れている状態を示す変数 『wand_is_touching』 をFalseに変更。
_____________

これは、触れているユニットが目で見てわかるようにするための処理となっています。
触れている状態かどうかのフラグもここで立てているため、
ここまで実装できてようやく 『物を掴む』処理の準備が整った ことになります。


次回はいよいよ本題となる『物を掴む処理』について見ていきます。