steamVR 获取vive手柄

本文介绍了如何在Unity中使用SteamVR插件获取Vive手柄的状态。首先,导入SteamVR Plugin包并设置按键绑定,接着在脚本中获取手柄状态,再将脚本变量与SteamVR Input的动作进行绑定,最后利用SteamVR内置脚本来处理手柄的各种输入信号。

1、导入SteamVR Plguin包

2、按键绑定设置

点击菜单栏windows/SteamVR input打开SteamVR Input的设置界面,并点击Actions/In下面的的“+”来在default中增加动作定义。

    Type:

  1. boolean:一些按键,是否按下
  2. vector1:[0-1]的一个范围值可以判断按钮按到哪个程度
  3. vector2:遥感或者触摸板信息
  4. vector3:输入一个三维值
  5. pose:输入三维空间的位置和角度
  6. skeleton:比如手部的关节信息

点击Open binding UI 把刚创建的Actions与按键进行绑定。只有连接了设备才能打开此窗口。

3、在脚本中获取手柄状态

创建脚本,并添加到控件上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Valve.VR;
using static System.Net.Mime.MediaTypeNames;

public class handController : MonoBehaviour
{
    // Start is called before the first frame update
    public SteamVR_Action_Boolean xState;
    public SteamVR_Action_Boolean yState;
    public SteamVR_Action_Boolean aState;
    public SteamVR_Action_Boolean bState;
    public SteamVR_Action_Boolean leftInteractUI;
    public SteamVR_Action_Boolean leftGrabpinCH;
    public SteamVR_Action_Single leftSqueeze;
    public SteamVR_Action_Boolean leftRockerState;
    public SteamVR_Action_Vector2 leftRockerValue;
    public SteamVR_Action_Boolean leftGrabgripState;
    public SteamVR_Action_Boolean leftMenuState;
    public UnityEngine.UI.Text text;


    public Camera camera;

    

    void Start()
    { 
        xState.onStateDown += onXDown;
        xState.onStateUp += onXUp;
        yState.onStateDown += onYDown;
        yState.onStateUp += onYUp;
        aState.onStateDown += onADown;
        aState.onStateUp += onAUp;
        bState.onStateDown += onBDown;
        bState.onStateUp += onBUp;
        leftInteractUI.onStateDown += onLeftInteractUIDown;
        leftInteractUI.onStateUp += onLeftInteractUIUp;
        leftGrabpinCH.onStateDown += onLeftGrabpinCHDown;
        leftGrabpinCH.onStateUp += onLeftGrabpinCHUp;
        leftSqueeze.onChange += onLeftSqueeze;
        leftRockerState.onStateDown += onLeftRockerDown;
        leftRockerState.onStateUp += onLeftRockerUp;
        leftRockerValue.onChange += onLeftRockerValue;
        leftGrabgripState.onStateDown += onLeftGrabgripDown;
        leftGrabgripState.onStateUp += onLeftGrabgripUp;
        leftMenuState.onStateDown += onLeftMenuDown;
        leftMenuState.onStateUp += onLeftMenupUp;        

    }

    private void OnDestroy()
    {
        xState.onStateDown -= onXDown;
        xState.onStateUp -= onXUp;
        yState.onStateDown -= onYDown;
        yState.onStateUp -= onYUp;
        aState.onStateDown -= onADown;
        aState.onStateUp -= onAUp;
        bState.onStateDown -= onBDown;
        bState.onStateUp -= onBUp;
        leftInteractUI.onStateDown -= onLeftInteractUIDown;
        leftInteractUI.onStateUp -= onLeftInteractUIUp;
        leftGrabpinCH.onStateDown -= onLeftGrabpinCHDown;
        leftGrabpinCH.onStateUp -= onLeftGrabpinCHUp;
        leftSqueeze.onChange -= onLeftSqueeze;
        leftRockerState.onStateDown -= onLeftRockerDown;
        leftRockerState.onStateUp -= onLeftRockerUp;
        leftRockerValue.onChange -= onLeftRockerValue;
        leftGrabgripState.onStateDown -= onLeftGrabgripDown;
        leftGrabgripState.onStateUp -= onLeftGrabgripUp;
        leftMenuState.onStateDown -= onLeftMenuDown;
        leftMenuState.onStateUp -= onLeftMenupUp;   
    }

    // Update is called once per frame
    void Update()
    {
        //相机角度极为头盔的角度
         Debug.Log(camera.transform.localRotation.x +" "+ camera.transform.localRotation.y + " " + camera.transform.localRotation.z); 
    }

    void onXDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    { 
        Debug.Log("x down");
    }
    void onXUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    { 
        //调用text的脚本中的Add方法    
        TextFunc func = text.GetComponent<TextFunc>();
        func.Add();
        Debug.Log("x up");
    }

    void onYDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        //调用text的脚本中的Sub方法  
        TextFunc func = text.GetComponent<TextFunc>();
        func.Sub();
        Debug.Log("y down");
    }
    void onYUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("y up");
    }
    void onADown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("a down");
    }
    void onAUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("a up");
    }
    void onBDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("b down");
    }
    void onBUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("b up");
    }
    void onLeftInteractUIDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftInteractUI down");
    }
    void onLeftInteractUIUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftInteractUI up");
    }

    void onLeftGrabpinCHDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftGrabpinCH down");
    }
    void onLeftGrabpinCHUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftGrabpinCH up");
    }

    void onLeftSqueeze(SteamVR_Action_Single fromAction, SteamVR_Input_Sources fromSource, float newAxis, float newDelta)
    { 
        Debug.Log( newAxis + "  " + newDelta);
    }


    void onLeftRockerDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftRocker down");
    }
        void onLeftRockerUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
        {
        Debug.Log("leftRocker up");
    } 
    void onLeftRockerValue(SteamVR_Action_Vector2 fromAction, SteamVR_Input_Sources fromSource, Vector2 axis, Vector2 delta)
    {
        Debug.Log(axis.x +"  "+ axis.y );
    }

    void onLeftGrabgripDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftGrabgrip down");
    }
    void onLeftGrabgripUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftGrabgrip up");
    }
    void onLeftMenuDown(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftMenu down");
    }
    void onLeftMenupUp(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
    {
        Debug.Log("leftMenu up");
    } 
}

4、把脚本中的变量与SteamVR Input中的Actions进行绑定

5、使用steamVR内置脚本

SteamVR 为我们提供了几个动作相关脚本:
SteamVR_Behaviour_Boolean, SteamVR_Behaviour_Single, SteamVR_Behaviour_Vector2, SteamVR_Behaviour_Vector3, SteamVR_Behaviour_Pose, and SteamVR_Behaviour_Skeleton

可以把它们挂载到游戏物体上:
 

然后在面板上设置参数,原理和刚刚介绍的用代码获取动作是一样的,当然,我们也可以在自己写的脚本中去获取动作,判断动作是否发生。

参考:Unity SteamVR 开发教程:SteamVR Input 输入系统(2.x 以上版本)_steamvr开发教程-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值