用xBox控制器控制主摄像机(MRTK和Unity)

时间:2019-08-13 01:12:52

标签: unity3d mrtk windows-mixed-reality

嗨,我们(我和我的学生)正在Unity中使用MRTK来构建简单的VR游戏。

我们正在尝试让xBox控制器移动播放器(或以MRTK的方式,我认为是将场景固定在固定为0、0、0的摄像头周围移动)。

我已经设置好控制器并使用MRTK设置进行游戏,但是没有运气。

我的控制器可以在Windows Mixed Reality Portal中正常运行,但是在游戏加载时就会消失。

希望对MRTK编辑器窗口中的确切步骤/设置提供任何帮助。

1 个答案:

答案 0 :(得分:1)

这里有两件事要解决:

  1. 如何移动播放器。答案:使用MixedRealityPlayspace.Transform.Translate
  2. 如何响应游戏手柄输入。答:您可以使用Unity的Input.GetAxis来找出按下了哪些按钮/操纵杆,但是我发现使用MRTK中的controller mappings将“导航动作”映射到游戏手柄dpad上要容易一些,操纵杆,然后侦听导航事件中发生的更改。

您可以使用以下代码通过游戏手柄移动MR Playspace:

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;
using UnityEngine;

/// <summary>
/// Moves the player around the world using the gamepad, or any other input action that supports 2D axis.
/// 
/// We extend InputSystemGlobalHandlerListener because we always want to listen for the gamepad joystick position
/// We implement InputHandler<Vector2> interface in order to receive the 2D navigation action events.
/// </summary>
public class MRPlayspaceMover : InputSystemGlobalHandlerListener, IMixedRealityInputHandler<Vector2>
{
    public MixedRealityInputAction navigationAction;
    public float multiplier = 5f;

    private Vector3 delta = Vector3.zero;
    public void OnInputChanged(InputEventData<Vector2> eventData)
    {
        float horiz = eventData.InputData.x;
        float vert = eventData.InputData.y;
        if (eventData.MixedRealityInputAction == navigationAction)
        {
            delta = CameraCache.Main.transform.TransformDirection(new Vector3(horiz, 0, vert) * multiplier);
        }
    }

    public void Update()
    {
        if (delta.sqrMagnitude > 0.01f)
        {
            MixedRealityPlayspace.Transform.Translate(delta);
        }
    }

    protected override void RegisterHandlers()
    {
        CoreServices.InputSystem.RegisterHandler<MRPlayspaceMover>(this);
    }

    protected override void UnregisterHandlers()
    {
        CoreServices.InputSystem.UnregisterHandler<MRPlayspaceMover>(this);
    }
}

我使用了以下控制器映射,以使dpad和指尖钩与导航操作挂钩: enter image description here

然后,我创建了一个新的游戏对象,附加了MRPlayspaceMover脚本,并分配了“导航操作”字段:

enter image description here