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
相关产品推荐
相关产品推荐

