Как отключить указатель линии контроллера движения - PullRequest
0 голосов
/ 22 мая 2019

Вот и все, я наступлю на свою гордость!

Я использую MRTK v2 и работаю нормально, за исключением того, что в какой-то момент я хочу отключить линию, идущую от контроллера движения к объекту, иэто обеспечивает вклад.Осмотревшись вокруг и попытавшись найти его в документации MRTK (это должно быть легко, верно?), Я все еще бьюсь головой об стену, и это начинает болеть ....

Документация MRTKЗдесь довольно хорошо объясняется, как его настроить:

https://github.com/microsoft/MixedRealityToolkit-Unity/blob/mrtk_release/Documentation/Input/Pointers.md

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

Любая подсказка, как это сделать?

Большое спасибо!

1 Ответ

1 голос
/ 04 июня 2019

Отличный вопрос!Вот один из способов сделать это, который сработал для меня.Вы можете увидеть мое решение в этом хранилище: https://github.com/julenka/MixedRealityToolkit-Unity/tree/so/linepointer_off. Откройте сцену Assets/TurnOffLinePointerTest.unity и затем используйте ручное моделирование для нажатия кнопок.Код для включения / выключения указателей находится в Assets/PointerConfigurationExample.cs.

Примечание: причина, по которой вам нужно использовать этот подход для изменения медиатора вместо прямой установки myPointer.IsActive = false, заключается в том, что медиатор по умолчанию перезаписывает эти значениякаждый кадр.К счастью, вы можете настроить это поведение.

Шаг 1: Немного обновите MRTK, чтобы к PointerMediator можно было получить доступ

Примените изменения этого коммита к вашему клону MRTK.Это изменение обновляет FocusProvider в MRTK, делая PointerMediator общедоступным, и расширяет DefaultPointerMediator, обновляя защищаемые поля вместо личных и делая методы виртуальными.См. этот запрос на извлечение , который реализует это изменение непосредственно в MRTK.

Шаг 2: Создайте собственный PointerMediator, который будет отключать дальние указатели

Создайте собственный посредник указателей, например тот из этого коммита .

using System.Collections.Generic;
using Microsoft.MixedReality.Toolkit.Input;

public class CustomPointerMediator : DefaultPointerMediator
{
    public bool FarPointersDisabled {get; set;}

    public override void UpdatePointers()
    {
        base.UpdatePointers();
        if (FarPointersDisabled)
        {
            foreach(var pointer in farInteractPointers)
            {
                pointer.IsActive = false;
            }
        }
    }
}

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

Шаг 3. Скажите MRTK, чтобы использовать ваш собственный посредник указателя

В вашем профиле указателя настройте MRTK для использования собственного посредника указателя вместо посредника указателя по умолчанию.Обратите внимание, что на рисунке я создал собственный профиль указателя как часть пользовательской системы ввода (не изменяйте профиль по умолчанию, в противном случае ваши изменения могут быть перезаписаны при обновлении MRTK).

enter image description here

Шаг 4. Компонент, использующий пользовательский посредник для включения / выключения указателей линии

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

public class PointerConfigurationExample : MonoBehaviour
{
    /* Turns off all far interaction pointers */
    public void TurnOffFarPointers()
    {
        Debug.Log("Line pointers off");
        SetFarPointersDisabled(true);
    }

    public void TurnOnFarPointers()
    {
        Debug.Log("Line pointers on");
        SetFarPointersDisabled(false);
    }

    private void SetFarPointersDisabled(bool isDisabled)
    {
        FocusProvider focusProvider = (FocusProvider) MixedRealityToolkit.InputSystem.FocusProvider;
        if (focusProvider != null)
        {
            foreach(var mediator in focusProvider.PointerMediators)
            {
                // Note: you could check here to make sure you only disable pointers for hands
                CustomPointerMediator myMediator = (CustomPointerMediator) (mediator.Value);
                if (myMediator != null)
                {
                    myMediator.FarPointersDisabled = isDisabled;
                }
            }
        }
    }
}
...