输入动画录制 — MRTK2

MRTK 具有录制系统,可通过该系统将头部移动和手部跟踪数据存储在动画文件中。 然后,可以使用输入模拟系统播放录制的数据。

在很多情况下,录制输入都是一种有用的工具:

  • 为交互、操作、求解器等创建自动测试。为这些测试创建控制器和手部移动可能很耗时。 直接录制输入可以加快处理速度并提供实际数据。
  • 通过动画教授 UX 元素的使用。 向用户展示如何与按钮和其他对象交互可以让学习曲线变得平滑。
  • 调试在常规使用过程中可能会遇到的意外行为。 录制系统支持“滚动缓冲区”概念,该概念允许在后台录制最近的输入。 请参阅输入录制服务

录制和播放服务

提供了两个输入系统服务来分别记录和播放输入。

输入录制服务

InputRecordingService从主相机转换和主动手部控制器接收数据,并将数据存储在内部缓冲区中。 在请求时,此数据随后序列化为二进制文件,供存储和之后的重播。

Recording diagram

若要开始录制输入,请调用 StartRecording 函数。 StopRecording 将暂停录制(但不会废弃目前录制的数据,如果需要废弃,请使用 DiscardRecordedInput 执行此操作)。

默认情况下,录制缓冲区的大小限制为 30 秒。 这样,录制服务即可在后台继续录制,而不会累积太多数据,然后保存过去 30 秒(如果需要)。 可以使用 RecordingBufferTimeLimit 属性来更改时间间隔,也可以使用 UseBufferTimeLimit 选项来取消对录制的限制。

可以使用 SaveInputAnimation 函数将录制缓冲区中的数据保存到二进制文件中。

有关二进制文件格式的详细信息,请参阅输入动画文件格式规范

输入播放服务

InputPlaybackService 读取包含输入动画数据的二进制文件,然后通过 InputSimulationService 应用此数据以再现录制的移动。

Play Back diagram

若要开始播放输入动画,应该使用 LoadInputAnimation 函数从文件中加载输入动画。

调用 PlayPauseStop 以控制动画播放。

还可以通过 LocalTime 属性来直接控制当前动画时间。

警告

操作场景时,循环或重置输入动画或者通过清理时间线直接设置 LocalTime 可能会产生意外结果! 仅会录制输入移动,不会重置任何其他更改,例如移动对象或翻转开关。 如果进行了不可逆的更改,请务必重新加载场景。

用于录制和播放输入动画的编辑器工具

Unity 编辑器中提供了许多用于录制和检查输入动画的工具。 可以在输入模拟工具窗口(可以从“混合现实工具包”>“实用程序”>“输入模拟”菜单打开)中访问这些工具。

注意

输入录制和播放仅在播放模式下有效。

输入录制窗口有两种模式:

  • 录制,可在播放模式期间录制输入并将其保存到动画文件中。

    打开录制按钮时,将启用 InputRecordingService 以录制输入。 关闭录制按钮时,将显示文件保存选择,并且录制的输入动画将保存到所选目标。

    在此模式下,还可以更改缓冲区时间限制。

  • 播放,用于加载动画文件,然后通过输入模拟系统再现输入。

    必须先在此模式下加载动画。 在录制模式下录制输入后,将自动加载生成的动画。 或者,单击“加载”按钮以选择现有的动画文件。

    从左到右的时间控制按钮为:

    • 将播放时间重置为动画的开始时间。
    • 在一段时间内连续播放动画。
    • 单步执行一次。

    滑块还可用于清理动画时间线。

警告

操作场景时,循环或重置输入动画或者清理时间线可能会产生意外结果! 仅会录制输入移动,不会重置任何其他更改,例如移动对象或翻转开关。 如果进行了不可逆的更改,请务必重新加载场景。