如果您退出应用程序进入外壳,则手光线会卡住,而如果应用程序未选中“在后台运行”,则返回

时间:2019-07-24 03:22:41

标签: mrtk

描述错误 如果您退出应用程序进入外壳,则手光线会卡住,而如果应用程序未选中“在后台运行”,则返回。旧手射线被卡住,新手射线弹出。因此,您可以同时看到3条或更多条手线。似乎抓斗停止工作,但并非总是如此,但有时会停止。但是,如果远处的交互指针可见,它们总是会在进入shell时卡住。

此勾号是https://github.com/microsoft/MixedRealityToolkit-Unity/issues/4196的重新打开,因为发现了问题,为什么我们的应用程序的行为不同于MRTK示例应用程序。区别在于我们在“后台运行”中未选中,而在MRTK中已选中。

我们希望我们的应用不必在后台运行,以免耗尽电池。但是,如果需要这样做,应该将其记录在某处。

复制 可使用标准MRTK示例构建进行复制。在构建之前,请取消选中“玩家设置”的“解决方案和演示”部分中的“在后台运行”。然后在应用程序中的设备上,如果您在可见手射线的情况下按了主页按钮,然后通过“开始”菜单上的主页按钮转到外壳。等待几秒钟(约10秒)。并打开该应用程序,即可看到以前的手射线,然后出现新的手射线。

预期行为 只有新的手射线可见

1 个答案:

答案 0 :(得分:0)

我认为,这归因于InteractionManager在应用程序进入外壳时不会引发视图中的源丢失事件。 Unity错误:https://fogbugz.unity3d.com/default.asp?1162545_9ee6crevf35hsbl5

作为一种解决方法,您可以尝试在应用程序失去焦点时,将以下代码添加到WindowsMixedRealityDeviceManager中,以清除现有的控制器。请记住,这将在WMR设备中引起问题,因为当您取下耳机时,应用会失去焦点,但6个DOF控制器仍然存在,因此它们将被清除并且永远不会恢复。

        public override void Enable()
        {
            // ...
#if !UNITY_EDITOR
            Application.focusChanged += OnFocusChanged;
#endif
        }

        public override void Disable()
        {
#if !UNITY_EDITOR
            Application.focusChanged -= OnFocusChanged;
#endif 
            // ...
        }

#if !UNITY_EDITOR
        private void OnFocusChanged(bool focus)
        {
            // Remove all active controllers when losing focus
            if (!focus && !Application.runInBackground)
            {
                IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem;

                foreach (var keyValue in activeControllers)
                {
                    var controller = keyValue.Value as BaseWindowsMixedRealitySource;

                    if (controller != null)
                    {
                        inputSystem?.RaiseSourceLost(controller.InputSource, controller);

                        foreach (IMixedRealityPointer pointer in controller.InputSource.Pointers)
                        {
                            if (pointer != null)
                            {
                                pointer.Controller = null;
                            }
                        }
                    }
                }

                activeControllers.Clear();
            }
        }
#endif // !UNITY_EDITOR