该XR一个涵盖虚拟现实 (VR)、增强现实 (AR) 和混合现实 (MR) 应用的总称。支持这些形式的交互式应用的设备可以称为 XR 设备。 更多信息
查看 术语表 SDK 输入子系统是用于报告按钮、轴和跟踪设备信息的接口。这是将用户控制的数据输入 Unity 引擎的各种输入端点的核心子系统。Unity 将您的输入信息报告给 InputDevices 和 Input System,具体取决于可用信息的类型。
要创建基本的工作 XR 输入提供程序,请按照以下步骤操作
本指南使用以下术语
大多数输入子系统 API 依赖于设备。设备是通过您选择的唯一 ID 引用的一组输入功能的容器。它可以是具体的,例如游戏手柄或耳机,也可以代表抽象的对象,例如检测到的手部骨骼。设备具有固定数量的功能,在设备连接期间无法更改。
输入功能是指您可以从中获取传感器或用户修改数据的任何内容。它可以是按钮,也可以是位置跟踪元素,也可以是电池电量。它们被分组为各种类型的数据,由 UnityXRInputFeatureType 标识。这些是目前支持的可以在输入设备上存在的数据类型
UnityXRInputFeatureType | 数据类型 |
---|---|
kUnityXRInputFeatureTypeCustom | char[](最多 1024 个元素) |
kUnityXRInputFeatureTypeBinary | bool |
kUnityXRInputFeatureTypeDiscreteStates | unsigned int |
kUnityXRInputFeatureTypeAxis1D | float |
kUnityXRInputFeatureTypeAxis2D | UnityXRVector2 |
kUnityXRInputFeatureTypeAxis3D | UnityXRVector3 |
kUnityXRInputFeatureTypeRotation | UnityXRVector4 |
kUnityXRInputFeatureTypeHand | UnityXRHand |
kUnityXRInputFeatureTypeBone | UnityXRBone |
kUnityXRInputFeatureTypeEyes | UnityXREyes |
用途为功能提供上下文。它标识开发人员应该如何使用功能。例如,该功能可以是 2D 轴,但用途告诉开发人员它是一个触控板。用途还可以告知开发人员,一维轴功能正在报告电池电量。您可以创建自己的用途,但您需要尽可能使用 Unity 开发的用途,因为它们为开发人员提供了跨平台的实用性。有关所有可用的通用用途列表,请参见下面的 功能用途 部分。
UnityXRInternalInputDeviceId 标识所有设备。将这些标识符视为 Unity 和提供程序共享的唯一 ID,用于引用特定设备。您定义哪些 ID 映射到哪些设备,唯一的约束条件是您不能将相同的 ID 用于同时连接的两个设备。当您报告特定 ID 已连接时,Unity 会使用该 ID 请求有关该设备的功能和当前状态的信息,并使用该 ID 发送特定于设备的事件。
IUnityXRInputInterface 上的两个 API 处理设备连接和断开连接
这将报告一个新的设备。提供程序提供的 UnityXRInternalInputDeviceId
可以是任何值,只要它代表一个内部唯一的设备,并且来自同一个提供程序的两个设备不会使用相同的 ID 连接即可。设备只能在输入提供程序生命周期的开始和停止事件之间连接。在调用 IUnityXRInputProvider.Start 时已经连接的任何设备都应在该回调期间报告。
一旦设备被报告为连接,Unity 就会在下一个输入更新循环中使用提供的 UnityXRInternalInputDeviceId 调用 IUnityXRInputProvider.FillDeviceDefinition,以获取有关该设备的具体信息。
这报告了一个输入设备不再可用。您只能在已报告输入设备已连接后才能将其报告为断开连接。当您收到 IUnityXRInputProvider.Stop 时,您必须将所有当前连接的输入设备报告为断开连接。
上面的两个调用是线程安全的,可以在任何时候调用。
设备定义描述了您的设备可以向 Unity 报告的功能。功能包括设备识别信息,例如设备名称、角色、制造商和序列号。设备定义还包含可用的所有单个输入功能的索引列表。
当设备被报告为已连接时,Unity 会通过 IUnityXRInputProvider.FillDeviceDefinition 调用您的提供程序。UnityXRInputDeviceDefinition 参数充当可以传递到 IUnityXRInputInterface 上以 DeviceDefinition 为前缀的任何方法的句柄。这些方法如下所示
开发人员使用设备上的某些数据来识别特定设备或新连接设备的通用功能。
这允许提供程序设置设备名称。名称必须清晰、简洁且易于大众市场消费者识别。这应该不包括制造商的名称。此名称可供开发人员通过 UnityEngine.XR.InputDevice.name 和 Input System 中的 InputDevice.product 使用。不要将其留空。
这允许提供程序指定已连接的设备类型。UnityXRInputDeviceCharacteristics 是一系列标志,有助于定义设备的功能。这些会改变 Input System 对 InputDevice 的使用。
这允许提供程序设置设备的制造商。制造商必须清晰、简洁且易于大众市场消费者识别。此字符串可供开发人员通过 UnityEngine.XR.InputDevice.manufacturer 和 Input System 中的 InputDevice.manufacturer 使用。不要将其留空。
这允许提供程序设置设备的序列号。此字符串可供开发人员通过 UnityEngine.XR.InputDevice.serialNumber 和 Input System 中的 InputDevice.serialNumber 使用。这必须是此特定设备的唯一标识符,否则您应将其留空。
您可以通过以下 API 调用将输入功能添加到您的设备定义中。
这将添加一组类型(除了 kUnityXRInputFeatureTypeCustom)的功能,并返回该新功能的 UnityXRInputFeatureIndex。
这将添加一个 kUnityXRInputFeatureTypeCustom 功能。这些是可变缓冲区,最多可达 1024 个字节。您可以使用它们来创建自定义类型(Unity 不知道),并且需要显式大小。此方法将返回该新功能的 UnityXRInputFeatureIndex。
这将添加一个功能,但还会包含一个 功能用途。此方法是一个助手,它将 DeviceDefinition_AddFeature 和 DeviceDefinition_AddUsageAtIndex 结合在一起,并返回该新功能的 UnityXRInputFeatureIndex。
这将向现有功能添加一个 功能用途。它从添加功能的方法之一获取 UnityXRInputFeatureIndex。您可以根据需要向单个功能添加多个用途。
注意:返回的 UnityXRInputFeatureIndex 值是它们添加的顺序。
设备状态是包含设备当前状态的数据结构。UnityXRInputDeviceState 的结构由 UnityXRInputDeviceDefinition 描述。
注意:设备状态中包含的功能使用 UnityXRInputFeatureIndex 进行访问,该索引在声明设备定义中的该功能时报告。
一旦定义被声明,Unity 就会通过 IUnityXRInputProvider.UpdateDeviceState 每帧请求两次设备状态。UnityXRInputUpdateType 参数指定 Unity 预期什么样的更新
UnityXRInputDeviceState 参数充当可以传递到 IUnityXRInputInterface 上以 DeviceState 为前缀的任何方法的句柄。
这将在提供的 UnityXRInputFeatureIndex 处设置类型为 kUnityXRInputFeatureTypeCustom 的功能。设置自定义值功能时,提供程序必须始终使用声明功能的完整大小设置值;没有部分值设置。此外,您必须在提交时向 Unity 声明所有自定义功能,并详细说明它们包含什么类型的数据以及为什么它们不能使用其他单个功能类型存在。
这将设置类型为 kUnityXRInputFeatureTypeBinary 的布尔值(开/关)功能。此功能的默认、静止或未使用状态必须为 false。
这将设置一个 32 位无符号整数值。这也可以用于表示枚举。默认的、未使用的值必须为 0,如果用于枚举,则 0 必须表示 null、none、未设置或无效的值。
这将设置一个 32 位浮点值。默认的、未使用的值必须为 0.0。
这将设置一个类型为 UnityXRVector2 的值。UnityXRVector2 结构是 (X, Y) 32 位浮点数对。默认的、未使用的值必须为 (0.0, 0.0)。
这将设置一个类型为 UnityXRVector3 的值。UnityXRVector2 结构是 (X, Y, Z) 32 位浮点数对。默认的、未使用的值必须为 (0.0, 0.0, 0.0)。
这将设置一个类型为 UnityXRVector4 的值,格式为四元数。默认的、未使用的值必须为 (0, 0, 0, 1)。有关更多信息,请参阅有关 四元数Unity 表示旋转数据时的标准方法。在编写处理旋转的代码时,您通常应该使用 Quaternion 类及其方法。 更多信息
查看 术语表 的文档。
这将设置一个类型为 UnityXRBone 的值。
这将设置一个类型为 **UnityXRHand** 的值。
这将设置一个类型为 **UnityXREyes** 的值。
**注意:** 传入的 **UnityXRInputFeatureUsageIndex** 与在填充 **UnityXRInputFeatureDefinition** 时将单个功能添加到设备定义时返回的索引相同。
以下高级类型是特殊的特征类型,用于包含来自多个数据源的数据。
这些表示空间中骨骼或层次姿势的一个元素。**position** 成员表示以米为单位的三维位置,使用左手坐标系,其中 Y 为上。**rotation** 成员表示该骨骼在空间中的方向,用弧度表示的归一化四元数表示。**parentBoneIndex** 是一个 **UnityXRInputFeatureIndex**,它必须指向层次结构中向上方的 **UnityXRBone**,或者如果它是该骨架的根节点,则为 **kUnityInvalidXRInputFeatureIndex**。
这些表示类似手的骨骼结构。它们将骨骼层次结构组织成手指和根节点,以便轻松遍历。**rootBoneIndex** 必须始终指向一个有效的索引,该索引的类型为 **kUnityXRInputFeatureTypeBone**,它表示手掌或手的中心。**fingerBoneIndices** 必须按顺序排列,使得数组的第一维或数组映射到单个手指,遵循 **UnityXRHandFinger** 枚举值,数组的第二维是根部到指尖的单个手指骨骼。
这些表示一对眼睛,它们的注视点和当前眨眼数据。**leftEyePose** 和 **rightEyePose** 的类型为 **UnityXRPose**,其中 **position** 成员表示以米为单位的三维位置,使用左手坐标系,其中 Y 为上,**rotation** 成员表示用弧度表示的归一化四元数。**fixationPoint** 表示左右眼睛会聚的位置,也是一个以米为单位的三维位置,使用左手坐标系,其中 Y 为上。**leftOpenAmount** 和 **rightOpenAmount** 表示眼睛的睁开程度,其中 0 表示闭合,1 表示完全睁开。它们不能超过 [0,1] 范围。
除了设备状态和定义更新之外,Unity 还希望您对各种事件做出反应和响应。
这用于特定于此提供程序的私有事件。**eventType** 参数是用于识别有效载荷的自定义代码。如果提供程序不了解该事件,它必须返回 **kUnitySubsystemErrorCodeFailure**。
跟踪原点是指跟踪设备相对于其所在的空间中的一个点。它实际上是在真实世界空间中设备报告 (0, 0, 0) 位置的点。Unity 支持多种跟踪原点模式,提供程序可以选择加入他们支持的模式。跟踪原点模式列在 **UnityXRInputTrackingOriginModeFlags** 中。
**kUnityXRInputTrackingOriginModeDevice** 将原点置于启动时主设备的位置和偏航角,或置于最后一个 **UnityXRInputProvider.HandleRecenter** 事件的位置。
**kUnityXRInputTrackingOriginModeFloor** 将原点置于地板上的某个位置。地板上的位置由提供程序决定,只要它能让开发者了解地板和各种设备之间的高度差即可。
**kUnityXRInputTrackingOriginModeTrackingReference** 将原点置于具有 **kUnityXRInputDeviceCharacteristicsTrackingReference** 特性的特定 InputDevice 的位置。
最后,**kUnityXRInputTrackingOriginModeUnknown** 是一个错误情况,不应该由提供程序返回。
当跟踪原点模式设置为 **kUnityXRInputTrackingOriginModeDevice** 时,调用重新居中应该将主设备的当前位置设置为新的原点。
这是 Unity 发出的获取提供程序正在使用的当前跟踪原点模式的请求。提供程序应设置 **trackingOriginMode** 参数并返回 **kUnitySubsystemErrorCodeSuccess**。返回的参数必须只能是单个标志值。
这是请求支持哪些跟踪原点模式。提供程序应设置 **supportedTrackingOriginModes** 参数并返回 **kUnitySubsystemErrorCodeSuccess**。返回的参数应该是 **UnityXRInputTrackingOriginModeFlags** 的累积列表,**UnityXRInputProvider.HandleSetTrackingOriginMode** 能够支持这些标志。
这是 Unity 发出的更改当前跟踪原点模式的请求。**trackingOriginMode** 参数是所需的跟踪原点模式。提供程序应在原点能够更改的情况下返回 **kUnitySubsystemErrorCodeSuccess**,否则返回 **kUnitySubsystemErrorCodeSuccess**。如果跟踪原点模式已经是所需的模式,则提供程序应该什么也不做并返回 **kUnitySubsystemErrorCodeSuccess**。
这是提供程序可以发送的通知 Unity 跟踪原点的位置已更改的事件。当 **UnityXRInputProvider.HandleSetTrackingOriginMode** 成功并移动原点时,必须调用此事件。如果提供程序必须由于整体跟踪信息的变化而更改原点,则也可以调用此事件。
这是提供程序可以发送的通知 Unity 有一个可用的跟踪边界,或跟踪边界已更改的事件。如果存在边界,并且跟踪原点已更改,以致移动了边界的相对位置,则必须调用此事件。可以使用 null 和 0 个点调用此事件,以删除现有的跟踪边界。
这是对提供程序填充的给定设备的触觉功能的请求。将 **supportsImpulse** 设置为 true 将启用 **UnityXRInputProvider.HandleHapticImpulse** 的事件。将 **supportsBuffer** 设置为 true 将启用 **UnityXRInputProvider.HandleHapticBuffer** 的事件。
**注意:** 功能结构允许提供程序设置通道数量以及请求启动和停止包含通道索引的触觉。这允许提供程序在单个设备中拥有多个电机,这些电机可以独立地振动。第一个通道应该是最常用的电机,但后续顺序是提供程序相关的。
这是对设备以设定的幅度振动一段时间的请求。Unity 填写此请求的数据。buffer 参数的类型为 **UnityXRHapticImpulse**。
这是对设备以给定缓冲区振动图案的请求。Unity 填写此请求的数据。buffer 参数的类型为 **UnityXRHapticUpdate**。
bufferSize 从未超过 **UnityXRInputProvider.QueryHapticCapabilities** 事件返回的 **UnityXRHapticCapabilities.bufferMaxSize**。
这是 Unity 发出的停止任何触觉效果的请求。这应该停止提供的 **UnityXRInternalInputDeviceId** 上的脉冲或缓冲的触觉效果。
功能用法是简单的字符串标签,它们提供有关您的功能的上下文,并帮助 Unity 开发人员以通用方式访问您的设备。您可以将您的设备声明为具有触发器、设备位置、菜单按钮或其他共享的输入功能概念。开发人员可以访问这些功能并与您的设备交互,而无需确切知道它是什么。这些功能还用于将输入数据路由到 **UnityEngine.Input** 和 **UnityEngine.XR.InputTracking**,并确定索引。单个输入功能可以有多个用法,但您声明的每个输入功能都必须至少分配一个用法。如果您选择不使用 Unity 默认提供的用法,则必须在提交认证时让 Unity 知道您使用了哪些用法,并准备根据 Unity 的反馈更新您的用法字符串。
所有世界空间用法都以米、米/秒、米/秒2 或弧度表示,具体取决于情况。空间应设置为左手坐标系,Z 轴向前,Y 轴向上。空间原点应该是设备连接时的位置。这个空间是您自己的,它不会直接映射到 Unity 世界空间。
这些是 Unity 中可用的常见用法
以下功能适用于在现实世界中提供跟踪的设备。它们对于识别当前跟踪功能很有用
**kUnityXRInputFeatureUsageIsTracked** 是一个布尔值,用于指定设备当前是否正在正确跟踪。True 表示完全跟踪,False 表示部分跟踪或未跟踪。
**kUnityXRInputFeatureUsageTrackingState** 是一个离散状态功能,由 **UnityXRInputTrackingStateFlags** 枚举支持,用于标识当前可用的实际跟踪功能和更新。此值永远不能高于 **kUnityXRInputTrackingStateAll**。
其余跟踪功能传递有关特定“节点”的单个数据,例如设备、左眼或彩色 摄像机创建一个场景中特定视点的图像的组件。输出要么绘制到屏幕上,要么捕获为纹理。 更多信息
请参阅 词汇表。它们被分组到六个集合中,具体取决于数据类型。这些必须与 **kUnityXRInputFeatureUsageTrackingState** 中的当前值一起更新。也就是说,如果跟踪状态说位置可用,则所有位置用法必须正确更新。
前缀如下所示
前缀 | 说明 |
---|---|
kUnityXRInputFeatureUsageDevice | 输入设备的广义位置 |
kUnityXRInputFeatureUsageCenterEye | 所有眼睛渲染位置的集中平均值 |
kUnityXRInputFeatureUsageLeftEye | 左眼的渲染位置 |
kUnityXRInputFeatureUsageRightEye | 右眼的渲染位置 |
kUnityXRInputFeatureUsageColorCamera | 任何传入摄像机馈送的位置 |
每个前缀都有一系列可用的后缀,它们表示各种跟踪属性,如下所示:* **Position** * **Rotation** * **Velocity** * **AngularVelocity** * **Acceleration** * **AngularAcceleration**
不包含这些内容表示它们永远不可用。包含它们,但通过 **kUnityXRInputFeatureUsageTrackingState** 功能将它们标记为不可用,表示该功能当前不可用,但以后可能可用。
这些包含广义的设备信息,而不是用户操作的控件。它们是用户无法直接控制的设备的功能。
**kUnityXRInputFeatureUsageBatteryLevel** 是一个一维轴功能,表示设备的当前电量,其中 0 表示没有电量,1 表示充满电。它必须始终处于 [0-1] 范围内。
**kUnityXRInputFeatureUsageUserPresence** 是一个布尔值,当用户当前佩戴耳机时返回 true。
这些是二维模拟浮点值,例如触摸板和操纵杆。这些控件通常用拇指移动。它们提供 X 和 Y,并且应该始终处于 ([–1,1],[–1,1]) 范围内。
kUnityXRInputFeatureUsagePrimary2DAxis 是一个代表触摸板或操纵杆的二维轴功能。0,0 是闲置位置,Y 轴正方向为远离控制器用户的方向。
kUnityXRInputFeatureUsageSecondary2DAxis 是一个代表第二个操纵杆或触摸板的二维轴,它与 kUnityXRInputFeatureUsagePrimary2DAxis 配合使用。0,0 是闲置位置,Y 轴正方向为远离控制器用户的方向。
这些都是单维的模拟浮点值。按钮、触发器和其他可以“半按”的控件都标识在此。
kUnityXRInputFeatureUsageTrigger 是一个映射到索引激活触发器的 1D 轴。它必须始终在 [0,1] 范围内,其中 0 表示未按下,1 表示完全按下。如果实现了此功能,设备还必须实现 kUnityXRInputFeatureUsageTriggerButton。
kUnityXRInputFeatureUsageGrip 是一个映射到手握激活抓握的 1D 轴。它必须始终在 [0,1] 范围内,其中 0 表示未握住,1 表示完全握住。如果实现了此功能,设备还必须实现 kUnityXRInputFeatureUsageGripButton。
这些是单维的数字值。它们可以被激活或未被激活,但没有进一步的粒度。
kUnityXRInputFeatureUsagePrimaryButton 是一个代表控制器上主按钮的二进制功能。它通常用作菜单中的确认或前进按钮。如果它被激活,那么 kUnityXRInputFeatureUsagePrimaryTouch 也必须被激活,如果它存在的话。
kUnityXRInputFeatureUsagePrimaryTouch 是一个代表控制器上主按钮的触摸状态的二进制功能。如果实现了此功能,设备必须实现 kUnityXRInputFeatureUsagePrimaryButton。
kUnityXRInputFeatureUsageSecondaryButton 是一个代表控制器上辅助按钮的二进制功能。它通常用作返回或备用按钮。如果它被激活,那么 kUnityXRInputFeatureUsageSecondaryTouch 也必须被激活,如果它存在的话。
kUnityXRInputFeatureUsageSecondaryTouch 是一个代表控制器上辅助按钮的触摸状态的二进制功能。如果实现了此功能,设备必须实现 kUnityXRInputFeatureUsageSecondaryButton。
kUnityXRInputFeatureUsageGripButton 是一个代表手握激活抓握是否被触发的二进制功能。如果实现了此功能,设备还必须实现 kUnityXRInputFeatureUsageGrip。
kUnityXRInputFeatureUsageTriggerButton 是一个布尔功能,代表手握激活抓握是否被触发。如果实现了此功能,设备还必须实现 kUnityXRInputFeatureUsageTrigger。
kUnityXRInputFeatureUsageMenuButton 是一个代表非游戏玩法暂停或菜单按钮的二进制功能。它通常不在用户易于触及的地方。
kUnityXRInputFeatureUsagePrimary2DAxisClick 是一个代表 kUnityXRInputFeatureUsagePrimary2DAxis 二维轴的按下或点击的二进制功能。如果实现了此功能,设备必须实现 kUnityXRInputFeatureUsagePrimary2DAxis。如果它被激活,那么 kUnityXRInputFeatureUsagePrimary2DAxisTouch 也必须被激活,如果它存在的话。
kUnityXRInputFeatureUsagePrimary2DAxisTouch 是一个代表 kUnityXRInputFeatureUsagePrimary2DAxis 二维轴的轻触的二进制功能。如果实现了此功能,设备必须实现 kUnityXRInputFeatureUsagePrimary2DAxis。
kUnityXRInputFeatureUsageSecondary2DAxisClick 是一个代表 kUnityXRInputFeatureUsageSecondary2DAxis 二维轴的按下或点击的二进制功能。如果实现了此功能,设备必须实现 kUnityXRInputFeatureUsageSecondary2DAxis。如果它被激活,那么 kUnityXRInputFeatureUsageSecondary2DAxisTouch 也必须被激活,如果它存在的话。
kUnityXRInputFeatureUsageSecondary2DAxisTouch 是一个代表 kUnityXRInputFeatureUsageSecondary2DAxis 二维轴的轻触的二进制功能。如果实现了此功能,设备必须实现 kUnityXRInputFeatureUsageSecondary2DAxis。
这些代表单个传感器类型。它们用作搜索手部和眼睛类型数据的简写。
kUnityXRInputFeatureUsageHandData 是一个代表手部跟踪数据的 UnityXRHands 功能。kUnityXRInputFeatureUsageEyesData 是一个代表眼睛跟踪数据的 UnityXREyes 功能。
为了让用户使用新输入系统绑定到您的设备属性并使用代码访问它们,您需要在输入提供程序中提供设备布局描述。
您应该为输入提供程序中定义的每种设备类型提供一个设备布局。如果您没有为注册的设备提供明确的设备布局,用户将无法使用新输入系统 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三个 UI 系统。 更多信息
见 词汇表 绑定到您设备上的功能。输入系统仍将接收设备数据,用户可以手动创建到您的新设备功能的绑定。
有关输入系统设备布局的更多信息,请参阅输入系统 文档。以下提供了一个示例,以方便实现。
此示例提供了一个新的示例 VR虚拟现实 更多信息
见 词汇表 控制器的布局。示例 VR 控制器的 XRSDK 布局定义描述如下:- 一个额外的 kUnityXRInputFeatureTypeBinary
,称为 exampleButton
- 一个 kUnityXRInputFeatureTypeAxis3D
值,称为 examplePosition
- 一个 kUnityXRInputFeatureTypeRotation
值,称为 exampleRotation
为了允许用户使用新输入系统绑定和控制设备,您必须为新的示例 VR 控制器提供一个设备布局。
首先,您需要提供一个 InputControlLayout
属性,并为新输入系统 UI 提供一个明确的名称。使用 [Preseve]
属性确保这些元素不会从编译步骤中删除。
[Preserve]
[InputControlLayout(displayName = "Example VR Controller")]
public class ExampleVRController : XRController
{
接下来,为 XRSDK 布局中定义的各种元素提供 InputControl
映射。再次使用 [Preserve]
确保这些元素不会从构建中删除。使用 aliases
关键字允许新输入系统根据您提供的别名执行常见的匹配。
[Preserve]
[InputControl(aliases = new[] { "PrimaryButton" })]
public ButtonControl exampleButton { get; private set; }
[Preserve]
[InputControl]
public Vector3Control examplePosition { get; private set; }
[Preserve]
[InputControl]
public QuaternionControl exampleRotation { get; private set; }
最后,提供 FinishSetup
方法的实现,该方法将控制映射绑定到控件实例。确保您也调用基类的 FinishSetup
,否则基控件不会被绑定。
protected override void FinishSetup()
{
base.FinishSetup();
exampleButton = GetChildControl<ButtonControl>("exampleButton");
examplePosition = GetChildControl<Vector3Control>("examplePosition");
exampleRotation = GetChildControl<QuaternionControl>("exampleRotation");
}
您需要执行的最后一步是在启动这些设备的 XRSDK 加载程序时,将新的设备布局注册到新输入系统。以下代码是此实现的示例。
您必须使用与产品匹配的正确匹配字符串或 XRSDK 输入提供程序在设备连接时提供的其他字符串来填写 REGEX THAT MATCHES YOUR DEVICE
部分。
public override bool Initialize()
{
#if UNITY_INPUT_SYSTEM
InputLayoutLoader.RegisterInputLayouts();
#endif
#if UNITY_INPUT_SYSTEM
#if UNITY_EDITOR
[InitializeOnLoad]
#endif
static class InputLayoutLoader
{
static InputLayoutLoader()
{
RegisterInputLayouts();
}
public static void RegisterInputLayouts()
{
UnityEngine.InputSystem.InputSystem.RegisterLayout<ExampleVRController>(
matches: new InputDeviceMatcher()
.WithInterface(XRUtilities.InterfaceMatchAnyVersion)
.WithProduct("<REGEX THAT MATCHES YOUR DEVICE>")
);