Как получить связанный указатель из InputEventData? - PullRequest
0 голосов
/ 04 июня 2019

Я установил двухосевое входное действие и соответствующий обработчик.

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

public void OnInputChanged(InputEventData<Vector2> eventData)
{
    if (eventData.MixedRealityInputAction.Description == "MyInputAction")
    {
        // How to do something like this?
        // var pointer = eventData.Pointer;

        eventData.Use();
    }
}

Если с действием нет указателя (например, из голосовой команды), я могу обработать его по-другому, используя взамен Gaze.

1 Ответ

2 голосов
/ 06 июня 2019

Ответ обновлен 6/11 / 2019

Вы можете найти указатель, связанный с событием Input {Down, Up, updated}, с помощью следующего кода:

public void OnInputDown(InputEventData eventData)
{
    foreach(var ptr in eventData.InputSource.Pointers)
    {
        // An input source has several pointers associated with it, if you handle OnInputDown all you get is the input source
        // If you want the pointer as a field of eventData, implement IMixedRealityPointerHandler
        if (ptr.Result != null && ptr.Result.CurrentPointerTarget.transform.IsChildOf(transform))
        {
            Debug.Log($"InputDown and Pointer {ptr.PointerName} is focusing this object or a descendant");
        }
        Debug.Log($"InputDown fired, pointer {ptr.PointerName} is attached to input source that fired InputDown");
    }
}

Обратите внимание: если вы заботитесь об указателях, возможно, вы используете неправильный обработчик событий. Рассмотрим вместо реализации IMixedRealityPointerHandler вместо IMixedRealityInputHandler.

Оригинальный ответ

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

class MyClass : IMixedRealityInputHandler<Vector2>, IMixedRealityInputHandler<MixedRealityPose>

Затем следите за идентификатором источника для отображения ...

Dictionary<uint, MixedRealityPose> controllerPoses = new Dictionary<uint, MixedRealityPose>;
public void OnInputChanged(InputEventData<MixedRealityPose> eventData)
{
    controllerPoses[eventData.SourceId] = eventData.InputData
}

Наконец, получите эти данные в своем обработчике:

MixedRealityInputAction myInputAction;
public void OnInputChanged(InputEventData<Vector2> eventData)
{
    // NOTE: would recommend exposing a field myInputAction in Unity editor
    // and assigning there to avoid string comparison which could break more easily.
    if (eventData.MixedRealityInputAction == myInputAction)
    {
        MixedRealityPose controllerPose = controllerPoses[eventData.SourceId];
        // Do something with the pointer
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...