0

例如,一旦用户单击按钮,我想在某些转换期间禁用所有输入。

当然,我可以禁用该按钮,但我正在寻找更通用的解决方案,以避免每个按钮再次出现相同的错误。

我尝试了PushInputDisable/ PopInputDisable,这似乎是我正在寻找的东西,但它inputsimulationservice在弹出后会出现问题,并且总体而言,从 inputsystem 引发的大多数输入事件都没有插入到该禁用堆栈中。

我可以制作一个实现所有接口并使用的输入处理程序PushModalInputHandler,但这对于我想要实现的目标来说似乎有点矫枉过正。另外,例如,它可能无法捕捉到语音命令。

任何简单的解决方案?

4

3 回答 3

1

您可以使用以下代码来禁用和启用输入系统:

public class DisableInputSystemTest : MonoBehaviour
{
    private IMixedRealityInputSystem inputSystem = null;
    private IMixedRealityInputSystem InputSystem
    {
        get
        {
            if (inputSystem == null)
            {
                MixedRealityServiceRegistry.TryGetService<IMixedRealityInputSystem>(out inputSystem);
            }
            return inputSystem;
        }
    }

    public void DisableInputSystem()
    {
        InputSystem.Disable();
    }

    public void EnableInputSystem()
    {
        InputSystem.Enable();
    }
}

请注意,在最新mrtk_development的分支中存在一个错误(问题5085),在重新启用后,您将获得大量空指针,说“NullReferenceException:对象引用未设置为 Microsoft.MixedReality.Toolkit.Input.FocusProvider.RegisterPointers 对象的实例(Microsoft.MixedReality.Toolkit.Input.IMixedRealityInputSource inputSource) (在 Assets/MixedRealityToolkit.Services/InputSystem/FocusProvider.cs:689)"

要解决此问题,请将以下代码从MixedRealityInputSystem.Initalize()的开头移动MixedRealityInputSystem.Enable()

MixedRealityInputSystemProfile profile = ConfigurationProfile as MixedRealityInputSystemProfile;

if (profile.PointerProfile != null)
{
    if (profile.PointerProfile.GazeProviderType?.Type != null)
    {
        GazeProvider = CameraCache.Main.gameObject.EnsureComponent(profile.PointerProfile.GazeProviderType.Type) as IMixedRealityGazeProvider;
        GazeProvider.GazeCursorPrefab = profile.PointerProfile.GazeCursorPrefab;
        // Current implementation implements both provider types in one concrete class.
        EyeGazeProvider = GazeProvider as IMixedRealityEyeGazeProvider;
    }
    else
    {
        Debug.LogError("The Input system is missing the required GazeProviderType!");
        return;
    }
}
else
{
    Debug.LogError("The Input system is missing the required Pointer Profile!");
    return;
}
于 2019-06-27T02:49:36.353 回答
0

现在有这方面的东西,解决了吗?

在 GitHub 上发布之后,似乎没有对这个案例做任何事情,提供了任何适当的解决方案。

如果我用 Juila 提供的这个代码来修复代码,我会得到错误:

混合现实设备管理器已注册!ArgumentException:已添加具有相同键的项目。键:Flat Microsoft.MixedReality.Toolkit.Utilities.ArticulatedHandPose.LoadGesturePose (ArticulatedHandPose.cs:218)

看起来这件事在 MRTK 的核心中要深得多。

有趣的是,当我在一个 HoloLens 上从失去焦点状态返回 Unity 应用程序时,我失去了语音命令,但在另一个 HoloLens 上,相同版本,相同操作系统版本,它工作得非常清楚。

于 2019-09-02T14:50:27.787 回答
0

另一个答案的基础上,如果您需要在 MRTK 回调函数中(例如,在Interactable 的 OnClick 事件回调中)禁用输入系统,则必须调用InputSystem.Disable();协程,否则会遇到错误。例如:

// OnClick callback for MRTK's Interactable
public void OnClick()
{
    // This call causes the following Exception to be raised (and not caught):
    // "InvalidOperationException: Collection was modified; enumeration operation may not execute."
    //Microsoft.MixedReality.Toolkit.CoreServices.InputSystem.Disable();

    // This call successfully disables the input system with no errors
    StartCoroutine(DisableCoroutine());
}

IEnumerator DisableCoroutine()
{
    yield return null;
    Microsoft.MixedReality.Toolkit.CoreServices.InputSystem.Disable();
}

这种方法的唯一缺点是至少需要另一帧才能禁用 MRTK 输入系统,但至少不会出现任何错误。

作为参考,遇到的错误的堆栈跟踪如下:

InvalidOperationException:集合已修改;枚举操作可能无法执行。System.ThrowHelper.ThrowInvalidOperationException (System.ExceptionResource 资源) (at :0) System.Collections.Generic.List`1+Enumerator[T].MoveNextRare () (at :0) System.Collections.Generic.List`1+Enumerator [T].MoveNext () (at :0) Microsoft.MixedReality.Toolkit.BaseDataProviderAccessCoreSystem.LateUpdate () (at Assets/MRTK/Core/Services/BaseDataProviderAccessCoreSystem.cs:69) Microsoft.MixedReality.Toolkit.MixedRealityToolkit+<>c。 b__66_0(Microsoft.MixedReality.Toolkit.IMixedRealityService 服务)(在 Assets/MRTK/Core/Services/MixedRealityToolkit.cs:963)Microsoft.MixedReality.Toolkit.MixedRealityToolkit.ExecuteOnAllServicesInOrder(System.Action`1[T] 执行)(在 Assets /MRTK/Core/Services/MixedRealityToolkit.cs:1034) Microsoft.MixedReality.Toolkit。

于 2020-09-10T17:14:14.147 回答