ManipulationHandler
имеет четыре события обратного вызова среди них OnManipulationStarted
и OnManipulationEnded
, к которым вы можете просто добавить слушателей. (см. UnityEvent.AddListener
)
Если я неправильно понял ваш вопрос, вам не нужно создавать экземпляр IMixedRealityPointer
. Вы сами не создаете данные события, а ManipulationHandler
передает эти события данными текущего события, включая информацию о взаимодействующем указателе. ManipulationHandler
использует OnPointerDown
и OnPointerDragged
и OnPointerUp
через интерфейс IMixedRealityPointerHandler
для управления взаимодействующими указателями и при необходимости вызывает соответствующие события.
Вместо использования AddComponent
с последующим GetComponent
напрямую сохраните и используйте возвращаемое значение AddComponent
, которое будет ссылкой на вновь добавленный компонент. MRTK также имеет метод расширения
T EnsureComponent<T>(this Component component) where T : Component
, так что вы можете просто использовать, например,
var handler = this.EnsureComponent<ManipulationHandler>();
, который сначала внутренне проверяет, существует ли компонент, а если нет, то добавляет его.
Обратите внимание, что для включения ближних взаимодействий вам также понадобится NearInteractionGrabbable
, поэтому вы должны добавить и его.
Вы также должны убедиться, что ваши объекты имеют какое-то Collider
прикреплен к тому же GameObject
, что и NearInteractionGrabbable
.
...
gameObject.transform.EnsureComponnet<NearInteractionGrabbable>();
var handler = gameObject.transform.EnsureComponnet<ManipulationHandler>();
handler.OnManipulationStarted.AddListener(HandleOnManipulationStarted);
handler.OnManipulationEnded.AddListener(HandleOnManipulationEnded);
...
/// <summary>
/// If you need it later you need to store the pointer since unfortunately in
/// OnManipulationEnded the <see cref="ManipulationEventData.Pointer"/> is null
/// (no idea why they do it this way :D )
/// </summary>
private IMixedRealityPointer _pointer;
private void HandleOnManipulationStarted(ManipulationEventData eventData)
{
_pointer = eventData.Pointer;
// whatever shall happen when manipulation started
}
private void HandleOnManipulationEnded(ManipulationEventData eventData)
{
// whatever shall happen when manipulation ended
}
Примечание : я не уверен, что эта вещь, которую вы пытаетесь достичь, возможно с этой архитектурой ... очень возможно, что вложение различных ManipulationHanlder
приводит к странному поведению здесь и там. Особенно очень мелкие детали будет почти невозможно захватить ...