使用 xBox 控制器(MRTK 和 Unity)控制主摄像头
Controlling Main Camera with xBox Controller (MRTK & Unity)
嗨,我们(我自己和我的学生)正在 Unity 中使用 MRTK 来构建简单的 VR 游戏。
我们正在尝试让 xBox 控制器移动播放器(或者在 MRTK 术语中,我认为围绕固定在 0,0,0 的摄像机移动场景)。
我已经设置了控制器并使用了 MRTK 设置,但没有成功。
我的控制器在 Windows 混合现实门户中运行良好,但在游戏加载时就死机了。
感谢任何有关 MRTK 编辑器 window 中确切 steps/settings 的帮助。
本
这里有两件事要解决:
- 如何移动播放器。答案:使用
MixedRealityPlayspace.Transform.Translate
- 如何响应手柄输入。答:可以在MRTK中使用Unity的Input.GetAxis to figure out which buttons / joysticks are pressed, however I found it a bit easier to use the controller mappings将"navigation action"映射到游戏手柄dpad和joysticks,然后在导航事件上监听输入变化。
您可以使用以下代码使用游戏手柄移动 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);
}
}
我使用以下控制器映射将方向键和摇杆连接到导航操作:
然后我创建了一个新的游戏对象,附加了 MRPlayspaceMover 脚本,并分配了 "navigation action" 字段:
嗨,我们(我自己和我的学生)正在 Unity 中使用 MRTK 来构建简单的 VR 游戏。
我们正在尝试让 xBox 控制器移动播放器(或者在 MRTK 术语中,我认为围绕固定在 0,0,0 的摄像机移动场景)。
我已经设置了控制器并使用了 MRTK 设置,但没有成功。
我的控制器在 Windows 混合现实门户中运行良好,但在游戏加载时就死机了。
感谢任何有关 MRTK 编辑器 window 中确切 steps/settings 的帮助。
本
这里有两件事要解决:
- 如何移动播放器。答案:使用
MixedRealityPlayspace.Transform.Translate
- 如何响应手柄输入。答:可以在MRTK中使用Unity的Input.GetAxis to figure out which buttons / joysticks are pressed, however I found it a bit easier to use the controller mappings将"navigation action"映射到游戏手柄dpad和joysticks,然后在导航事件上监听输入变化。
您可以使用以下代码使用游戏手柄移动 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);
}
}
我使用以下控制器映射将方向键和摇杆连接到导航操作:
然后我创建了一个新的游戏对象,附加了 MRPlayspaceMover 脚本,并分配了 "navigation action" 字段: