【问题标题】:Controlling Main Camera with xBox Controller (MRTK & Unity)使用 xBox 控制器(MRTK 和 Unity)控制主摄像头
【发布时间】:2019-08-13 01:12:52
【问题描述】:

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

我们正在尝试让 xBox 控制器移动玩家(或者在 MRTK 术语中,我认为围绕固定在 0,0,0 的相机移动场景)。

我已经设置了控制器并使用了 MRTK 设置,但没有运气。

我的控制器在 Windows Mixed Reality Portal 中运行良好,但在游戏加载时就死机了。

感谢任何有关 MRTK 编辑器窗口中的确切步骤/设置的帮助。

【问题讨论】:

  • 如果有错误信息,能否贴出来以便我们定位问题?
  • 您好,您能否详细介绍一下您的复制步骤?当您说“控制器”时,您是指您的 Xbox 控制器吗?你用什么代码来监听事件?您预计会发生什么,实际发生了什么?
  • 更新:使用默认控制器 porfile 和新的官方无线 Xbox 控制器。如果 HP WMR 耳机插入您玩游戏控制器不会传送(移动地形)。如果 HP WMR 耳机被拔掉并且您玩游戏控制器移动相机?

标签: unity3d mrtk windows-mixed-reality


【解决方案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 和拇指摇杆连接到导航操作:

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

【讨论】:

  • 谢谢,它奏效了,我现在唯一的问题是相机穿过地形对撞机的垂直面?我在 MRTK GitHub 中记录了一个问题,但想知道您是否知道解决方案(除了竖起盒子碰撞器墙)?
  • 我可能会使用对撞机,然后如果相机靠近那些对撞机(例如使用 Physics.CheckSphere),则将 delta 调整为零,或者使用一些基本的启发式方法,例如将 delta 设置为 0相机移出一些预定义的区域。
  • 嗨,朱莉娅,您能否给我一些更多指导,这在 MRTK 2.1.0 中已被破坏,我们(教师和学生)无法让导航正常工作?使用 WMR 控制器 D Pad 或操纵杆。在 RC1 中很容易,但在 2.0.0 和 2.1.0 中崩溃了?我们将它作为 GITHUB 中的一个问题,但它在积压中,我们真的需要它用于一周内启动的项目。 github.com/microsoft/MixedRealityToolkit-Unity/issues/5817
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多