练习 - 使用边界控件操作三维对象

已完成

ObjectManipulator 脚本能够让对象变得可移动、可缩放和可旋转,这些操作可通过一只或两只手来实现。 此脚本支持直接操作输入模型,因为此脚本让用户能够直接用手接触全息影像。 接下来,你将学习如何使用 ObjectManipulator 来启用手部交互,以便能够移动、缩放和旋转漫游车探测器。

  1. 此外,你将配置漫游车探测器,以便可以将漫游车部件放置在漫游车上,使其成为一个完整的漫游车组件。 在“层次结构”窗格中,展开 RoverExplorer > RoverParts 对象,并选择其所有子漫游车部件对象和 RoverAssembly 对象,然后在“检查器”窗格中,使用“添加组件”按钮将以下组件添加到所有选定的对象:

    • “对象操控器(脚本)”组件
    • “部件程序集控制器(脚本)”组件

    Screenshot of RoverAssembly with all rover part objects selected and components added.

  2. 在所有漫游车部件对象和 RoverAssembly 对象仍处于选中状态的情况下,在“检查器”窗格中,配置“对象操控器(脚本)”组件,如下所示:

    • 在“基本可交互设置”下,找到“On Clicked ()”事件。 选择“+”图标以添加新事件。 按如下所示配置事件:

      a. 通过将 RoverAssembly 对象从“层次结构”拖到“无(对象)”字段,将其指定为侦听器的“On Clicked ()”事件。

      b. 从“非功能”下拉列表中,选择“TapToPlace”>“StartPlacement()”,以便在触发事件时调用此方法。

    • 从“允许的操作类型”下拉列表中,清除“缩放”复选框,以便仅启用“移动”和“旋转”:

    Screenshot of Unity with Two Handed Manipulation Type configured.

  3. 仅选择 RoverAssembly 对象,并移除其上的有状态可交互组件(如果有)。 选择组件最右侧的三个点,然后选择“删除组件”。

  4. 在“项目”窗格中,导航到“包”>“MRTK 标准资产”>“音频”>“HoloLens2”文件夹,找到音频剪辑:

    Screenshot of Unity Project window with Audio folder selected.

  5. 在“层次结构”窗格中,重新选择所有“漫游车部件对象”,然后在“检查器”窗格中,选择“添加组件”以添加“音频源”组件并按如下所示对其进行配置:

    • 将“MRTK_Scale_Start”音频剪辑分配到“AudioClip”字段
    • 取消选中“唤醒时播放”复选框
    • 将“空间混合”更改为“1”

    Screenshot of Unity with all rover parts selected and Audio Source component added and configured.

  6. 在“层次结构”窗格中,展开 RoverAssembly > RoverModel_PlacementHints_XRay > Parts_PlacementHints 对象,以显示所有放置提示对象,然后选择第一个漫游车部件,RoverParts > Camera_Part,并按如下所示配置“部件程序集控制器(脚本)”组件:

    • 将“Camera_PlacementHint”对象分配到“定位位置”字段

    Screenshot of Unity with Camera_Part PartAssemblyController component configured.

  7. 对每个剩余的漫游车部件对象和 RoverAssembly 对象重复步骤 5,以配置“部件程序集控制器(脚本)”组件,如下所示:

    • 对于“Generator_Part”,将“Generator_PlacementHint”对象分配到“放置位置”字段
    • 对于“Lights_Part”,将“Lights_PlacementHint”对象分配到“放置位置”字段
    • 对于“UHFAntenna_Part”,将“UHFAntenna_PlacementHint”对象分配到“放置位置”字段
    • 对于“Spectrometer_Part”,将“Spectrometer_PlacementHint”对象分配到“放置位置”字段
    • 对于“RoverAssembly”,将对象本身(即同一“RoverAssembly”对象)分配到“放置位置”字段
  8. 在“层次结构”窗格中,选择 RoverExplorer > Buttons > Reset 按钮对象,然后在“检查器”窗格中,按如下所示配置 PressableButton OnClicked () 事件:

    • 向“无(对象)”字段分配“RoverAssembly”对象
    • 从“无函数”下拉列表中,选择“PartAssemblyController”>“ResetPlacement ()”将此函数设置为触发事件时要运行的操作

    Screenshot of Unity with Reset button object OnClick event configured.

  9. 如果现在进入“游戏”模式,可以使用近或远交互将漫游车部件放在漫游车上。 一旦部件靠近相应的放置提示,它将贴靠到位并成为探测器的一部分。 若要重置放置,可以按“重置”按钮:

    Screenshot of Unity Play mode split view with Reset button being pressed.

添加边界控件

  1. 在“层次结构”窗口中选择“RoverExplorer”对象,然后在“检查器”窗口中,使用“添加组件”按钮添加 BoundsControl 组件。 取消选中组件旁边的复选框以默认禁用它:

    Screenshot of Unity with RoverExplorer object selected and components added and disabled.

  2. 在“项目”窗口中,导航到“包”>“MRTK 空间操作”>“BoundsControl”>“预制件”文件夹,单击并拖动 BoundingBoxWithHandles,然后预设“边界控件”组件的“边界视觉对象预设”字段。

    Screenshot of Unity with RoverExplorer object selected and the Bounds Visuals Prefab field configured.

  3. 在“层次结构”窗格中,展开 Menu > Buttons-GridLayout (Buttons) 对象以显示 3 个按钮,将第三个按钮重命名为 BoundsControl_Enable,然后在“层次结构”窗口中,按如下所示配置“BoundsControl_Enable”游戏对象:

    • 选择 Frontplate > AnimatedContent > Icon > Label 对象,并将 TextMeshPro 组件更改为“启用”。 确保在层次结构中激活 Label 对象
    • 配置 PressableButton.OnClicked() 事件,方法是将 RoverExplorer 对象分配至“无(对象)”字段,并从“非功能”下拉列表中选择“BoundsControl”>“bool Enabled”(验证参数复选框是否已勾选)
    • 选择“+”小图标以添加另一个事件
    • 向“无(对象)”字段分配“RoverExplorer”对象
    • 从“非功能”下拉列表中,选择“ObjectManipulator”>“bool Enabled”,以在事件触发时更新此属性值并验证是否已勾选参数复选框
    • 选择“+”小图标以添加另一个事件
    • 向“无(对象)”字段分配“RoverExplorer”对象
    • 从“非功能”下拉列表中,选择“BoundsControl”>“bool HandlesActive”,以在事件触发时更新此属性值并验证是否已勾选参数复选框
    • 选择 Frontplate > AnimatedContent > Icon > UIButtonFontIcon 对象,并将“字体图标选择器”组件上的图标更改为由 4 个箭头组成的图标。 可在图标列表中找到此图标,或者将“当前图标名称”设置为“图标 40”

    Screenshot of Unity with BoundsControl_Enable button object selected and Button Config Helper component configured.

  4. 复制 BoundsControl_Enable 按钮并将其重命名为 BoundsControl_Disable,然后在“检查器”窗格中,按如下所示配置“按钮配置帮助程序(脚本)”组件:

    • 选择 Frontplate > AnimatedContent > Icon > Label 对象,并将 TextMeshPro 组件更改为“禁用”
    • 配置 PressableButton.OnClicked() 事件,确保事件下的所有复选框均已取消勾选

    Screenshot of Unity with BoundsControl_Disable button object selected and Button Config Helper component configured.

  5. 如果现在进入“游戏”模式并选择“启用”以启用边界控件,可以使用近或远交互来移动、旋转和缩放边界控件,然后选择“禁用”以再次禁用边界控件:

    Screenshot of Unity Play mode split view with Bounds Control being manipulated.