0

就这样吧,我要践踏我的骄傲!

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

MRTK 文档很好地解释了如何在这里配置它:

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

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

任何线索如何做到这一点?

非常感谢!

4

2 回答 2

3

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

PointerUtils.SetMotionControllerRayPointerBehavior(PointerBehavior.AlwaysOff);

请参阅此处的文档:https ://github.com/microsoft/MixedRealityToolkit-Unity/blob/mrtk_release/Documentation/Input/Pointers.md

于 2020-03-19T20:04:09.743 回答
0

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

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

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

将此提交中的更改应用到您的 MRTK 克隆。此更改更新了 MRTK 中的 FocusProvider 以使 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;
                }
            }
        }
    }
}
于 2019-06-04T00:09:29.163 回答