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


VR用アセット「VRTK」の Example 035_Controller_OpacityAndHighlighting の解説です。コントローラーの不透明度を変えたりハイライトしたりするデモです。
snapcrabdata1

■公式サイトの解説

VRTK公式サイトでこのExampleの解説文を見ることができます。

解説動画
(このExampleの解説動画はまだアップされていません) 


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

適宜、以下の記事を参照願います。
  • スクリプト「VRTK_OutlineObjectCopyHighlighter」の解説
      (今後執筆予定)

■Exampleの解説

VRTK/Examples 内にある当該番号のシーンを呼び出すことで、デモを動かしてみることができます。
 
コントローラーのボタンを押すとコントローラーの不透明度が変わり(向こうが透けて見える)、押したボタンがハイライトされます。また、コントローラーが物に触れると、コントローラー全体または輪郭がハイライトされます。
SnapCrab_NoName_2017-1-30_10-23-50_No-00
SnapCrab_NoName_2017-1-30_10-12-53_No-00

以下、シーンに配置されているオブジェクトについての概要説明です。
  • RightController: 右手のコントローラー用のVRTKスクリプトをアタッチするゲームオブジェクト。VRTK_ControllerAppearance_Example スクリプトなどがアタッチされている。
    右コントローラーは、ボタンを押すとコントローラー全体がやや透明になり(不透明度が下がる)、押したボタンはハイライトされる(システムメニューボタンを除く)。
    また、他のオブジェクトに触れるとコントローラー全体がハイライトされる。
    SnapCrab_NoName_2017-1-30_10-53-28_No-00
    SnapCrab_NoName_2017-1-30_10-53-43_No-00

    インスペクタの設定はこんな感じ。(スクリプトの中身については後述)
    SnapCrab_NoName_2017-1-30_11-13-17_No-00

  • LeftController: 左手コントローラー用のVRTKスクリプトをアタッチするゲームオブジェクト。右コントローラーと同様に VRTK_ControllerAppearance_Example スクリプトがアタッチされているほか、こちらには VRTK_OutlineObjectCopyHighlighter スクリプトがアタッチされている。
    右コントローラーと同様、ボタンを押すとコントローラー全体がやや透明になり、押したボタンはハイライトされる。
    他のオブジェクトに触れたときは右コントローラーとは異なり、コントローラーの輪郭だけがハイライトされる。
    SnapCrab_NoName_2017-1-30_10-23-55_No-00
    SnapCrab_NoName_2017-1-30_11-27-56_No-00

    インスペクタの設定はこんな感じ。VRTK_ControllerActions スクリプトの Element Highlighter Overrides > Body に VRTK_OutlineObjectCopyHighlighter スクリプトがアタッチされている。これにより、コントローラーが他のオブジェクトに触れたとき、コントローラーの輪郭のみがハイライトされる。
    SnapCrab_NoName_2017-1-30_11-29-5_No-00

  • VRTK_ControllerAppearance_Example スクリプト: 左右のコントローラーに適用されているスクリプト。各ボタンでの処理と、衝突時の処理が書かれています。下記コード中のコメントを参照のこと。
    namespace VRTK.Examples
    {
        using UnityEngine;
    
        // --- コントローラーの不透明度およびハイライトを変更するスクリプト -------------------------------------
        public class VRTK_ControllerAppearance_Example : MonoBehaviour
        {
            public bool highlightBodyOnlyOnCollision = false;
    
            private VRTK_ControllerTooltips tooltips;
            private VRTK_ControllerActions actions;
            private VRTK_ControllerEvents events;
    
            private void Start()
            {
                if (GetComponent<VRTK_ControllerEvents>() == null)
                {
                    Debug.LogError("VRTK_ControllerEvents_ListenerExample is required to be attached to a Controller that has the VRTK_ControllerEvents script attached to it");
                    return;
                }
    
                events = GetComponent<VRTK_ControllerEvents>();
                actions = GetComponent<VRTK_ControllerActions>();
                tooltips = GetComponentInChildren<VRTK_ControllerTooltips>();
    
                //Setup controller event listeners
                events.TriggerPressed += new ControllerInteractionEventHandler(DoTriggerPressed);
                events.TriggerReleased += new ControllerInteractionEventHandler(DoTriggerReleased);
    
                events.ButtonOnePressed += new ControllerInteractionEventHandler(DoButtonOnePressed);
                events.ButtonOneReleased += new ControllerInteractionEventHandler(DoButtonOneReleased);
    
                events.GripPressed += new ControllerInteractionEventHandler(DoGripPressed);
                events.GripReleased += new ControllerInteractionEventHandler(DoGripReleased);
    
                events.TouchpadPressed += new ControllerInteractionEventHandler(DoTouchpadPressed);
                events.TouchpadReleased += new ControllerInteractionEventHandler(DoTouchpadReleased);
    
                tooltips.ToggleTips(false);
            }
    
            private void DoTriggerPressed(object sender, ControllerInteractionEventArgs e)      // トリガーが押されたとき
            {
                tooltips.ToggleTips(true, VRTK_ControllerTooltips.TooltipButtons.TriggerTooltip);   // ToolTipを表示する
                actions.ToggleHighlightTrigger(true, Color.yellow, 0.5f);                       // トリガーをハイライトする
                actions.SetControllerOpacity(0.8f);                                             // コントローラーの不透明度設定
            }
    
            private void DoTriggerReleased(object sender, ControllerInteractionEventArgs e)     // トリガーが離されたとき
            {
                tooltips.ToggleTips(false, VRTK_ControllerTooltips.TooltipButtons.TriggerTooltip);  // ToolTipを非表示にする
                actions.ToggleHighlightTrigger(false);                                          // トリガーのハイライトをやめる
                if (!events.AnyButtonPressed())
                {
                    actions.SetControllerOpacity(1f);               //(いずれかのボタンが押されていない限り)不透明度を1に戻す
                }
            }
    
            private void DoButtonOnePressed(object sender, ControllerInteractionEventArgs e)    // メニューボタンが押されたとき
            {
                tooltips.ToggleTips(true, VRTK_ControllerTooltips.TooltipButtons.ButtonOneTooltip);
                actions.ToggleHighlightButtonOne(true, Color.yellow, 0.5f);
                actions.SetControllerOpacity(0.8f);
            }
    
            private void DoButtonOneReleased(object sender, ControllerInteractionEventArgs e)   // メニューボタンが離されたとき
            {
                tooltips.ToggleTips(false, VRTK_ControllerTooltips.TooltipButtons.ButtonOneTooltip);
                actions.ToggleHighlightButtonOne(false);
                if (!events.AnyButtonPressed())
                {
                    actions.SetControllerOpacity(1f);
                }
            }
    
            private void DoGripPressed(object sender, ControllerInteractionEventArgs e)         // グリップボタンが押されたとき
            {
                tooltips.ToggleTips(true, VRTK_ControllerTooltips.TooltipButtons.GripTooltip);
                actions.ToggleHighlightGrip(true, Color.yellow, 0.5f);
                actions.SetControllerOpacity(0.8f);
            }
    
            private void DoGripReleased(object sender, ControllerInteractionEventArgs e)        // グリップボタンが離されたとき
            {
                tooltips.ToggleTips(false, VRTK_ControllerTooltips.TooltipButtons.GripTooltip);
                actions.ToggleHighlightGrip(false);
                if (!events.AnyButtonPressed())
                {
                    actions.SetControllerOpacity(1f);
                }
            }
    
            private void DoTouchpadPressed(object sender, ControllerInteractionEventArgs e)     // タッチパッドが押されたとき
            {
                tooltips.ToggleTips(true, VRTK_ControllerTooltips.TooltipButtons.TouchpadTooltip);
                actions.ToggleHighlightTouchpad(true, Color.yellow, 0.5f);
                actions.SetControllerOpacity(0.8f);
            }
    
            private void DoTouchpadReleased(object sender, ControllerInteractionEventArgs e)    // タッチパッドが離されたとき
            {
                tooltips.ToggleTips(false, VRTK_ControllerTooltips.TooltipButtons.TouchpadTooltip);
                actions.ToggleHighlightTouchpad(false);
                if (!events.AnyButtonPressed())
                {
                    actions.SetControllerOpacity(1f);
                }
            }
    
            private void OnTriggerEnter(Collider collider)            // コントローラーが他のオブジェクトに触れたとき(トリガー) 
            {
                if (!VRTK_PlayerObject.IsPlayerObject(collider.gameObject))     // プレイヤーオブジェクトでなければ処理を行う
                {
                    if (highlightBodyOnlyOnCollision)   // Highlight Body Only On Collision がチェックされているとき
                    {
                        actions.ToggleHighlighBody(true, Color.yellow, 0.4f);   // コントローラーのBodyをハイライトする
                    }
                    else                                // Highlight Body Only On Collision がチェックされていないとき
                    {
                        actions.ToggleHighlightController(true, Color.yellow, 0.4f);    // コントローラーをハイライトする
                    }
                }
            }
    
            private void OnTriggerExit(Collider collider)        // コントローラーが他のオブジェクトから離れたとき(トリガー)
            {
                if (!VRTK_PlayerObject.IsPlayerObject(collider.gameObject))
                {
                    if (highlightBodyOnlyOnCollision)
                    {
                        actions.ToggleHighlighBody(false);
                    }
                    else
                    {
                        actions.ToggleHighlightController(false);
                    }
                }
            }
        }
    }

今回は以上です。