MRTK недетерминированный c отслеживание ввода через события и назначенные действия - PullRequest
0 голосов
/ 08 марта 2020

Я использую MRTK для отслеживания ввода в мое программное обеспечение. Я реализовал следующее:

 public class ScreenControllerMRTK : MonoBehaviour, IMixedRealityBaseInputHandler, IMixedRealityInputHandler<Vector2>, IMixedRealityInputHandler
 { 
     public MixedRealityInputAction Trigger, Grip, Scroll, Swipe, Joystick,DPad, TouchPadClicked, TouchPadTouched, MenuPressed

и подписался на события со следующим:

 private void OnEnable()
 {
    IMixedRealityInputSystem inputSystem;
    if (MixedRealityServiceRegistry.TryGetService<IMixedRealityInputSystem>(out inputSystem))
    {
        inputSystem?.RegisterHandler<IMixedRealityBaseInputHandler>(this);
        inputSystem?.RegisterHandler<IMixedRealityInputHandler<Vector2>>(this);
        inputSystem?.RegisterHandler<IMixedRealityInputHandler>(this);
    }
 }

private void OnDisable()
{
    IMixedRealityInputSystem inputSystem;
    if (MixedRealityServiceRegistry.TryGetService<IMixedRealityInputSystem>(out inputSystem))
    {
        inputSystem?.UnregisterHandler<IMixedRealityBaseInputHandler>(this);
        inputSystem?.UnregisterHandler<IMixedRealityInputHandler<Vector2>>(this);
        inputSystem?.UnregisterHandler<IMixedRealityInputHandler>(this);
    }
}

Моя проблема заключается в том, что событие сгенерировано для захвата позиции DPad (с OnInputChanged) и событие, сгенерированное для событий касания DPad и событий щелчка, не определено c. Я реализовал следующее:

public void OnInputChanged(InputEventData<Vector2> ed)
{       
    if (ed.MixedRealityInputAction == DPad)
    {
        touchpadx = ed.InputData.x;
        touchpady = ed.InputData.y;
    }
}


public void OnInputDown(InputEventData ed)
{        

    if (ed.MixedRealityInputAction == TouchPadClicked)
    {
        touchpadclicked = true;
        Debug.Log("Touchpad Clicked at" + touchpadx + "," + touchpady);
    }

    if (ed.MixedRealityInputAction == TouchPadTouched)
    {
        touchpadtouched = true;
        Debug.Log("Touchpad Touched at" + touchpadx + "," + touchpady);
    }
}

Моя проблема в том, что все эти события недетерминированы c. т.е. иногда я получаю событие TouchPadTouched перед событием OnInputChanged, давая (0,0), когда сенсорная панель касается координат. То же самое с TouchPadClicked. Кроме того, TouchPadClicked также генерирует событие TouchPadTouched (что имеет смысл, вы касаетесь его перед щелчком по нему).

Итак ....

Как отследить, что пользователь нажал на сенсорную панель в определенный момент, не отслеживая касание и убедившись, что у меня есть координаты щелчка? Кроме того, как мне избежать повторения касания? (касание не очень точное и иногда генерирует события с двумя или тремя координатами, когда вы касаетесь большим пальцем), и то же самое касается Thumbstick. Я мог ловить события только через определенное время. Но это звучит вопреки принципу отслеживания событий ...?!?

Я пытался использовать правило ввода-действия в MRTK, но они просто не работают, я не знаю, почему , В этой части MRTK определенно есть ошибка, потому что я продолжаю получать ошибку, упомянутую в моем предыдущем посте:

 IndexOutOfRangeException: Index was outside the bounds of the array.

Простите этот, вероятно, простой вопрос для кодера, возникшего в недетерминированном мире программирования c ... я старый таймер, привыкший к императивному программированию ....!

...