如何关闭运动控制器指针介体

时间:2019-05-22 01:56:24

标签: pointers controller mrtk

就是这样,我会加倍自豪!

我正在使用MRTK v2,并且工作正常,除了在某些时候我想关闭指针介体(从运动控制器延伸到对象并提供输入的线)。环顾四周并尝试在MRTK文档中找到它(一定很容易,对吗?),我仍然在墙上敲打头,开始感到受伤。...

MRTK文档很好地解释了如何在此处进行配置:

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

但是我希望在脚本中执行此操作,并根据需要在应用程序中启用和禁用它。

有什么线索怎么做?

非常感谢!

2 个答案:

答案 0 :(得分:1)

好问题!这是一种对我有用的方法。您可以在以下存储库中查看我的解决方案:https://github.com/julenka/MixedRealityToolkit-Unity/tree/so/linepointer_off。打开场景Assets/TurnOffLinePointerTest.unity,然后使用手模拟按下按钮。在Assets/PointerConfigurationExample.cs中打开/关闭指针的代码。

注意:之所以需要使用这种方法来修改中介者而不是直接设置myPointer.IsActive = false是因为默认中介者每帧都会覆盖这些值。幸运的是,您可以自定义此行为。

步骤1:稍微更新MRTK,以便可以访问PointerMediator

将更改from this commit应用于MRTK克隆。此更改更新了MRTK中的FocusProvider,以使PointerMediator可公开访问,并通过更新要保护的字段(而不是私有字段)并使方法虚拟化,从而使DefaultPointerMediator可扩展。请参见this pull request,该更改直接在MRTK中实现。

第2步:创建一个自定义PointerMediator,它将关闭远指针

创建一个自定义的指针介体,如the one from this commit

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,因此它适应了几乎所有默认的中介程序逻辑。确保已完全应用更改from the first commit,否则将无法扩展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;
                }
            }
        }
    }
}

答案 1 :(得分:1)

回答了我自己的问题。简单:

PointerUtils.SetMotionControllerRayPointerBehavior(PointerBehavior.AlwaysOff);

在此处查看文档:{​​{3}}