例如,一旦用户单击按钮,我想在某些过渡期间禁用所有输入。
我当然可以禁用该按钮,但是我正在寻找一种更通用的解决方案,以避免看到每个按钮都再次出现相同的错误。
我尝试了PushInputDisable
/ PopInputDisable
,这似乎是我要寻找的东西,但是它使inputsimulationservice
在弹出后出现了错误,并且大多数输入事件都是从可悲的是,inputsystem没有插入该disablestack。
我可以创建一个实现所有接口并使用PushModalInputHandler
的输入处理程序,但是对于我要实现的目标来说似乎有些过高。
另外,它可能无法捕获语音命令。
任何简单的解决方案吗?
答案 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)