目录
一、插件介绍
Unity XR-XR Interaction Toolkit开发使用方法(一)-CSDN博客
Unity XR-XR Interaction Toolkit开发使用方法(二)Hisense XR-V3 Pro SDK接入-CSDN博客
二、主要组件
XR Interaction Manager
Unity XR-XR Interaction Toolkit开发使用方法(三)组件介绍(XR Interaction Manager)-CSDN博客
XR Controller
Unity XR-XR Interaction Toolkit开发使用方法(四)组件介绍(XR Controller)-CSDN博客
XR Interactor
Unity XR-XR Interaction Toolkit开发使用方法(五)组件介绍(XR Interactor)-CSDN博客
XR Direct Interactor
Unity XR-XR Interaction Toolkit开发使用方法(六)组件配置(XR Direct Interactor)-CSDN博客
XR Ray Interactor
Unity XR-XR Interaction Toolkit开发使用方法(七)组件配置(XR Ray Interactor)-CSDN博客
XR Socket Interactor
Unity XR-XR Interaction Toolkit开发使用方法(八)组件介绍(XR Socket Interactor)-CSDN博客
三、XR Gaze Interactor
1、组件介绍
Unity XR Gaze Interactor 是 XR Interaction Toolkit 中用于实现 基于视线(凝视)交互 的核心组件,允许用户通过头戴设备的注视方向与虚拟对象或 UI 元素交互。它无需手柄输入,仅依赖头部追踪数据,适用于轻量化交互场景(如医疗培训、无障碍应用)或作为辅助交互方式。
用于通过凝视与可交互对象交互的交互器。该组件通过实时更新的射线投射确定当前有效目标范围,仅与启用了"允许凝视交互"的XR基础可交互对象(XRI实现的XR简单可交互和XR抓取可交互)进行交互。本交互器支持在可交互对象上启用的注视辅助功能,且可交互对象具有附加属性,允许您单独为每个对象配置凝视功能的具体作用方式。
2、核心功能与特点
视线检测
- 从用户视角(摄像机)发射一条 不可见射线,检测视线路径上的
XR Interactable
对象或 UI 元素。 - 支持 注视时长阈值(Gaze Duration),防止误触(如持续注视 2 秒后触发选择)。
跨平台兼容
- 兼容主流 XR 设备的头部追踪(Oculus Quest、HTC Vive Focus、Windows MR 等)。
- 支持与手柄、手势追踪协同工作(如混合交互模式)。
事件驱动逻辑
- 提供
OnHoverEntered
、OnSelectEntered
等事件,支持注视开始、持续、结束的回调。
无障碍设计
- 为运动受限用户提供无需手柄的交互方案。
- 可通过视线选择菜单、按钮等 UI 元素。
3、组件配置详解
属性 | 描述 |
---|---|
Gaze Assistance Snap Volume | (可选)此交互器用于定位有效注视辅助目标的 XRInteractableSnapVolume 。若未指定,将自动创建一个。 |
Gaze Assistance Calculation | 定义此交互器如何调整注视辅助吸附区域的尺寸和比例。 |
Fixed Size | 为注视辅助吸附区域使用固定尺寸。 |
Collider Size | 根据命中的可交互对象的碰撞体尺寸调整注视辅助吸附区域。 |
Gaze Assistance Fixed Size | 当计算方式为“固定尺寸”时,注视辅助吸附区域使用的固定尺寸值。 |
Gaze Assistance Collider Scale | 应用于注视辅助吸附区域的缩放比例。 |
Gaze Assistance Distance Scaling | 启用后,注视辅助碰撞体会根据交互器与目标可交互对象的距离动态调整缩放比例。 |
Clamp Distance Scaling | 将注视辅助碰撞体的缩放比例限制在“距离缩放钳制值”范围内。 |
Distance Scaling Clamp Value | 注视辅助碰撞体缩放比例的最大限制值。 |
4、工作原理
射线生成
- 每帧从摄像机位置沿注视方向发射射线。
碰撞检测
- 检测射线路径上的
Interactable
对象或 UI 元素。
计时验证
- 若用户持续注视目标超过
Gaze Time
,触发Select
事件。
事件分发
- 通过
XR Interaction Manager
通知目标对象执行交互逻辑。
5、事件系统与脚本交互
XR Gaze Interactor 提供以下关键事件:
事件 | 触发时机 | 典型应用 |
---|---|---|
OnHoverEntered | 视线首次落在目标上时 | 显示高亮、播放提示音 |
OnHoverExited | 视线离开目标时 | 隐藏高亮、重置提示 |
OnSelectEntered | 注视时间达到阈值后触发 | 确认选择、打开菜单 |
OnSelectExited | 视线移出目标或中断注视时 | 取消操作、关闭弹窗 |
示例脚本:注视计时进度条
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.Interaction.Toolkit;
public class GazeProgress : MonoBehaviour
{
public XRGazeInteractor gazeInteractor;
public Image progressBar;
private float gazeTimer;
void Update()
{
if (gazeInteractor.TryGetCurrentUIRaycastResult(out RaycastResult result))
{
gazeTimer += Time.deltaTime;
progressBar.fillAmount = gazeTimer / gazeInteractor.gazeTime;
if (gazeTimer >= gazeInteractor.gazeTime)
{
// 触发选择逻辑
gazeTimer = 0;
}
}
else
{
gazeTimer = 0;
progressBar.fillAmount = 0;
}
}
}
6、与其他组件的协作
与 UI 系统的集成
- 在 Canvas 上添加
Tracked Device Graphic Raycaster
,使视线可交互 UI。 - 配置
XR UI Input Module
处理凝视输入事件。
与 XR Interaction Manager 的协同
- 管理视线交互与其他交互器(如手柄射线)的优先级。通常手柄交互优先级更高。
与物理对象的交互
- 为物体添加
XR SimpleInteractable
,监听OnHoverEntered
实现注视触发动画。
7、实际应用场景
场景1:无障碍菜单操作
- 创建浮动菜单 Canvas,添加按钮。
- 为每个按钮配置
XR SimpleInteractable
,设置Gaze Time
为 1.5 秒。 - 用户注视按钮时显示进度条,完成后触发点击事件。
场景2:凝视激活机关
- 在场景中放置一个锁定的宝箱,附加
XR Gaze Interactor
。 - 用户注视宝箱 3 秒后,播放解锁动画并打开。
场景3:混合交互(凝视+手柄)
- 用户通过视线快速定位远处物体。
- 按下手柄按钮后,使用
XR Ray Interactor
进行精细操作。
8、优化与调试技巧
降低误触率
- 增加
Gaze Time
至合理值(如 1~2 秒)。 - 使用
Layer Mask
过滤非交互层(如背景物体)。
视觉反馈优化
- 添加 光标粒子特效 或 动态缩放效果,增强视线焦点的可视性。
- 为长时间凝视设计进度动画(如圆形填充)。
性能调优
- 减少射线检测频率(通过
Raycast Update Interval
)。 - 避免在复杂场景中启用
Enable Visual Feedback
(减少渲染开销)。
9、常见问题与解决
问题:视线无法检测到物体
检查步骤:
- 确认物体有
XR Interactable
组件和Collider
。 - 检查
Layer Mask
是否包含目标层级。 - 验证
Ray Origin
是否绑定到摄像机。
问题:注视计时不准确
解决:
- 确保
Gaze Time
大于 0。 - 在脚本中通过
Time.deltaTime
累加计时,避免帧率波动影响。
问题:多设备兼容性问题
适配方案:
- 使用
UnityEngine.InputSystem.XR.XRHMD
获取设备通用头部数据。 - 为不同设备调整
Max Raycast Distance
(如房间尺度 vs. 坐姿体验)。