练习 - 向对象添加手部交互脚本
ObjectManipulator 脚本支持“手部和运动控制器”输入模型的“直接操作”模态。 向对象附加脚本后,用户可以手来移动、缩放或旋转该对象。 在本练习中,你将创建两个立方体,向它们附加必要的脚本,然后四处移动它们。
添加并调整第一个立方体
在菜单栏中,选择“GameObject”>“3D 对象”>“立方体”。
该立方体的默认大小为 1 平方米,这对我们来说太大了。 我们会将它缩小到 20x20x20 立方厘米。
选择该立方体,然后在“检查器”中将立方体的“转换/缩放”值更改为以下值:
X = 0.2, Y = 0.2, Z = 0.2
立方体在场景中的默认位置为 (0,0,0)。 这意味着立方体与用户的头戴显示设备位于同一位置,用户无法看到立方体,直到他们向后移动。 我们将更改立方体的位置值,使它位于更便于查看的位置。
在“检查器”中,将立方体的“转换/位置”值更改为以下值:
X = -0.2, Y = 1.6, Z = 0.5
我们希望能看到立方体的三个面,因此还会更改立方体的旋转。
注意
立方体的高度设置为 1.6,以匹配 MRTK XR Rig 上“相机偏移”的高度,使其大致与眼睛齐平。
在 Inspector 中,将立方体的“Tranform/Rotation”值更改为以下值:
X = 9, Y = 14, Z = 0 f
提示
要缩放该立方体,请选择它,确保光标悬停在“场景”窗口上,然后按 F 键。 可通过这种方式放大任何对象。
向立方体添加脚本
如要通过跟踪手抓取对象,该对象必须附加两个组件:
- 碰撞体组件(无需在此执行任何操作;Unity 的立方体默认已附加盒状碰撞体)
- “对象操控器(脚本)”组件
在立方体仍然处于选中状态的情况下,在“检查器”窗口中,单击“添加组件”按钮,然后搜索并选择“对象操纵器”脚本。
ObjectManipulator 脚本能够让对象变得可移动、可缩放和可旋转,这些操作可通过一只或两只手来实现。 添加 Object Manipulator 脚本时,系统会自动添加 Constraint Manager 脚本,因为前者依赖于后者。
更新立方体的材料
出于性能考虑,建议使用 MRTK 材料而不是默认的 Unity 材料。
- 在仍选中该立方体的情况下,在网格呈现器组件上找到“材料”部分。
- 将默认材料替换为位于 MRTK 标准资产>材料下的 MRTK_Standard_White 材料。 你可以从“项目”窗格中将相应材料拖放到“材料”部分。
添加第二个立方体
在“层次结构”中,右键单击该立方体,然后选择“复制”。 系统显示复制的立方体,名称为“Cube (1)”。
右键单击原始立方体,选择“重命名”,然后将其命名为“Near Cube”。
右键点击复制的立方体,选择“重命名”,然后将其命名为“Far Cube”。
目前,Scene 视图中似乎只有一个立方体。 这是因为 Near Cube 和 Far Cube 的位置完全相同。 我们可以更改 Far Cube 的位置和旋转。
在仍选中“Far Cube”的情况下,将其“转换”组件中的值更改为以下值:
位置:X = 0.6,Y = 1.6,Z = 1.1
旋转:X = 27, Y = 0, Z = 0
现在,摄像机应该能看到“Near Cube”位于左侧,“Far Cube”位于右侧稍远处。 要确认这一点,请在“层次结构”中选择“主相机”(“MRTK XR Rig”>“相机偏移”下),然后在“场景”窗口中查看“主相机”窗口。
提示
如果希望 Scene 窗口中的视图更接近于摄像机所看到的实际场景,请在该窗口中四处滚动。 如果摄像头的“清除标志”未默认设置为“Skybox”,可能需要将其设置为“Skybox”。
在播放模式下抓取和移动立方体
选择 Play 按钮。 项目开始播放时,视图切换到 Game 窗口。
注意
播放前请确认“项目设置”>“MRTK3”下设置了有效的配置文件。
选择“游戏”窗口右上角的三点按钮,然后选择“最大化”。
按空格键,使模拟右手显示在视图中。
将模拟手朝 Near Cube 移动,直到它触碰到立方体的一面或底部。
按鼠标左键(这会让手抓取立方体),然后在场景中拖动该立方体。
要抓取和移动 Far Cube,我们将使用模拟手附带的远指针。
如果需要执行该操作,请再次按空格键,使模拟右手显示出来。 请注意从手的食指末端延伸出来的远指针。
朝 Far Cube 移动手,直到你看到指针末端移到在立方体上。 可能需要将手画几次圈,才能使指针末端出现在立方体上。
按鼠标左键(这会使手收缩,呈我们所谓的“收缩手势”),然后在场景中拖该动立方体。
Unity 编辑器内输入模拟
你可以使用 Unity 的编辑器内输入模拟功能来测试全息对象行为。
更改场景中的视图
- 要向前/向左/向后/向右移动摄像头,按 W/A/S/D 键。
- 要垂直移动摄像头,按 Q 和 E 键。
- 要旋转相机,按鼠标右键,然后拖动。
模拟手控输入
- 要启用模拟右手,按住空格键。 要移除该手,请松开空格键。
- 要启用模拟左手,按住左边的 Shift 键。 要移除该手,松开该键。
- 要在场景中移动左手或右手,移动鼠标。
- 要向前或向后移动手,滚动鼠标滚轮。
- 要模拟收缩手势,请按鼠标左键。
- 要旋转手,按住空格键 + CTRL 键(右手)或按住左 Shift 键 + CTRL 键(左手),然后移动鼠标。
持久的手
要在不继续按住某个键的情况下启用手并使它在屏幕上,请按 T(左手)或 Y(右手)。 再次按这些键可移除手。
在 Unity 中生成应用程序
通过选择三点按钮,然后取消选中“最大化”来最小化“播放”窗口。
在菜单栏中,选择“文件”>“生成设置...”。
在“生成设置”窗口中,选择“添加开放场景”按钮,以将当前场景添加到“生成中的场景”列表。
选择“生成”按钮。
在“生成通用 Windows 平台”窗口中,导航到希望用于存储生成的文件夹,或者新建一个文件夹并导航到它,然后选择“选择文件夹”按钮以开始生成过程。
屏幕上将显示一个进度栏,表明生成的进展情况。
(可选)生成并部署应用程序
注意
在 HoloLens 2 上生成和测试不是强制性的。 如果没有这个设备,还可以在 HoloLens 2 仿真器上进行测试。 你可以在 HoloLens.com 购买设备。
生成过程完成后,Windows 文件资源管理器打开并显示该生成文件夹。 在文件夹内浏览并双击解决方案文件,在 Visual Studio 中其打开。
为 HoloLens 配置 Visual Studio - 选择“Master”或“Release”配置以及“ARM64”体系结构:
提示
如果要部署到 HoloLens(第一代),请选择 x86 体系结构。
注意
如果在 Visual Studio 中没看到“设备”这个目标选项,则可能需要将解决方案的启动项目从 IL2CPP 项目更改为 UWP 项目。 为此,请在“解决方案资源管理器”中右键单击[你的项目名](Universal Windows),然后选择“设置为启动项目”。
选择部署目标下拉列表,然后执行下列操作之一:
- 如果要通过 Wi-Fi 进行生成和部署,请选择“远程计算机”。
- 如果要通过 USB 进行生成和部署,请选择“设备”。
设置远程连接:在菜单栏上,选择“项目”>“属性”。
在项目的“属性页”窗口中,选择“配置属性”>“调试”。
选择“要启动的调试器”下拉菜单,然后选择“远程计算机”(如果尚未选择)。
重要
我们建议手动输入你的 IP 地址,而不要依赖于“已自动检测”功能。 若要查找 IP 地址,请在 HoloLens 上转到“设置”>“更新和安全”>“针对开发人员”。 IP 地址在窗口底部的“以太网”下列出。
在“计算机名称”字段中,输入设备的 IP 地址。
将“身份验证模式”设置为“通用(未加密协议)”。
将 HoloLens 连接到计算机,然后在 Visual Studio 中执行以下操作之一:
- 若要部署 HoloLens 并自动启用未附加 Visual Studio 调试程序的应用,选择“调试”>“开始执行(不调试)”。
- 要部署 HoloLens,而不自动启动应用,选择“生成”>“部署解决方案”。
配对设备
首次将应用从电脑部署到 HoloLens 时,系统会提示输入 PIN。 创建 PIN:
- 在 HoloLens 中,转到“设置”>“更新和安全”>“针对开发人员”。
- 选择“配对”。这会显示 HoloLens 中的 PIN。
- 在 Visual Studio 的对话框中输入该 PIN。
- 完成配对后,在 HoloLens 中选择“完成”。
现在,你的电脑已与 HoloLens 配对,你可以自动部署应用了。 请针对用于将应用部署到 HoloLens 的每台电脑重复上述步骤。
在 HoloLens 上运行应用
应用完成生成后,在 HoloLens 的“开始”菜单中找到你的应用的应用磁贴,然后选中它。
应用启动后,把手伸向“Near Cube”,然后抓取并拖动它。
使用远指针抓取 Far Cube,然后拖动它。
提示
与在 Unity 中测试应用相比,HoloLens 提供了更大的灵活性。 可通过物理方式移动,并使用 Near Cube 上的远指针或用手来触碰并抓取 Far Cube!
提示
你还可以部署到 HoloLens 模拟器或创建应用包用于旁加载。
你可能会注意到应用中的“诊断”探查器。 可以使用语音命令“切换诊断”来启用或禁用它。 建议在开发过程中使探查器在大部分时间都可见,以便可以了解更改应用对性能有何影响。 例如,可以监视应用,以确保帧速率至少为 60 FPS。