Как временно отключить MixedRealityToolkit.InputSystem? - PullRequest
0 голосов
/ 25 июня 2019

Я хотел бы отключить все входы во время некоторых переходов, когда пользователь, например, нажал кнопку.

Конечно, я мог бы отключить кнопку, но я ищу более общее решение, чтобы избежать повторения одной и той же ошибки для каждой кнопки.

я попробовал PushInputDisable / PopInputDisable, что, кажется, то, что я ищу, но это делает inputsimulationservice глючным после всплывающего окна, и в целом большинство событий ввода, вызванных системой ввода, к сожалению, не подключены к этот стек стека.

Я мог бы создать обработчик ввода, который реализует все интерфейсы и использовать PushModalInputHandler, но это кажется немного излишним для того, чего я пытаюсь достичь. Кроме того, он может не перехватить голосовые команды, например.

Любое простое решение?

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете использовать следующий код для отключения и включения системы ввода:

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.

Чтобы исправить, переместите следующий код из 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...