如何临时禁用MixedRealityToolkit.InputSystem?

时间:2019-06-25 15:38:51

标签: mrtk

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

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

我尝试了PushInputDisable / PopInputDisable,这似乎是我要寻找的东西,但是它使inputsimulationservice在弹出后出现了错误,并且大多数输入事件都是从可悲的是,inputsystem没有插入该disablestack。

我可以创建一个实现所有接口并使用PushModalInputHandler的输入处理程序,但是对于我要实现的目标来说似乎有些过高。 另外,它可能无法捕获语音命令。

任何简单的解决方案吗?

3 个答案:

答案 0 :(得分:0)

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

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;
}

答案 1 :(得分:0)

现在对此有没有解决?

以下是GitHub上的问题,看来此案未做任何事情,提供了适当的解决方案。

如果我用Juila提供的代码修复了代码,则会出错:

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

在MRTK的核心中,这件事看起来更深了。

有趣的是,当我从失去焦点的状态回到Unity应用时,我在一个HoloLens上丢失了语音命令,但是在另一个HoloLens(相同版本,相同OS版本)上,它运行得非常清晰。

答案 2 :(得分:0)

another answer为基础,如果您需要在MRTK回调函数内(例如,在Interactable's OnClick event回调内)禁用输入系统,则必须调用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.Exception资源资源)(位于:0) System.Collections.Generic.List`1 + Enumerator [T] .MoveNextRare()(在:0处) System.Collections.Generic.List`1 + Enumerator [T] .MoveNext()(在:0处) Microsoft.MixedReality.Toolkit.BaseDataProviderAccessCoreSystem.LateUpdate()(位于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.MixedRealityToolkit.LateUpdateAllServices()(位于Assets / MRTK / Core / Services / MixedRealityToolkit.cs:963) Microsoft.MixedReality.Toolkit.MixedRealityToolkit.LateUpdate()(位于Assets / MRTK / Core / Services / MixedRealityToolkit.cs:638)