今回も引き続き、『物を掴む処理』を見ていきます。次回を含め、覚えることが盛りだくさんです。画像の中の青い部分は前回にやった『物に触れている間の処理』です。基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。ここでは、触れている物の状態をチェックし、『持ち上げることができるか』を判定しています。最初に、変数『wand_is_touching』の値で『Branch』ノードを実行しています。Trigger』の処理で何かに触れている時にTrueに変更されています。『何かに触れているか』をチェックしています。Objects』ノードで比較しています。Objects』ノードは、A・Bに渡された値が同じであるかどうかを返します。Dynamic』ノードの結果がTrueであるかという処理を行っています。Dynamic』ノードは、『Actor』に指定された物体が動的であるかどうかを返します。『持ち上げようとしている物体が動かせるものか』という確認になります。ここまでの処理で、『物体を持ち上げるまでの確認』が完了しました。今回からは、前回の最後に登場した『function_pickup』ユニットのユニットフローを見ていきます。『function_pickup』ユニットには『物を持ち上げる』という処理が実装されています。function_pickupユニットを見ていきましょう。アセットブラウザから『vr_steam』->『models』->『functionality_pickup』の中にあるユニットを開きましょう。画像の赤四角のようなアイコンはユニットフロー単体を表しています。ユニットフローを編集するための『FlowEditor』が開かれます。ユニットエディタを開く必要がない場合はこちらを開いてもいいかもしれません。して開かれた『functionality_pickup』のユニットフローが以下の画像です。非常に膨大な処理ではありますが、少しずつ進めていきます。今回、説明していく箇所は、以下の画像で赤・青・緑の枠の部分です。ここでは一番最初に行うべき『変数の設定』を行っています。以下の変数がここで設定されています。Update』にて常に行うべき処理が実装されています。その結果を変数『wand_current_frame_pos』に設定しています。変数『wand_current_frame_pos』は現在位置を表しています。最後ということで、キーになることも多いです。StingrayにおけるVR開発において最も重要なことになります。大きな1つのグループと見ることができます。ややこしいように見えますが、処理の内容自体はシンプルです。下で説明している2つのグループB,Cへと続きます。外部からこのイベントが呼ばれた際に以後の処理が呼ばれるようになります。『steam_vr』という名前のLuaスクリプトになります。Unit』などのノードからも呼び出すことができます。Tracker』ノードです。引数に指定したユニットのメッシュをリンクさせる(くっつける)処理です。VR画面でコントローラが見えていたのはこの処理があったおかげだったのです。『どちらかを行う』などではなく、両方の処理を行います。画像内のグループBです。ここでは『物を持ち上げる為の前準備』を行っています。最初は『Branch』ノードが実行されます。前回から引き続き、今回もコントローラの内部処理(ユニットフロー)を見ていきます。今回はこの2つのグループの処理を見ていきます。このグループではコントローラが『一番最初に行うべき処理』が実装されています。Spawned』は『ユニットが生成されたタイミング』を表しています。この場合であれば『Viveコントローラが認識され、レベルに出てきたタイミング』です。Spawned』からは『Delay』ノードに繋がっています。Delayノードは引数に設定された時間だけ処理を止めるという処理です。先に実行されてしまうと、問題が発生する場合などに用いられます。ユニットを格納するための変数を作成します。変数名は前回にも触れたcontroller_indexに『wand_』という文字列を繋げた物です。Visibility』で最初は表示されたままだったボールを不可視にしています。いう初期化の処理をしています。このグループは、前回のトラックボールと同じように入力に関係した処理を行っています。基本的な入力の取得方法は前回と同じです。Button』になっています。この二つの違いは、入力を取得する対象が『トラックパッドの位置』か、それとも『それ以外のボタン入力』かという点のみです。Button』のValue値を乗算しています。これも前回と同じですね。計算する際には注意してください。ここでの乗算は-30ですが、これで最小値0、最大値-30の結果が得られます。前回は『Flow』による簡易的なプログラムを組んでみました。今回からは本格的な要素に入ります。非常に軽い建築デモ程度であればそのまま使えてしまえるような機能が最初から実装されています。それらの機能がどのように実装されているのか、少しずつ処理の解説を交えつつ、見ていきましょう。今回、見ていく処理は『コントローラの処理』になります。いくらレベルフローを見てみたとしても、コントローラの処理と思しきものはどこにもありません。コントローラの処理はコントローラ自身にあるためです。どこでコントローラ自身の処理が見られるのか、についてです。エディタの画面の下側にあるタブを見てみましょう。現在開いているプロジェクトの中にあるモデルや音などのアセットを見ることができます。この中に、コントローラのモデルがあります。『VR_steam』->『models』->『controller』を選択します。すると、コントローラのモデルが見つかるはずです。このモデルをダブルクリックしましょう。モデルをダブルクリックすると、画像のような画面が開かれます。この画面は『ユニットエディタ』といい、『ユニット』を編集する画面です。一つ一つがメッシュや各種プロパティを持っています。ユニットが所持するFlowは『ユニットフロー』と呼ばれます。ユニットフローの編集などを行うことができます。Flow』タブをクリックして開いてください。して開かれるのがユニットフローの画面です。細かな点や用途に違いはありますが、基本的な部分はレベルフローと変わりません。今回は、ここに実装されている処理の内容を調べていきましょう。複数のノードが一つのブロックに囲まれているのがわかるかと思います。一括で削除したり、移動したりできるようにする機能です。Flowの可読性を向上させるという事もできます。コントローラのユニットフローでは6つのグループがあります。この記事では、このうちの1つのグループの処理について調べていきます。このグループでは『トラックパッド上のボールの移動』が実装されています。指を触れている個所にボールが出現しているはずです。試しに、このグループを削除してからプレイしてみると、ボールが出現しなくなります。ちなみに、グループをまるごと削除するためには、グループのタイトルの部分をクリックしてからDeleteキーを入力します。簡易的な物であれば建築分野用のVRデモなどを実装することもできます。今回は、VR特化のノードについて、用途ごとに以下にまとめてみることにします。StingrayにはOculus/GoogleVR/GearVR用のノードもあります。どのHMDでも内容はほぼSteamVRと同一の為、割愛します。Vive』テンプレートを選択しないと、下記のノードが使用できません。処理を分岐させています。ボタンの割り当てはViveの公式ドキュメントを参考にしてください。『Released』はボタンから指を離した時にそれぞれ呼ばれます。『Value』は入力の状態を0~1の範囲で返します。(指を離している時が0、完全に押し込んだ時が1。以下はトリガーの入力の範囲をログに出力するサンプルです。画像のようにノードを接続しています。Right』までをより詳細にしたノードです。タッチパッドから指を離したときに呼ばれる『Untouched』が追加されています。X/Yは指先が触れている座標を中央を0として1~-1の範囲で返します。ちなみに、どちらも『SteamVR』->『Input』の中にあります。『Seconds』秒間の振動を与えます。強制的に0.003999に合わせられてしまいます。画像のように連続で呼ばれるような処理を作る必要があります。手頃な価格になってきましたし、以前より気軽に試すことができる環境が整ってきました。安くはない買い物ですし、自分のPCで動作するかを事前に確認したいですよね。NvidiaとかGeForceとか何それ。Readyじゃないのといったところかと思います。Oculus!ツールをしっかり用意してくれています。各項目が動作に必要なスペックを満たしているかどうかを知らせてくれます。readyかどうか判定してくれて大変便利です。Riftを購入を検討中であればお持ちのPCで一度試してみられるのもいいかもしれません。推奨、最小スペックなどは下記のURLに記載があります。