SteamVR Plugin 2.7.2+按钮测试总结
更新版本的SteamVR Plugin 2.7.2中的controller按钮确实很方便了,但是刚开始使用的时候有点难以理解,测试的时候不出自己的效果。
其实整体思想上没有变化,都是自己写脚本的时候,如何获取你想要的按钮的状态,1.0版本都是自己去写,比较随便,当硬件换了的时候,整体代码就需要重新写,比较麻烦。而2.0官方进行了一个封装,将硬件中各个按钮和脚步进行了独立封装,硬件是硬件,软件是软件。
1 所谓硬件部分的配置
SteamVR Input 中添加actions,匹配相应的按钮;
下面这个一定要步骤,添加了自己的东西的话,一定要点击“Save and generate”,保持同步:
以上步骤定义了运动集,比如默认的那个运动集:有interact,Teleport等等,如何将这些值和手柄的各个按键匹配,是最重要的步骤。如下点击open Binding UI,打开匹配界面。
下面这个操作后,匹配完自己的action后,一定要点击“替换默认键按钮”
这里注意:建议左右手自己匹配自己的,不要选镜像模式,我一直没有靠这个模式匹配成功,最后单独匹配了右手手柄。
2 软件使用这些按钮的步骤
1 新建一个cs脚本
在cs脚本中添加三个
using Valve.VR;
using Valve.VR.Extras;
using Valve.VR.InteractionSystem;
2 在脚本类中,创建action按钮值
需要啥类型的就搞啥类型的
public SteamVR_Action_Boolean GrabAction;
public SteamVR_Action_Boolean TeleportAction;
public SteamVR_Action_Boolean TrigerAction;
在update函数中进行测试:
if (GrabAction.GetStateDown(SteamVR_Input_Sources.Any))
{
Debug.Log("grab");
}
if (TeleportAction.GetState(SteamVR_Input_Sources.Any))
{
Vector2 teleport_axis = TeleportAxis.GetAxis(SteamVR_Input_Sources.Any);
Debug.Log("teleport:" + teleport_axis);
}
if (TrigerAction.GetStateDown(SteamVR_Input_Sources.Any))
{
Debug.Log("triger");
}
3 unity UI中的操作
3 测试效果:
注:主要参考的是文献3,其他的几个资料主要理解了下整个流程
4 代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using Valve.VR.Extras;
using Valve.VR.InteractionSystem;
public class HTC_Controller : MonoBehaviour
{
private Vector3 Endpos;
public SteamVR_Action_Boolean forward;
public SteamVR_Action_Boolean manuRotate;
// Update is called once per frame
private void Start()
{
Endpos = GameObject.Find("Controller (right)").GetComponent<MyRay>().end_pos;
}
private void Update()
{
if (forward.GetStateDown(SteamVR_Input_Sources.Any))
{
Debug.Log("forward");
print("ok");
}
if (manuRotate.GetStateDown(SteamVR_Input_Sources.Any))
{
Debug.Log("manuRotate");
}
}
}
5 总结
如果上面的步骤整体上还是整不通,建议去youtube 去搜SteamVR Plugin 2.0看一个教学视频,或者看看文献1中的资料,文献1是官方文档
此处总结一下流程:
1.打开SteamVR Input window添加actions,Save and generate,
2.在binging UI绑定action,点击“替换默认键按钮”
3.在脚本中添加public属性的几个变量,并用”变量.GetStateDown(SteamVR_Input_Sources.Any)“形式获取按钮的响应值
4.脚本挂在controller上
5.在unity 的UI界面中选取相应的action匹配值
6.测试
具体操作参考上面的步骤;
在第三步获取按钮的相应值由很多种方法,但是我目前测试成功这种,其他的还没成功;
bool state = SteamVR_Actions._default.Plant[SteamVR_Input_Sources.LeftHand].state;
bool state = SteamVR_Actions.default_Plant[SteamVR_Input_Sources.LeftHand].state;
bool state = SteamVR_Input.GetState("Plant", SteamVR_Input_Sources.LeftHand);
SteamVR_Action_Boolean action = SteamVR_Input.GetBooleanAction("Plant");
bool state = action.GetState(SteamVR_Input_Sources.LeftHand);
6 参考文献
1.https://valvesoftware.github.io/steamvr_unity_plugin/tutorials/SteamVR-Input.html
4.https://zhuanlan.zhihu.com/p/52567129
5.https://blog.csdn.net/littlelittlesir/article/details/105636712