HTCVIVE---VRTK3.2.1的手柄按鈕方法和功能響應(震動,判斷左右手柄,圓盤上下左右)

引用VRTK。

定義一個變量,用來獲取判斷手柄圓盤按下位置的角度,獲取VRTK_ControllerEvents組件

  private VRTK_ControllerEvents Events;
    public float Angle;//按下和擡起圓盤時獲取按下位置的角度

    private void Awake()
    {
        Events = transform.GetComponent<VRTK_ControllerEvents>();
    }

註冊按鍵事件:

 /// <summary>
    /// 各種按鈕響應事件註冊
    /// </summary>
    private void Start()
    {
        Events.ButtonOneTouchStart += Events_ButtonOneTouchStart;

        Events.ButtonTwoTouchStart += Events_ButtonTwoTouchStart;
        Events.ButtonTwoTouchEnd += Events_ButtonTwoTouchEnd;
        Events.ButtonTwoPressed += Events_ButtonTwoPressed;
        Events.ButtonTwoReleased += Events_ButtonTwoReleased;

        Events.TriggerTouchStart += Events_TriggerTouchStart;
        Events.TriggerTouchEnd += Events_TriggerTouchEnd;
        Events.TriggerHairlineStart += Events_TriggerHairlineStart;
        Events.TriggerHairlineEnd += Events_TriggerHairlineEnd;
        Events.TriggerPressed += Event_TriggerPressed;
        Events.TriggerClicked += Events_TriggerClicked;
        Events.TriggerReleased += Events_TriggerReleased;

        Events.TouchpadTouchStart += Events_TouchpadTouchStart;
        Events.TouchpadTouchEnd += Events_TouchpadTouchEnd;
        Events.TouchpadPressed += Events_TouchpadPressed;
        Events.TouchpadReleased += Events_TouchpadReleased;

        Events.GripTouchStart += Events_GripTouchStart;
        Events.GripTouchEnd += Events_GripTouchEnd;
        Events.GripPressed += Events_GripPressed;
        Events.GripClicked += Events_GripClicked;
        Events.GripReleased += Events_GripReleased;

    }

下面對按鈕事件做詳細說明:

  /// <summary>
    /// 不知道什麼按鈕
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_ButtonOneTouchStart(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("one");
    }

   /// <summary>
    /// 菜單按鈕觸摸一次。實測需要按下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_ButtonTwoTouchStart(object sender, ControllerInteractionEventArgs e)
    {
        if (e.controllerReference == VRTK_ControllerReference.GetControllerReference
            (SDK_BaseController.ControllerHand.Right))//判斷是哪個手柄
        {
            Debug.Log("Application---TouchStart");

                                       
                                   //手柄震動                                         
            VRTK_ControllerHaptics.TriggerHapticPulse
                (VRTK_ControllerReference.GetControllerReference(this.gameObject), 3000, 1, 0.01f);
                                         //另一種方法判斷是哪個手柄    
        }
    }

    /// <summary>
    /// 菜單按鈕觸摸結束一次,實測是按下結束
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_ButtonTwoTouchEnd(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Application---TouchEnd");
    }

    /// <summary>
    /// 菜單按鈕按下一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_ButtonTwoPressed(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Application---Pressed");
    }

    /// <summary>
    /// 菜單按鈕擡起一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_ButtonTwoReleased(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Application---Released");
    }

    /// <summary>
    /// 扳機鍵開始觸摸一次,實測幾乎是按下的瞬間,10°左右
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TriggerTouchStart(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---TouchStart");
    }

    /// <summary>
    /// 扳機結束觸摸一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TriggerTouchEnd(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---TouchEnd");
    }

    /// <summary>
    /// 扳機輕微按下一次,大概按下30°左右
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TriggerHairlineStart(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---HairlineStart");
    }

    /// <summary>
    /// 扳機輕微按下結束一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></pa
    private void Events_TriggerHairlineEnd(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---HairlineEnd");
    }

    /// <summary>
    /// 扳機按下一次,大概45°
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Event_TriggerPressed(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---Pressed");
    }

    /// <summary>
    /// 扳機完全按下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TriggerClicked(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---Ckicked");
    }

    /// <summary>
    /// 扳機按下或者完全按下擡起一次。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TriggerReleased(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Trigger---Released");
    }

    /// <summary>
    /// 圓盤觸摸一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TouchpadTouchStart(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Touchpad---ToucheStart");
    }

    /// <summary>
    /// 圓盤觸摸結束一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TouchpadTouchEnd(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Touchpad---ToucheEnd");
    }

    /// <summary>
    /// 圓盤按下一次,獲取以(0,1)向量爲起始邊,順時針旋轉的角度大小
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TouchpadPressed(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Touchpad---Pressed");

        if ((e.touchpadAngle > 0 && e.touchpadAngle <= 45) || (e.touchpadAngle >= 315 && e.touchpadAngle < 360))
        {
            Debug.Log("Up---OnceClick");
        }
        if (e.touchpadAngle > 135 && e.touchpadAngle <= 225)
        {
            Debug.Log("Down---OnceClick");
        }
        if (e.touchpadAngle > 225 && e.touchpadAngle < 315)
        {
            Debug.Log("Left---OnceClick");
        }
        if (e.touchpadAngle > 45 && e.touchpadAngle <= 135)
        {
            Debug.Log("Right---OnceClick");
        }

        Angle = e.touchpadAngle;
    }

    /// <summary>
    /// 圓盤按下鬆開一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_TouchpadReleased(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Touchpad---Released");
        Angle = 0;
    }

    /// <summary>
    /// 側鍵觸摸一次,測試是需要按下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_GripTouchStart(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Grip---TouchStart");
    }

    /// <summary>
    /// 側鍵觸摸結束一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_GripTouchEnd(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Grip---TouchEnd");
    }

    /// <summary>
    /// 側鍵按下一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_GripPressed(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Grip---Pressed");
    }

    /// <summary>
    /// 目前沒有發現任何作用
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_GripClicked(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Grip---Clicked");
    }

    /// <summary>
    /// 側鍵按下擡起一次
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Events_GripReleased(object sender, ControllerInteractionEventArgs e)
    {
        Debug.Log("Grip---Realeased");
    }

上面就是對應的手柄按鈕的各種方法,包含觸摸,按下,擡起等,都是執行一次。註釋都很清楚了

在Update裏面實現長按方法如下:

  /// <summary>
    /// 各種按鈕長按監測
    /// </summary>
    private void Update()
    {
        if (Events.buttonTwoPressed)
        {
            Debug.Log("Application---LongPressed");
        }
        if (Events.triggerTouched)
        {
            Debug.Log("Trigger---LongTouched");
        }
        if (Events.triggerHairlinePressed)
        {
            Debug.Log("Trigger---LoneHairlinePressed");
        }
        if (Events.triggerPressed)
        {
            Debug.Log("Trigger---LongPressed");
        }
        if (Events.triggerClicked)
        {
            Debug.Log("Trigger---LongClicked");
        }
        if (Events.touchpadTouched)
        {
            Debug.Log("Touchpad---LongTouch");
        }
        if (Events.touchpadPressed)
        {
            Debug.Log("Touchpad---LongPressed");
        }
        if (Events.gripTouched)
        {
            Debug.Log("Grip---LongTouch");
        }
        if (Events.gripClicked)
        {
            Debug.Log("Grip---LongClicked");
        }


        if ((Angle > 0 && Angle <= 45) || (Angle >= 315 && Angle < 360))
        {
            Debug.Log("Up---LongPress");
        }
        if (Angle > 135 && Angle <= 225)
        {
            Debug.Log("Down---LongPress");
        }
        if (Angle > 225 && Angle < 315)
        {
            Debug.Log("Left---LongPress");
        }
        if (Angle > 45 && Angle <= 135)
        {
            Debug.Log("Right---LongPress");
        }
    }

根據實際情況使用對用的方法

歡迎加羣:4364930討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章