Отличный вопрос!Вот один из способов сделать это, который сработал для меня.Вы можете увидеть мое решение в этом хранилище: 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).
Шаг 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;
}
}
}
}
}