如何在Unity中通过OpenXR获取SteamVR的Trigger等按键输入事件
Unity OpenXR HTC Vive Trigger按键输入获取方案
代码正确性判断
你提供的Trigger按下边缘检测逻辑本身没有语法和逻辑问题,无法获取输入的核心原因是InputDevice设备绑定异常或OpenXR输入映射配置不全。
解决步骤
- 配置校验
进入Project Settings > XR Plug-in Management > OpenXR页面,确认两个配置项:- Interaction Profiles列表中添加的HTC Vive交互配置文件处于激活状态,没有报错提示
- 点击对应配置文件查看Trigger按键的映射路径,确认
triggerButton已经绑定到HTC Vive控制器的Trigger按键按下事件
- 修正设备获取逻辑
你当前代码中的inputDevice变量没有做有效性校验和主动绑定,大概率是空值或者绑定到了非控制器设备,替换为如下完整实现即可:
using UnityEngine.XR; using System.Collections.Generic; private InputDevice leftController; private InputDevice rightController; private bool previousLeftTriggerPressed; private bool previousRightTriggerPressed; private void Start() { RefreshControllerDevices(); // 监听设备热插拔,避免控制器重连后失效 InputDevices.deviceConnected += _ => RefreshControllerDevices(); InputDevices.deviceDisconnected += _ => RefreshControllerDevices(); } private void RefreshControllerDevices() { List<InputDevice> deviceList = new List<InputDevice>(); // 获取左手控制器 InputDevices.GetDevicesWithCharacteristics(InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Left, deviceList); leftController = deviceList.Count > 0 ? deviceList[0] : default; // 获取右手控制器 deviceList.Clear(); InputDevices.GetDevicesWithCharacteristics(InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Right, deviceList); rightController = deviceList.Count > 0 ? deviceList[0] : default; } /// <summary> /// 检测右手Trigger按下的单次事件(按下瞬间返回true,其余时间返回false) /// </summary> public bool IsRightTriggerDown() { if (!rightController.isValid) return false; rightController.TryGetFeatureValue(CommonUsages.triggerButton, out bool isPressed); bool result = !previousRightTriggerPressed && isPressed; previousRightTriggerPressed = isPressed; return result; } /// <summary> /// 检测左手Trigger按下的单次事件(按下瞬间返回true,其余时间返回false) /// </summary> public bool IsLeftTriggerDown() { if (!leftController.isValid) return false; leftController.TryGetFeatureValue(CommonUsages.triggerButton, out bool isPressed); bool result = !previousLeftTriggerPressed && isPressed; previousLeftTriggerPressed = isPressed; return result; } private void OnDestroy() { InputDevices.deviceConnected -= _ => RefreshControllerDevices(); InputDevices.deviceDisconnected -= _ => RefreshControllerDevices(); }
- 备选兼容方案
如果以上方法还是无法获取输入,可以切换使用Unity新输入系统(Input System)实现:- 安装Input System包,在XR插件设置中启用Input System后端支持
- 新建Input Action资产,添加Button类型的Action,绑定路径选择
XR Controller > Right Hand > Trigger > Trigger Button - 直接监听该Action的
Performed事件即可获取Trigger按下通知,适配性更高,不需要手动管理设备绑定。
内容的提问来源于stack exchange,提问作者Led Machine
相关产品推荐
相关产品推荐

