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

Meta Quest 3场景加载时XRInputSubsystem.trackingOriginUpdated事件重复触发求助

Meta Quest 3 中 XRInputSubsystem.trackingOriginUpdated 事件重复触发问题

我在使用XRInputSubsystem.trackingOriginUpdated事件实现Meta Quest 3长按菜单按钮执行重定位的逻辑时,遇到了一个棘手的问题:60%-70%的场景加载场景时,该事件会被重复触发,只有手动执行重定位操作才能终止这个现象。

已经排查确认并非多次订阅事件导致,当前仅注册了一个子系统,相关代码如下:

SubsystemManager.GetSubsystems(m_XRInputSubsystems);
foreach (XRInputSubsystem subsystem in m_XRInputSubsystems)
{
    subsystem.trackingOriginUpdated += HandleRecenterDetected;
}

有没有其他开发者遇到过类似问题?以下是几个可能的解决方向:

  • 延迟订阅事件:场景加载完成后,XR子系统可能会因空间锚点初始化自动触发一次trackingOriginUpdated。可以尝试在场景加载完成后延迟1-2秒再订阅事件,避开初始化阶段的自动触发。

  • 确保正确取消订阅:在场景卸载或对象销毁时,务必取消事件订阅,避免旧回调残留。示例代码:

private void OnDestroy()
{
    foreach (XRInputSubsystem subsystem in m_XRInputSubsystems)
    {
        subsystem.trackingOriginUpdated -= HandleRecenterDetected;
    }
}
  • 添加触发判定条件:在HandleRecenterDetected方法中,增加对用户输入状态的检查,只有当检测到菜单按钮长按的输入时,才执行重定位逻辑,忽略子系统自动触发的事件。

  • 防抖处理:给事件回调添加防抖机制,短时间内重复触发则忽略后续调用:

private float _lastRecenterTriggerTime = 0f;
private const float RecenterCooldown = 1f;

private void HandleRecenterDetected(XRInputSubsystem subsystem)
{
    if (Time.time - _lastRecenterTriggerTime < RecenterCooldown)
    {
        return;
    }
    _lastRecenterTriggerTime = Time.time;
    
    // 执行你的重定位逻辑
}
  • 检查TrackingOriginMode设置:确认初始化时将子系统的trackingOriginMode设置为TrackingOriginMode.Floor,避免因模式切换导致的额外事件触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:06:01