MRTK Добавить ManipulationHandler в C# - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь динамически добавить события манипуляции в ManipulationHandler, который добавляется к дочерним объектам родителя. Родительский объект будет тем, что проверяет пользователь, но пользователь сможет захватить части родительского объекта и осмотреть их более внимательно. (т.е. вы можете посмотреть на двигатель (родительский объект), но если вы хотите проверить поршни (дочерние объекты), вы можете взять их и посмотреть на них)

Вместо необходимости go в каждом дочернем элементе объект и вручную добавить его в Unity Я хотел бы иметь возможность добавить родительский объект и просто процедурно добавить ManipulationHandler и ManipulationEvent s при запуске или пробуждении.

Пока у меня есть следующий код для добавления сценария ManipulationHandler, но для добавления ManipulationEvent я не уверен, как настроить указатели, чтобы я мог использовать нужный сценарий и функцию из источника:

gameObject.AddComponent<ManipulationHandler>();
ManipulationHandler handler = gameObject.GetComponent<ManipulationHandler>();
ManipulationEvent newevent = new ManipulationEvent();
ManipulationEventData eventdata = new ManipulationEventData();
eventdata.ManipulationSource = gameObject;

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

Я вижу, что есть геттер и сеттер для Pointer в ManipulationEventData, но я Я не уверен, как создать экземпляр IMixedRealityPointer и как заставить его работать. Я также не уверен, что это тот объект, который мне действительно нужен для достижения sh того, чего я хотел бы достичь sh.

Я заранее извиняюсь, если пропустил что-то очевидное. Я новичок в MRTK.

Спасибо!

1 Ответ

1 голос
/ 03 апреля 2020

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 приводит к странному поведению здесь и там. Особенно очень мелкие детали будет почти невозможно захватить ...

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