Input events(输入事件)
下面的列表概述了将由自定义MonoBehavior组件实现的所有可用输入事件接口。MRTK输入系统将调用这些接口,以基于用户输入交互来处理自定义应用逻辑。指针输入事件 与下面的标准输入事件类型稍有不同。
Important
默认情况下,脚本仅在焦点指向GameObject的指针或焦点在GameObject的父对象上时才会接收输入事件。
Handler | 事件 | 描述 |
---|---|---|
IMixedRealitySourceStateHandler |
检测到/丢失源 | 在检测到/丢失输入源时引发,例如在检测到全关节手或失去跟踪时。 |
IMixedRealitySourcePoseHandler |
源姿势已更改 | 在源姿势变化时引发。源姿态表示输入源的一般姿态。可以通过IMixedRealityInputHandler<MixedRealityPose> 获得特定的姿势,例如6DOF控制器中的紧握或指针姿势。 |
IMixedRealityInputHandler |
输入 下/上 | 引发对按钮等二进制输入的更改。 |
IMixedRealityInputHandler<T> |
输入已更改 | 在对给定类型的输入进行更改时引发。T 可以采用以下值: - float (例如返回模拟触发) - Vector2 (例如,返回游戏手柄的指尖方向) - Vector3 (例如,被跟踪设备的返回位置) - Quaternion (例如,返回被跟踪设备的方向) - MixedRealityPose (例如,返回完全跟踪的设备) |
IMixedRealitySpeechHandler |
语音关键字已识别 | 在识别Speech Commands Profile中配置的关键字之一时引发。 |
IMixedRealityDictationHandler |
语音转文字 假设 结果 完全 错误 |
由听写系统引发,来报告听写会话的结果。 |
IMixedRealityGestureHandler |
关于以下手势事件: 已开始 更新 已完成 取消 |
在手势检测时引发。 |
IMixedRealityGestureHandler<T> |
手势已更新/完成 | 在检测到包含给定类型的其他数据的手势时引发。查看手势事件 有关 T 可能值的详细信息。 |
IMixedRealityHandJointHandler |
手部关节更新 | 当关节更新时,由全关节手控制器(articulated hand controllers)引发。 |
IMixedRealityHandMeshHandler |
手部网格已更新 | 当更新手部网格时,由全关节手控制器引发。 |
IMixedRealityInputActionHandler |
动作开始/结束 | 引发以指示映射到动作的输入的操作开始和结束。 |
Input events in action (活动的输入事件)
在脚本级别,可以通过实现上表中所示的event handler之一来处理输入事件。当通过用户交互触发输入事件时,将发生以下情况:
- MRTK输入系统识别出已发生输入事件。
- MRTK输入系统将输入事件的相关接口功能触发到所有注册的全局输入处理者
- 对于在输入系统中注册的每个活动指针:
- 输入系统确定当前指针对准哪个GameObject。
- 输入系统利用Unity的事件系统被聚焦的GameObject上的所有匹配组件触发相关的接口功能。
- 如果有输入事件被标记为已使用, 该过程将结束,并且没有其他GameObjects将接收回调。
- 示例:识别语音命令后将搜索实现
IMixedRealitySpeechHandler
接口的组件。 - 注意: 如果在当前GameObject上找不到与所需接口匹配的组件,Unity事件系统将逐级向上搜索父GameObject。
- 示例:识别语音命令后将搜索实现
- 如果没有注册任何全局输入处理者,并且没有找到具有匹配组件/接口的GameObject,则输入系统将调用每个后备注册的输入处理者 (input handler)
Note
指针输入事件 与上面列出的输入事件接口的处理方式稍有不同。特别是,指针输入事件仅由触发该输入事件的指针的焦点GameObject以及所有全局输入处理者处理。常规输入事件由焦点GameObjects处理所有活动指针。
输入事件接口示例
以下代码演示了IMixedRealitySpeechHandler
接口。当用户对具有ShowHideSpeechHandler 类的焦点GameObject说“更小”或“更大”时,GameObject将自身缩放一半或两倍。
public class ShowHideSpeechHandler : MonoBehaviour, IMixedRealitySpeechHandler
{
...
void IMixedRealitySpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
{
if (eventData.Command.Keyword == "smaller")
{
transform.localScale *= 0.5f;
}
else if (eventData.Command.Keyword == "bigger")
{
transform.localScale *= 2.0f;
}
}
}
Note
IMixedRealitySpeechHandler
输入事件要求将所需的关键字预先注册在MRTK语音命令配置文件.
为全局输入事件注册
若要创建侦听全局输入事件的组件,而不考虑可能聚焦的GameObject,组件必须在输入系统中注册自己。一旦注册,此MonoBehavior的任何实例将接收输入事件以及当前聚焦的任何GameObject和其他全局注册的侦听器。
如果输入事件已被标记为已使用,全局注册的处理程序仍将全部接收回调。但是,没有被聚焦的GameObjects将接收该事件。
全局输入注册示例
public class GlobalHandListenerExample : MonoBehaviour,
IMixedRealitySourceStateHandler, // 处理检测到的以及丢失的源
IMixedRealityHandJointHandler // 处理手的关节位置更新
{
private void OnEnable()
{
// 指示输入系统我们希望接收所有类型的输入事件
// IMixedRealitySourceStateHandler 和 IMixedRealityHandJointHandler
CoreServices.InputSystem?.RegisterHandler<IMixedRealitySourceStateHandler>(this);
CoreServices.InputSystem?.RegisterHandler<IMixedRealityHandJointHandler>(this);
}
private void OnDisable()
{
// 该组件被销毁
// 指示输入系统无视我们来进行输入事件处理
CoreServices.InputSystem?.UnregisterHandler<IMixedRealitySourceStateHandler>(this);
CoreServices.InputSystem?.UnregisterHandler<IMixedRealityHandJointHandler>(this);
}
// IMixedRealitySourceStateHandler 接口
public void OnSourceDetected(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
// 仅对全关节手输入源做出响应
if (hand != null)
{
Debug.Log("Source detected: " + hand.ControllerHandedness);
}
}
public void OnSourceLost(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
// 仅对全关节手输入源做出响应
if (hand != null)
{
Debug.Log("Source lost: " + hand.ControllerHandedness);
}
}
public void OnHandJointsUpdated(
InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
{
MixedRealityPose palmPose;
if (eventData.InputData.TryGetValue(TrackedHandJoint.Palm, out palmPose))
{
Debug.Log("Hand Joint Palm Updated: " + palmPose.Position);
}
}
}
注册后备输入事件
后备输入处理者类似于已注册的全局输入处理者,但被视为输入事件处理的最后手段。仅当未找到全局输入处理者且没有焦点GameObjects时,才会利用后备输入处理者。
Fallback input handler (后备输入处理者) 示例
public class GlobalHandListenerExample : MonoBehaviour,
IMixedRealitySourceStateHandler // 处理检测到和丢失的源
{
private void OnEnable()
{
CoreServices.InputSystem?.PushFallbackInputHandler(this);
}
private void OnDisable()
{
CoreServices.InputSystem?.PopFallbackInputHandler();
}
// IMixedRealitySourceStateHandler 接口
public void OnSourceDetected(SourceStateEventData eventData)
{
...
}
public void OnSourceLost(SourceStateEventData eventData)
{
...
}
}
如何停止输入事件
每个输入事件接口都提供一个BaseInputEventData
数据对象作为接口上每个函数的参数。该事件数据对象是Unity自身的扩展 抽象事件数据
.
为了阻止输入事件在执行过程中传播如活动的输入事件, 组件可以调用AbstractEventData.Use()
将事件标记为已使用。这将阻止任何其他GameObjects接收当前输入事件,但全局输入处理者除外。
Note
调用Use()
方法的组件将阻止其他GameObject接收它。但是,当前GameObject上的其他组件仍将接收输入事件并触发任何相关的接口函数。