MRTK v2.1的HL1输入

时间:2019-06-29 23:18:42

标签: c# mrtk

我试图找到一个配置,或者确定我需要对MRTK v2.1进行哪些附加操作,才能像以前的工作流程一样在“编辑器”工作中对HL1进行测试。简化了,它是像在MRTK v2之前一样使用Gaze和鼠标的功能。

我还没有找到一种方法来映射配置文件中的鼠标左键,使其表现出与可见手相同的行为。用可见的手按下鼠标左键即可进行操作。我们只是需要凝视它。注意:将“手部模拟”更改为手势不会产生正确的行为,只会使凝视光标持续存在而没有交互。

我在很多地方都问过这个问题,而且常常被误解,所以这里有一些背景知识。我们将继续为需要严格质量检查的客户提供应用程序。必须像使用新的MRTK一样对它们进行测试。让我们的QA团队在HL1项目上使用明确的手是不合理的,因为它会引入人为错误,这对错误测试不利。

需求是: 1.将光标保留在编辑器中。 (在最新版本中,通过空格键使用指针后,它消失了。)在我们看来,这应该是一个切换。是的,我们知道您可以按“ 1”来模拟选择,但是如上所述,对于正确的质量检查来说,这是不可接受的。 2.不用鼠标左键,触发“选择”和“捏”。我已经编写了一个服务扩展程序来处理“选择”,但是事实证明,与“手动”发音相关联的捏合是一个挑战。

到目前为止建议的解决方案:将“手部模拟”模式更改为“手势”。不幸的是,Gestures消除了用双手进行HL2测试的能力,并且不向鼠标左键提供“选择”或“捏”行为。因此,它要么无法正常工作,要么没有正确的解决方案。

我们看不到无法在编辑器中同时测试HL1和HL2的原因。不使用手时,我们只是缺少使用鼠标左键。

这是我为鼠标左键创建的服务扩展,用于发送“选择”事件。这将在“难处理”上触发OnClick()事件。它还缺少用鼠标左键移动或操纵“操纵处理程序”的“捏”功能。

[MixedRealityDataProvider(
        typeof(IMixedRealityInputSystem),
        (SupportedPlatforms)(-1), // All platforms supported by Unity
        "Unity Mouse Device Manager")]
    public class TharynMouseService : BaseInputDeviceManager, ITharynMouseService
    {
        private TharynMouseServiceProfile tharynMouseServiceProfile;

        public TharynMouseService(
            IMixedRealityServiceRegistrar registrar,
            IMixedRealityInputSystem inputSystem,
            string name,  
            uint priority,  
            BaseMixedRealityProfile profile) : base(registrar, inputSystem, name, priority, profile) 
        {
            tharynMouseServiceProfile = (TharynMouseServiceProfile)profile;
        }

        private IMixedRealityInputSource inputSource;
        private IMixedRealityInputSystem inputSystem;

        public override void Initialize()
        {
            // Do service initialization here.
            inputSystem = Service as IMixedRealityInputSystem;
            Debug.Log("inputSystem: " + inputSystem);

            inputSource = inputSystem.RequestNewGenericInputSource("Tharyn Mouse Service");
            Debug.Log("inputSource: " + inputSource);

            inputSystem.RaiseSourceDetected(inputSource);
        }

        public override void Update()
        {
            // Do service updates here.
            if (UnityEngine.Input.GetKeyDown(KeyCode.Mouse0))
            {
                inputSystem.RaiseOnInputUp(inputSource, Handedness.None, tharynMouseServiceProfile.TapAction);
                Debug.Log("Down");
                Debug.Log("inputSystem: " + inputSystem);
                Debug.Log("inputSource: " + inputSource);
                Debug.Log("TapAction: " + tharynMouseServiceProfile.TapAction);
            }
        }
    }

需要:

  1. 触发与释放空格键以返回凝视光标时的'1'键相同的事件。
  2. 扩展上述服务以包括“ Pinch”事件/操作,以便可以像使用Hand一样使用Gaze和Mouse操纵对象。

预先加油,谢谢!

Tharyn

1 个答案:

答案 0 :(得分:0)

通过创建一个向MRTK输入系统调用OnInputDown和OnInputUp事件的组件,您可以仅使用鼠标+光标即可实现模拟捏手,释放手事件的功能。然后,您需要将此组件附加到场景中的游戏对象上。

模拟OnInputDown和OnInputUp事件的关键代码如下:

public void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        InputSystem?.RaiseOnInputDown(
            InputSource,
            Handedness.Right,
            selectAction
            );
    }
    if (Input.GetMouseButtonUp(0))
    {
        InputSystem?.RaiseOnInputUp(
            InputSource,
            Handedness.Right,
            selectAction
            );
    }
}

这是组件的完整代码,它将引发输入向下和向上事件,使您可以仅使用鼠标来模拟捏合和拖动+移动:

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

public class SimulateSelectOnClick : MonoBehaviour
{
    private IMixedRealityInputSystem inputSystem = null;

    protected IMixedRealityInputSystem InputSystem
    {
        get
        {
            if (inputSystem == null)
            {
                MixedRealityServiceRegistry.TryGetService<IMixedRealityInputSystem>(out inputSystem);
            }
            return inputSystem;
        }
    }

    private IMixedRealityInputSource inputSource;
    private MixedRealityInputAction selectAction;

    private IMixedRealityInputSource InputSource
    {
        get
        {
            if (inputSource != null)
            {
                return inputSource;
            }
            inputSource = new BaseGenericInputSource("SimulateSelect",
               new IMixedRealityPointer[] { InputSystem.GazeProvider.GazePointer }, InputSourceType.Hand) ;
            return inputSource;
        }
    }

    public void Start()
    {
        var inputActions = MixedRealityToolkit.Instance.ActiveProfile.InputSystemProfile.InputActionsProfile.InputActions;
        selectAction = new MixedRealityInputAction();
        for (int i = 0; i < inputActions.Length; i++)
        {
            if (inputActions[i].Description.Equals("select", StringComparison.CurrentCultureIgnoreCase))
            {
                selectAction = inputActions[i];
            }
        }
    }

    public void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            InputSystem?.RaiseOnInputDown(
                InputSource,
                Handedness.Right,
                selectAction
                );
        }
        if (Input.GetMouseButtonUp(0))
        {
            InputSystem?.RaiseOnInputUp(
                InputSource,
                Handedness.Right,
                selectAction
                );
        }
    }
}