Как отключить указатель-посредник Motion Controller
Вот и все, я наступлю на свою гордость!
Я использую MRTK v2 и работаю нормально, за исключением того, что в какой-то момент я хочу отключить посредник указателя (линия, идущая от контроллера движения до объекта и обеспечивающая ввод). Осмотревшись вокруг и попытавшись найти его в документации MRTK (это должно быть легко, верно?), Я все еще бью себя по стене, и это начинает болеть....
Документация MRTK довольно хорошо объясняет, как его настроить здесь:
Но я пытаюсь сделать это в скрипте, включив и отключив его так, как мне нужно в моем приложении.
Любая подсказка, как это сделать?
Большое спасибо!
0 ответов
Ответил на свой вопрос. Просто:
PointerUtils.SetMotionControllerRayPointerBehavior(PointerBehavior.AlwaysOff);
См. Документацию здесь: https://github.com/microsoft/MixedRealityToolkit-Unity/blob/mrtk_release/Documentation/Input/Pointers.md
Отличный вопрос! Вот один из способов сделать это, который сработал для меня. Вы можете увидеть мое решение в этом хранилище: 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, который будет отключать дальние указатели
Создайте пользовательский Pointer Mediator, такой как этот коммит.
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).
Шаг 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;
}
}
}
}
}