You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity中通过OpenXR获取SteamVR的Trigger等按键输入事件

Unity OpenXR HTC Vive Trigger按键输入获取方案

代码正确性判断

你提供的Trigger按下边缘检测逻辑本身没有语法和逻辑问题,无法获取输入的核心原因是InputDevice设备绑定异常或OpenXR输入映射配置不全。

解决步骤

  • 配置校验
    进入Project Settings > XR Plug-in Management > OpenXR页面,确认两个配置项:
    1. Interaction Profiles列表中添加的HTC Vive交互配置文件处于激活状态,没有报错提示
    2. 点击对应配置文件查看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)实现:
    1. 安装Input System包,在XR插件设置中启用Input System后端支持
    2. 新建Input Action资产,添加Button类型的Action,绑定路径选择XR Controller > Right Hand > Trigger > Trigger Button
    3. 直接监听该Action的Performed事件即可获取Trigger按下通知,适配性更高,不需要手动管理设备绑定。

内容的提问来源于stack exchange,提问作者Led Machine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:36:06