1、导入SteamVR Plguin包
2、按键绑定设置
点击菜单栏windows/SteamVR input打开SteamVR Input的设置界面,并点击Actions/In下面的的“+”来在default中增加动作定义。

Type:
- boolean:一些按键,是否按下
- vector1:[0-1]的一个范围值可以判断按钮按到哪个程度
- vector2:遥感或者触摸板信息
- vector3:输入一个三维值
- pose:输入三维空间的位置和角度
- 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博客
本文介绍了如何在Unity中使用SteamVR插件获取Vive手柄的状态。首先,导入SteamVR Plugin包并设置按键绑定,接着在脚本中获取手柄状态,再将脚本变量与SteamVR Input的动作进行绑定,最后利用SteamVR内置脚本来处理手柄的各种输入信号。

2391

被折叠的 条评论
为什么被折叠?



