(この記事の使用環境: Unity5.5.0f3 Personal、Windows10、SteamVR Plugin 1.2.0、VRTK3.0.1)


VR用アセット「VRTK」の Example 003_Controller_SimplePointer の解説です。コントローラーのタッチパッドを押すことでポインタービームを発します。
SnapCrab_NoName_2017-1-30_22-43-24_No-00

■公式サイトの解説

VRTK公式サイトでこのExampleの解説文及び解説動画を見ることができます。ただし、動画に関してはVRTK旧バージョンのときに作られたものであり、VRTK3.0(以降)では設定等が異なっている場合があることに留意してください。動きを中心に見てもらえれば良いかと思います。

このExampleの解説動画



■VRTKのセットアップ方法および使用されているスクリプトの解説

適宜、以下の記事を参照願います。

■Exampleの解説

VRTK/Examples 内にある当該番号のシーンを呼び出すことで、デモを動かしてみることができます。
 
コントローラーのタッチパッドを押すことでポインターのレーザービームを作動させ、シーンに配置されているオブジェクトを指し示すことができます。

また、ポインターのイベントはUnityエディター画面のコンソールウィンドウにも表示されます。
SnapCrab_NoName_2017-1-30_22-54-31_No-00

以下、シーンに配置されているオブジェクトについての概要説明です。
  • WorldObjects(Person、Cube、Sphere、Capsule): シーン上に配置されたオブジェクト群。Person は Head、Body、LegA、LegB のパーツで構成されている。
    SnapCrab_NoName_2017-1-30_23-13-47_No-00

  • Left Controller、RightController: 左右のコントローラー用のVRTKスクリプトをアタッチするゲームオブジェクト。VRTK_ControllerEvents 、VRTK_SimplePointer、VRTK_ControllerPointerEvents_ListenerExample スクリプトがアタッチされている。

    VRTK_SimplePointer スクリプトにより、コントローラーからポインタービームを発することができるようになっている。(VRTK_SimplePointer スクリプトの解説は この記事 を参照)

    また、VRTK_ControllerPointerEvents_ListenerExample スクリプトにより、ポインターがヒットしたオブジェクト等に関する情報をコンソールに出力している(後述)。
    SnapCrab_NoName_2017-1-30_23-20-17_No-00

  • VRTK_ControllerPointerEvents_ListenerExample スクリプト: 左右のコントローラーに適用されているスクリプト。ポインターがヒットしたオブジェクト等に関する情報をコンソールに出力している。

    コンソールには下図のように情報が出力される。(出力される情報: コントローラーのインデックス、ポインターのアクション、ポインターがヒットしたオブジェクトの名前(例「Person」)、ヒットしたコライダーの名前(例「Body」)、ヒットするまでの距離、ヒットしたワールド座標)
    SnapCrab_NoName_2017-1-30_23-39-40_No-00
    スクリプトの中身はこんな感じ。VRTK_SimplePointer (が継承しているVRTK_DestinationMarker)の各種変数を取得して、処理に使っている。コメントだけ書き加えています。
    namespace VRTK.Examples
    {
        using UnityEngine;
    
        public class VRTK_ControllerPointerEvents_ListenerExample : MonoBehaviour
        {
            private void Start()
            {
                if (GetComponent<VRTK_SimplePointer>() == null)
                {
                    Debug.LogError("VRTK_ControllerPointerEvents_ListenerExample is required to be attached to a Controller that has the VRTK_SimplePointer script attached to it");
                    return;
                }
    
                // --- イベントリスナーのセットアップ(DestinationMarkerEventHandler) -------------------------
                //Setup controller event listeners
                GetComponent<VRTK_SimplePointer>().DestinationMarkerEnter += new DestinationMarkerEventHandler(DoPointerIn);
                GetComponent<VRTK_SimplePointer>().DestinationMarkerExit += new DestinationMarkerEventHandler(DoPointerOut);
                GetComponent<VRTK_SimplePointer>().DestinationMarkerSet += new DestinationMarkerEventHandler(DoPointerDestinationSet);
            }
    
            // --- コンソールへのログ出力フォーマット --------------------------------------
            private void DebugLogger(uint index, string action, Transform target, RaycastHit raycastHit, float distance, Vector3 tipPosition)
            {
                string targetName = (target ? target.name : "<NO VALID TARGET>");
                string colliderName = (raycastHit.collider ? raycastHit.collider.name : "<NO VALID COLLIDER>");
                Debug.Log("Controller on index '" + index + "' is " + action + " at a distance of " + distance + " on object named [" + targetName + "] on the collider named [" + colliderName + "] - the pointer tip position is/was: " + tipPosition);
            }
    
            // --- ポインターが対象にヒットしたときのログ出力 -------------------------------------
            private void DoPointerIn(object sender, DestinationMarkerEventArgs e)
            {
                DebugLogger(e.controllerIndex, "POINTER IN", e.target, e.raycastHit, e.distance, e.destinationPosition);
            }
    
            // --- ポインターが対象から外れた(離れた)ときのログ出力 -------------------------------------
            private void DoPointerOut(object sender, DestinationMarkerEventArgs e)
            {
                DebugLogger(e.controllerIndex, "POINTER OUT", e.target, e.raycastHit, e.distance, e.destinationPosition);
            }
    
            // --- (タッチパッドを離して)ポインターを消したときのログ出力 -------------------------------
            private void DoPointerDestinationSet(object sender, DestinationMarkerEventArgs e)
            {
                DebugLogger(e.controllerIndex, "POINTER DESTINATION", e.target, e.raycastHit, e.distance, e.destinationPosition);
            }
        }
    }
    

今回は以上です。