在 Unity* 软件中开发和移植 Windows * 混合现实 UWP 应用

虚拟现实 (VR) 技术发展迅速。自 2012 年 8 月发布 Oculus Rift * 原型以来,该领域取得了令人瞩目的进步。Oculus* 助力虚拟现实在消费者和开发人员中实现普及。因此,尽管唯一的可用资源是面向 Unreal * Engine 和 Unity *软件的相对原始的软件开发工具包 (SDK),但开发人员仍急切地投入到为原始 Oculus Rift Dk1(开发人员工具包 1)创建体验和游戏的工作之中。

随着 Valve* VR 原型在 2015 年发布以及与 HTC* 的合作,我们了解了 HTC Vive*。这项技术普及了房间规模 VR——将玩家在现实世界中的动作转化为虚拟环境中的动作。

HTC Vive 还在 VR SDK 空间中引入了不可避免的碎片。尽管 Valve Steam*VR API 及其 Unity 软件插件随时可用且可轻松开发,但现在有两个相互竞争的 VR API—Oculus Rift SDK 和 SteamVR。但 SteamVR 实施了 OpenVR*,它是一个 API 和运行时软件,允许在相同的代码库下运行不同的 VR 硬件。这使得大量开发人员不再使用当时普及的 Oculus SDK,而使用 SteamVR Unity 软件插件直接开发和创建原型。

优势似乎很明显;一个代码库,允许任何人在支持 SteamVR 的任何 VR 设备上运行他们开发的游戏和体验。但实际上,为了获得对本机功能或品牌特定商店的访问权限,您仍必须使用专有 SDK。

Microsoft* Store 也对 VR 应用开放,为 VR 开发人员提供了新的市场机遇。若要访问该市场,您需要遵循特定指南并使用 通用 Windows* 平台 (UWP) 进行开发,该平台由微软* 提供,是一种开发适用于各种设备的通用应用的新方式。这些设备包括 Windows® 10、Windows 10 移动设备、Xbox*、Microsoft HoloLens* 和混合现实设备。通用 API 使开发一次并部署到任何 Windows 10 设备成为可能。Windows Store 中提供的每个应用都是一个 UWP 应用。

但在我们开始之前,开发人员需要注意一下硬件。微软通过引入 Windows 混合现实 (MR) 设备进入 VR 市场,其中包括 Microsoft HoloLens 头盔,该公司对它的定位是一个独立的全息电脑。这些头盔使用传感器进行由内向外的跟踪,并使用嵌入式外向摄像头对用户动作进行位置跟踪。相比之下,HTC Vive 和 Oculus Rift 使用由外而内的跟踪,其中面向传感器的内置传感器和相机跟踪用户动作。另一个重要区别是全息头盔和沉浸式头盔之间的区别。全息头盔使用透视显示器,用户可以看到周围的世界。沉浸式头盔具有不透明的显示屏,可阻挡玩家在物理世界中的视线。(如欲了解更多信息,请点击 此处。)

由于没有外部传感器和复杂的摄像头设置程序,这些沉浸式头盔对于外出途中的开发人员尤其有吸引力 - 携带头盔参加会议和将头盔放入背包从未如此简单。包括运动控制器在内的沉浸式头盔的当前售价约为 200 美元。该头盔由 OpenVR 提供官方支持,您可以申请开发人员套件并加入 Windows MR 开发计划

也就是说,我们已经准备好开始了。本文探讨了如何使用 Unity 软件构建 UWP 应用,涵盖了将 VR 软件移植到 UWP 的最简单方法,并重点介绍了 Unity 软件中的 Microsoft API 所提供的输入层。

VR 设计和移植到本机 UWP

有几种方法可以创建跨平台的 VR 应用,包括精心设计的自动 SDK 设置创建器(例如面向 Unity 软件的 VR 工具包提供的自动 SDK 设置创建器)(VRTK);见下)和将应用手动移植到每个目标平台。许多开发人员选择使用 OpenVR 来避免将代码移植到一系列设备上。这种方法并非没有问题。例如,不同的设备需要不同的控制器设置,输入和控制器(或自定义)模型都不匹配。这会产生一些问题,其中某些情形可能无法按预期使用输入。这可能导致游戏中“手”的位置相对于真手的位置偏移。在使用多个 SDK 处理端口方面,其他令人信服的理由包括能够利用本机控制功能,以及访问不同的在线应用商店。

将游戏逻辑与 VR SDK 细节分开

在具有位置跟踪、房间比例和运动控制器的高端 VR 中,游戏场景(VR 世界)包含由左右手控制器和摄像头组成的 VR 装备驱动的游戏逻辑。头部跟踪用于旋转和移动相机位置,从而创建玩家的游戏视野。

在 Unity 软件中,玩家实体被称为摄像头装备。此 GameObject 表示用户的游戏空间,包含主立体摄像头和控制器对象。此设置提供了一个图层,用于将游戏逻辑与您正在使用的特定 VR SDK 分开。我建议使用图 1 所示的结构进行跨平台 VR 开发。

Game logic diagram
图 1.此方案将您的游戏逻辑和装备放在不同的层上,从而更轻松地移植到单独的 SDK。

在图 1 中,所有 SDK 特定数据仅通过 VRHAND 脚本流动。VRHAND 是附加到控制器 GameObjects 的脚本组件。它包含面向我们特定 SDK 的公共输入方法。一旦设置了引用,就可以从任何游戏脚本中调用其方法进行输入;例如 VRHand.GetTriggerPress()

我们可以创建一个通用脚本自适应代码和 IF 语句来识别 SDK,但我更喜欢为每个特定 SDK 创建单独的 VRHAND 脚本。如果您隶属于一个大团队,则可能无法为每个特定平台创建单独的版本,并且可能希望创建一个在运行时选择适当 SDK 的单个摄像头装备来加速开发,具体取决于插入的头盔。这当然是一种可能,但很容易扩展以前的方案以适应这种方法。

在本教程的后面,我们将使用 Unity 软件中公开的本机输入和 API 创建用于 Windows 混合现实头盔的 VR 装备,而不使用任何第三方插件或预制件。目前,关键是保留尽可能多的游戏逻辑和脚本,与您使用的摄像头无关。显然,您需要引用您的玩家 VR 装备并向前和向后传递数据,确保您的游戏正常运行。但我们希望从您想要使用的特定 SDK 或摄像头装备中提取出所有这些信息,并避免 Unity 软件中无处不在的硬编码引用;目标是能够使用包含不同 SDK 数据的不同 VRHAND 脚本替换您的摄像头装备,并通过简单的开关启动和运行您的游戏。

创建运行时引用可帮助您避免通过 Unity 软件编辑器对组件进行硬编码的缺陷。您可以使用 FindObjectOfType 或标记摄像头和控制器并使用 FindGameObjectsWithTag,在游戏的 AwakeStart 方法中设置这些引用。您甚至可以通过创建编辑器管理器脚本设置参考,并在每个场景中运行一次脚本。选择您最满意的选项,适合您的游戏架构和设计的选项。

尽可能接近这个抽象层可让您更轻松地制作多平台 VR 内容。这个概念在游戏开发中很常见,Unity 软件API 所使用的输入系统完美说明了这一点。借助输入管理器,您可以设置与不同按钮关联的操作。它是一个简单的输入抽象层,能够将常见输入(例如水平移动)与不同的输入设备(如操纵杆、键盘箭头和游戏手柄等)相关联。

兼容混合现实的 VR 框架

借助 Unity 软件中的 MR SDK 开发本机应用时,我们有几个起始点选择。我们来看一下在线提供的一些开源项目。

VRTK

VRTK 是一个出色的 VR 工具包,包含各种预制件、脚本和设置,可帮助您快速掌握 Unity 软件 VR 原型设计和应用创建。许多工作室用它开发游戏,它降低了在 Unity 软件中创建 VR 应用所需的工作量。VRTK 是 开源的,有一个大型社区参与框架的开发。VRTK 最近从 Oculus 获得了开发资金。VRTK 完全支持混合现实头盔,并允许您创建 VR UWP 应用。您可以直接从 GitHub* 页面 获取该项目(比 Asset Store 更新)。官方文档尚未包含 MR 支持,但它已获得官方支持。如要动态加载 MR 控制器,您需要 Windows MR 扩展

借助 VRTK,在创建场景期间通过管理器设置 SDK 选项。VRTK 创建了一个非常强大和复杂的抽象层,允许您通过上述管理器设置摄像头装备。此视频演示了如何使用多个 SDK。

这种做法遵循的原则是拥有一个在运行时之前创建引用的编辑器脚本。但是,它的所有依赖关系都与 VRTK 相关联。因此,如果您要在大多数游戏 VR 交互(运动等)中使用 VRTK,它会很有效。但是,如果您计划采用另一种方法,它也不会有效。幸运的是,您还可以扩展工具包并通过继承进行扩展,从而编写与工具包的其余部分无缝协作的组件。VRTK 也有明确 记录

混合现实工具包

微软创建了一个综合工具包,其目标是加速面向 MR 头盔和 HoloLens 的 UWP 应用的开发。Unity 软件版本的混合现实工具包 (MRTK) 可在 此处找到。

MRTK 包含许多预制件和脚本,提供复杂强大的功能。它还包括一个 VR 摄像头装备;见图 2。

screenshot of Unity MRTK settings
图 2.MRTK 摄像头装备。

正如您在图 2 中看到的,这个 VR 装备似乎缺少控制器,并且结构与前面描述的摄像头装备略有不同。这与工具包架构以及不同组件相互协作的方式有关。在 Unity 软件中进入播放模式时,结构会发生变化,如图 3 所示。

camera rig structure in Unity* software play mode.
图 3.Unity* 软件播放模式的摄像头装备结构。

我们在图 3 中首先看到的是,我们的摄像头装备成为了 DontDestroyOnLoad 对象。这是由于装备的连接方式。它依赖于从单例基类继承的 MixedRealityCameraManager.cs 脚本。控制器在运行时生成,这会产生另一个潜在问题:如果我们想要遵循我们之前的规则并在运行时设置引用,我们必须处理初始化问题,并且无法在编辑器中设置引用。

重申一下,这种摄像头装备的架构和内部运作与前面介绍的不同。使用通用代码库时,利用一个通用框架同时开发 HoloLens 和 MR 的固有复杂性是该工具包的潜在缺点。它使用与输入和交互相关的不同理念,当您深入了解工具包的结构时,您会发现不同的设计决策。显示的框架在工作方式上具有限制性(不一定是坏事),我们必须遵守嵌入在架构中的许多合同。它使用分层脚本,这些脚本在工具包中运行良好,但扩展起来有点复杂,缺乏文档。

VRTK 和 MRTK 的利与弊

尽管 VRTK 和 MRTK 是很好的起点并提供强大而完整的功能,但它们确实限制了您的架构和设计选择。如果您深入研究并熟悉其代码库,请务必使用它们。VRTK 是一个很棒的项目,降低了 VR 开发人员的入门门槛。它的组件简单易用,支持快速创建 VR 场景和交互。VRTK 也是快速学习 VR 最佳实践的最佳资源之一。MRTK 提供了一个完美的玩具盒,可以让您了解 Windows 混合现实(和 HoloLens)生态系统的理念和架构,如果您对设计选择有丰富的经验,您将会游刃有余。拥有支持 HoloLens 的代码库也是一大优势。

自定义摄像头装备和输入

如果你有想要调整的旧项目,应该怎么办?或者,如果您希望拥有对代码库的绝对控制权而不必遵守工具包架构呢?我们来看看无需使用任何外部工具包或第三方插件,实施面向 Windows 混合现实的 VR 摄像头装备的最简单方法。

接下来我们利用 Unity 软件的原生 VR 支持,创建一个包含摄像头和控制器 GameObjects 的 VR 装备 GameObject。Unity XR 包含 VR、MR 和增强现实 (AR) 支持,包括开箱即用的不同 VR SDK(OpenVR、Oculus、MR),因此您可以直接在项目设置中添加它们,无需外部插件。点击 XR 设置中的加号,添加您想要使用的任何 VR SDK,为 MR 头盔执行此操作(见图 4)。

settings for UWP menu
图 4.在 Unity* XR 中,点击“XR 设置 > 虚拟现实 SDK > Windows 混合现实”下的加号 (+),使用“通用 Windows* 平台设置”菜单添加对任何 VR SDK 的支持。

进一步介绍之前,我们来详细了解一下构建 UWP 应用所需的内容以及特定的设置过程。

设置 Unity* 软件,构建混合现实 UWP 应用

若要创建 UWP 应用,我们需要配置项目并安装相应软件。设置头盔时安装了许多 Windows 混合现实头盔组件。如果您没有 Windows 混合现实头盔,则可能需要安装以下内容:

  • Microsoft Visual Studio* 2017。Unity 软件附带的社区版本很好,但我们需要一些可以直接从 Visual Studio 安装的功能。具体来说,我们需要 UWP 开发工作负载以及 Windows 10 SDK。通常,您可以在安装 Visual Studio 时选择工作负载,但如果您的 Visual Studio 副本附带 Unity 软件,则需要打开 Visual Studio 安装程序并修改安装,以添加 UWP Development 工作负载(请见图 5)。

    Microsoft Visual Studio* Installer
    图 5.在 Microsoft Visual Studio* 安装程序中,使用 Unity* 软件工作负载添加 UWP 平台开发和游戏开发以及 Windows®10 SDK。

    务必检查 UWP 平台开发以及 Unity 软件的游戏开发,并添加 Windows 10 SDK。如欲了解更多信息,请参见 Visual Studio 文档

     

  • Windows 10 2018 年 4 月更新
  • Unity 2017.4.撰写本文时,这是微软推荐和支持的版本。我使用 Unity 2018.1.2f1 检查了功能,一切正常。
  • 选择 .NET 脚本后端,您可以在玩家设置 > 其他设置中进行设置。
  • 您还需要配置开发人员模式,方法是转至 Windows 中的“系统设置”并选择 面向开发人员更新 & 安全性 > > 开发人员 模式 (见图 6)。

Updates and security settings to configure developer mode
图 6.使用这些更新 & 和安全设置配置开发人员模式。

UWP 不使用从 Unity IDE 引用的 .NET 3.5 类库配置文件;导出到 Visual Studio 时,仅引用 .NET 4.5 的子集,因此可能无法使用所有功能。选择 IL2CPP 解决了许多这类问题。

确保所有部件正确安装和正常运行后,我们需要配置 Unity 软件项目。主要任务是为 UWP 平台配置构建设置。最有可能的是,您的 Unity 软件版本不会安装 Windows 平台模块,因此在进入构建设置时,您将看到图 7 所示的参数。

UWP module check
图 7.检查 Unity* 软件构建设置,查看是否已加载 UWP 模块。在本图中,模块不存在。

选择 打开下载页面 可获得必要的软件包。安装它们,并配置您的构建设置,如图 8 所示。

Enable Unity C#
图 8.在构建设置页面的 Unity UWP 下启用 Unity* C# 项目。

将平台设置为 UWP 后,我们现在可以转至 Unity 软件构建设置下的编辑 > 玩家设置,选择正确的 XR 设置(见图 9)。

 

Set stereo rendering method
图 9.从 XR 设置菜单中设置首选的立体渲染方法。选择 Windows 混合现实 SDK 并选择首选的立体渲染方法(单通道和单通道实例提供更高的性能,但您的着色器应与其兼容)。

现在点击构建设置页面上的 构建,系统会提示您选择项目的文件夹。选择文件夹后,构建过程将开始,Unity 软件将生成一款我们可以在 Visual Studio 中使用的 Visual Studio 解决方案,然后进行调试和部署。在名为 UWPNOKIT 的项目中,Unity 软件生成了如图 10 所示的文件。

folder content, list of files
图 10.我的 Unity* 软件生成项目出现在 Windows *文件资源管理器中。

点击 Visual Studio 解决方案,在已准备好部署或调试的项目中打开一个 Visual Studio 实例。从此处访问 Microsoft Store 只需几个步骤。若要上传项目,创建一个".appxupload”软件包。(在提交应用之前,请确保您拥有 Microsoft Store 开发人员账户。)在 Visual Studio 中,选择 x86 或 x64 构建配置,然后部署应用。(针对测试,选择 本地电脑。)使用主配置会关闭分析并包含面向应用的优化 - 这是您用于发布的配置。随后您可以通过Project > Store 将您的应用与商店相关联。

Associating the app with the Microsoft store
图 11.将您的应用与 Microsoft Store 相关联。

接下来,系统将提示您提供有关您的应用及其要求的信息。完成后,从 Windows 开发中心仪表盘 创建提交。如欲了解关于这一流程的更多信息,请参见 “将应用提交至 Microsoft Store”

设置面向 Windows* 混合现实的摄像头装备

安装和配置所有软件后,我们可以开始开发和创建自己的摄像头装备。开始之前,我们先设置一个由 Microsoft 提供的非常有用的功能:Windows 混合现实模拟器。模拟器创建连接到电脑的头盔的伪实例,让您无需插入头盔即可工作和测试应用。使用鼠标按钮作为控制器,通过移动鼠标或触控板来操控虚拟环境。从 Windows®10 中的 混合现实门户桌面应用访问图 12 所示的模拟器。

Windows' mixed reality simulator
图 12.Windows® 10 中的混合现实模拟器允许您在未将头盔连接到 PC 的情况下测试 MR 应用。

若要启用模拟器,确保您拥有 Windows 10 Creators 更新,并按照 “设置 Unity* 软件以构建混合现实 UWP 应用”中的说明进行操作。如欲了解更多信息,请参见 “使用 Windows 混合现实模拟器” 部分。

创建摄像头装备

我们来创建自己的摄像头装备。在 Unity 软件中,选中“玩家设置”中的“虚拟现实支持”会使场景中的主摄像头自动充当立体摄像头,并启用正确的位置跟踪。若要确保位置跟踪在控制器 GameObjects 上正常运行,我们需要提供位置数据,我们可以 UnityEngine.XR.WSA.Input 命名空间获取这些数据。本机 MRTK 获取位置坐标的方法是订阅 Application.onBeforeRender 的方法并通过轮询数据来更新位置和旋转。微软的 InteractionManager 提供了从控制器和头盔收到新输入或数据时触发的不同事件(包括跟踪数据)。您还可以使用 GetCurrentReading 方法轮询数据。

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
//Get data, button presses etc from each interactionSourceState
}

每个 interactionSourceState 包含按钮点击、轴数据和支持按钮的点击数量等。如欲了解更多详情,请参见 InteractionSourceState 文档

要获得位置跟踪数据,我们可以仅使用以下代码—

 Vector3 newPosition;

 if (interactionSourceState.sourcePose.TryGetPosition(out newPosition, InteractionSourceNode.Grip))
{                    	               currentController.ControllerParent.transform.localPosition = newPosition;
                	}

—where we feed an InteractionSourceNode to the TryGetPosition function.我们有两个来源:Grip(表示控制器)和 Pointer(表示控制器前向方向的提示和定向)。我们可以执行类似的 TryGetRotation 进行旋转。

Unity 软件有自己的版本,您可以通过 XR.InputTracking.GetLocalPosition 轮询跟踪数据。对于控制器,我们使用 Unity 软件的实施方法,因为它很方便,无需针对每个 SDK 使用不同的方法。Unity 软件使用起来更加简单。它提供了一个 Tracked Pose Driver 组件(见图 13),我们可以将其附加到 GameObject,并为其提供位置数据。

Unity's tracked pose driver component
图 13.Unity* Tracked Pose Driver 组件。

我们用这些组装装备,创建一个名为 VRRig 的父对象和三个子对象—主摄像头和两个控制器(见图 14)。让我们将所有变换归零并将 Pose 驱动程序附加到控制器 GameObjects。

The VRRIG hierarchy in Unity* software
图 14.Unity* 软件中的 VRRig 层级结构(左图)将 Unity 软件中的 XYZ 变换(右上角)和 Inspector > Tracked Pose Driver(脚本)设置(右下角)归零。

选择 设备选项卡上的通用 XR 控制器,以及相应的Pose Source(右或左控制器)。如果您将一些 3D 模型附加到您的控制器并进入播放模式,您将有一个功能完善的摄像头装置使用 Windows 混合现实,让您看到您的手在移动。

现在我们来处理控制器的输入。前面提到过,我设计 VR 体验的方式通常是将 VRHand.cs 组件连接到我的控制器 GameObjects,然后通过我的游戏逻辑设置引用并调用公共方法进行输入;例如VRHand.GetTrigger();。使用此方案可以将这个 VRHand.cs 脚本重写到每个特定平台,从而移植到不同的 SDK。

那么我们如何才能获得 Windows 混合现实的原生输入?Unity 软件使用 Input.GetButton/Input.GetAxis 提供其标准输入 API。MR 控制器的特定映射可以在 Windows 混合现实输入 文档中找到。您可以连接 Unity Input Manager,以创建多平台 XR 输入系统。如果您想获得更详细的输入数据,则必须在 "UnityEngine.XR.WSA.Input” 下使用 Windows 特定 API。我们可以像之前看到的那样轮询控制器位置数据,但我们也可以从控制器轮询输入数据。

if (interactionSourceState.selectPressed) {
     // Do something when the "Select" button is pressed
}

选择与 MR 控制器中的触发器相对应。

值得一提的是,从这个 API 获得的数据是前向预测数据,以考虑 VR 的运动到光子延迟,从而使渲染姿势看起来更正确。

处理来自控制器的按钮输入时,数据需要准确并且与用户点击按钮同步。蓝牙* 技术控制器在输入中引入高达 20 毫秒的延迟,添加至前向预测时,在用户点击按钮后可达到 40 毫秒的延迟。若要使用历史姿势数据,Microsoft API 将通过 InteractionManager 中的交互源事件进行处理。我们可以在这些事件中订阅我们的方法,并且每帧更新 VRHand 数据的状态。

我们来看看点击触发器的一种简单实施:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SpatialTracking;
using UnityEngine.XR.WSA.Input;

[RequireComponent(typeof(TrackedPoseDriver))]
public class VRHand : MonoBehaviour {

TrackedPoseDriver tracker;
InteractionSourceHandedness handedness;
bool triggerpress;
void Start()
	{
    	tracker = GetComponent<TrackedPoseDriver>();
    	if (tracker.poseSource == TrackedPoseDriver.TrackedPose.LeftPose)
        	handedness = InteractionSourceHandedness.Left;
    	else
        	handedness = InteractionSourceHandedness.Right;

    	InteractionManager.InteractionSourcePressed +=                                                 InteractionManager_InteractionSourcePressed;
	}

 void OnDestroy()
	{
    	InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    	}
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
	{
    	if (state.state.source.handedness == handedness)
    	{
		if(state.pressType==InteractionSourcePressType.Select)
			triggerpress=true;
}
}
 public bool GetTriggerPress()
	{
    	return triggerpress;
	}
private void LateUpdate()
	{
	triggerpress=false;
}
}

首先,我查看 Tracked Pose Driver,对控制器的用手习惯进行排序。我订阅了点击按钮时触发的 InteractionManager 事件的方法 (InteractionManager.InteractionSourcePressed)。在我的方法中,查看点击类型。如果是一个对应正确用手习惯的触发点击,我将设置一个在 GetTriggerPress 方法中返回的 bool。最后,我在 LateUpdate 中将 bool 设为"false”,因为我只想在最初点击时获得读数。通过此设置,我们可以访问 MR 控制器中的所有功能,同时利用将大多数 SDK 特定方法提取到 VRHand.cs 脚本的设计决策。我已经在文章中添加了我的 VRHand.cs 脚本并实现了所有按钮,因此您可以查看源代码。

结论

微软的 Windows 混合现实生态系统吸引了众多开发人员和合作伙伴,并承诺在大众中普及虚拟现实技术。除了游戏之外,我们还在开发混合现实应用,以改变我们开展远程协作,查看数据,设计真实和虚拟对象并与其交互以及了解我们周围世界的方式。(了解关于一些 MR 商业应用的更多信息。)

我们已经探讨了如何设置开发环境,以创建用于 Windows 混合现实头盔的 UWP 应用。另外我们还讨论了规划多平台内容的最佳实践,特别是 VR 摄像头装备的结构。我们还研究了几个开发框架,以开始利用 UWP 和 MR 控制器和头盔的本机集成。我们研究了两个可以加速开发的开源资源(VRTK 和 MRTK),但需要使用复杂但功能强大的框架。最后,我们部署了面向 Windows 混合现实头盔的原生相机装备以及用于从控制器获取本机数据的输入层。我希望您使用所有这些资源创建一些令人惊叹的 MR 内容。

代码示例

代码示例 MRHand.cs 作为组件下载到 Unity 中的 gameobject。将 gameobject 中的 Tracked Pose Driver 组件设为正确的设备和用手习惯后,MRHand.cs 脚本将为您提供公共输入功能,以获取用于驱动游戏的控制器按钮点击。

资源

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.