控制器蓝图
不同控制器的实现通过组件完成,便于在演员中进行扩展或替换。
父组件类 BP_ControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)负责访问注视控制器和指针控制器。该蓝图为管理交互提供了基础,并包含一些可以在所有派生控制器中由开发者自定义的选项。
● 自动激活(Auto Activate):指示控制器是否默认启用。
● 延迟启动(Delay Start):应用程序启动或加载新地图时,交互启用前的等待时间。
● 标签组件(Tag Component):父组件(来自 pawn 角色)上的标签名称,以便后续在控制器组件实现中进行引用。
以下是与控制器组件交互或创建自定义子控制器组件时需要注意的一些函数:
● Start:此事件应仅在首次初始化控制器时调用,不支持重写。最好从 Begin Play 节点调用。
● Start_Implementation:此函数负责每个子组件的具体初始化。
● Set Default Controller:配置组件在初始化后是否应被激活。因此,这个函数仅在 Start 函数之前调用时才有意义。
● Enable:启用组件。
● Disable:禁用组件。
● Is Enable:返回组件是否已启用。
● Press/Release Button:使用 Widget Interaction Component 管理按钮交互。
● Is Over Interactable Widget:返回 Widget Interaction Component 是否指向一个可交互的 Widget。
提示! 在 XR 项目的控制器中,关键组件是 Widget Interaction Component。所有组件或派生组件应该仅根据控制器的类型来建立交互规则。有关该组件的基本信息,请参考 Unreal 文档。 |
注视控制器
注视控制器 BP_GazeControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)负责管理射线投射和与场景中 Widget 的交互,以及延迟交互功能和指针的“点击”功能。
注视指针限制 目前,注视指针只能与场景中的 Widget 进行交互,无法与 3D 演员进行交互,这与 Pointer Controller 不同,后者可以与 Widget 和 3D 演员都进行交互。 |
开发者可以自定义的选项包括:
● Move Reticle to Hit:启用此选项后,当用户注视一个交互对象时,瞄准点会移动到该对象的交互位置。
● Timer Duration:用户需要注视某个对象多长时间才能选择它。
● Default Distance:当启用 bMoveReticleToHit 时,设置注视控制器的距离。
● Vertical Bias:瞄准点的垂直位置,0 表示屏幕中心,1 表示屏幕顶部,-1 表示屏幕底部。
● Reticle Outer Ring:外环瞄准点的材质,如果设置为 NULL,则表示外环被禁用。此功能在 SDK 版本 0.15.0 中已弃用。
最后,样本中用于指向世界的瞄准点由一个隐藏的 Widget Component 和一个 Stereo Layer 组件组成。所有与注视相关的组件都会使用组件标签(gaze)进行区分,控制器组件假设注视的 Widget Interaction Component 始终是其他必要组件的父组件。
● Stereo Layer:为了避免指针出现抖动,建议在立体层中渲染纹理,要使其正常工作,需要启用 Live Texture,并将 Stereo Layer Shape 设置为 Quad Layer。请注意,与其他组件不同,Unreal会将此组件的变换值解释为相对于相机,而不是相对于父组件或附加的 Actor。函数 Update Reticle Position(在组件蓝图中)将 Widget 移动到交互击中位置,并计算相对于相机的位置以用于立体层。然而,大小必须使用 Quad Size 变量来定义,而不是使用缩放。此外,由于控制器组件会将 Widget Component 的渲染复制到立体层中,因此纹理不需要初始化。
● Widget Component:此组件被隐藏,因为立体层负责渲染瞄准点。可以在 WBP_GazePointer 资产中修改原始纹理(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > UI)。它使用静态材质(MI_Reticle_Inner)来渲染内环,而外环则使用动态材质(MI_Reticle_Outer),这个动态材质定义了一个参数(Percentage),用于实现瞄准点交互的视觉效果。
指针控制器
指针控制器的主要功能在 BP_PointerControllerComponent 中实现(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)。它的工作原理与其他控制器类似,但初始化过程会根据设备是否支持 3DoF 或 6DoF 进行调整。使用微软交互配置文件的控制器会自动作为 3DoF 控制器启用,而使用 Oculus 交互配置文件的控制器会自动作为 6DoF 控制器启用,这些设置都在 Motion Controller Component 中完成。
请注意,当使用 3DoF 控制器时,必须选择左手。对于 6DoF 控制器,选择的手可以是左手或右手,这取决于控制器设计的手型。此外,开发者还可以选择哪个控制器处理交互。
Spawn Controller 函数会生成一个 BP_PointerController 类的子 Actor,该子 Actor 是通过 Motion Controller Class 变量设置的。
BP_PointerController Actor(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable)已准备好管理每个独立的控制器。
Motion Controller Component 作为根组件的子组件添加,用于管理每个控制器。该组件的 Visualization 部分允许在虚拟世界中渲染一个 3D 模型,以跟随现实世界中控制器的移动,只需启用 Display Device Model 选项,如果开发者希望根据配置文件显示每个设备的默认网格,可以在 Display Model Source 选项中选择 OpenXR。否则,开发者可以选择 Custom 来进行自定义,并在 Custom Display Mesh 中添加网格。最后,在 Motion Controller 部分,开发者应设置输入类型。
只有在启用交互的情况下,Motion Controller Component 必须附加以下组件:Widget Interaction Component,用于准确跟踪控制器在现实世界中的移动,以及一个 Static Mesh Component(在示例中称为 Laser Pointer Mesh),用于可视化指针。不论是否启用交互,如果使用的是 6DoF 设备,则父组件需要附加一个 Child Actor Component,使用 BP_XRControllerRepresentation(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable),以显示控制器及其动画。
手部追踪控制器
手部追踪控制器 BP_HandTrackingControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)负责生成和启用使用手部追踪进行远程交互所需的 Actor。这些 Actor 将自动处理交互。该控制器仅在项目设置中的手部追踪功能(位于 Project Settings > Snapdragon Spaces plugin)被启用时才会激活。此控制器支持与场景中的 Widget Actor 以及可以通过手部追踪进行交互的 Actor 进行交互。有关手部追踪交互的详细信息,请参考手部追踪示例。
输入快捷方式
用于输入操作的按钮:
主机控制器 | 右侧 XR 控制器 | 左侧 XR 控制器 | |
选择 | 触摸板点击 | 右侧触发按钮 | 左侧触发按钮 |
凝视/指针切换 | 菜单按钮 | 无 | 左侧菜单按钮 |
触摸板 | 触摸板 | 无 | 左侧摇杆 |
锚点位置确认 | 触摸板点击 | 任何触发按钮 | 任何触发按钮 |
UI用户界面
世界中的 3D 小部件必须使用蓝图 BP_3DWidget 创建(位于 SnapdragonSpacesSamples Content > Snapdragon > Common > UI),并在 WidgetComponent 中定义 UI。为了与凝视控制器或指针控制器配合使用,该蓝图必须是 BP_3DWidget 的子类。
触觉反馈
要使用触觉反馈,Snapdragon Spaces 提供了 SetSpacesHapticsByValue 函数,可以在蓝图中调用。此函数需要以下参数:玩家控制器、频率(Hz)、幅度(Cm)、持续时间(秒)以及控制器的手部。