Ответ обновлен 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
}
}
Причина, по которой вы хотите использовать этот подход вместо указателей, заключается в том, что вы можете назначить несколько указателей одному источнику входного сигнала. Поскольку события ввода генерируются из источников ввода, не будет очевидно, какой указатель вы хотите использовать, и они могут со временем меняться. На первый взгляд кажется, что схватить позу смешанной реальности и сопоставить ее немного сложнее, но она будет более надежной для вас в долгосрочной перспективе.