Unity XR-XR Interaction Toolkit开发使用方法(十一)组件介绍(XR Interactable)

目录

一、插件介绍

二、主要组件

[XR Interaction Manager](#XR Interaction Manager)

[XR Controller](#XR Controller)

[XR Interactor](#XR Interactor)

[XR Direct Interactor](#XR Direct Interactor)

[XR Ray Interactor](#XR Ray Interactor)

[XR Socket Interactor](#XR Socket Interactor)

[XR Gaze Interactor](#XR Gaze Interactor)

[XR Interaction Group](#XR Interaction Group)

[三、XR Interactable](#三、XR Interactable)

1、组件介绍

2、核心功能与特点

交互类型支持

事件驱动设计

物理与运动控制

可扩展性

3、组件配置详解

[1. 基础配置](#1. 基础配置)

[Interaction Manager](#Interaction Manager)

[Interaction Layer Mask](#Interaction Layer Mask)

Colliders

[2. 交互行为配置](#2. 交互行为配置)

[Interactable Events](#Interactable Events)

Filters

[3. 高级配置](#3. 高级配置)

[Allow Multiple Selection](#Allow Multiple Selection)

[Custom Reticle](#Custom Reticle)

4、事件系统与脚本交互

[1. 通过 Unity Event 绑定](#1. 通过 Unity Event 绑定)

[2. 通过脚本监听事件](#2. 通过脚本监听事件)

5、与其他组件的协作

[与 XR Interactor 的交互](#与 XR Interactor 的交互)

[与 XR Interaction Manager 的协同](#与 XR Interaction Manager 的协同)

与物理系统的集成

6、实际应用场景

场景1:基础抓取与释放

场景2:悬停高亮与提示

场景3:条件过滤交互

7、子类与扩展

[XR Grab Interactable](#XR Grab Interactable)

[XR Simple Interactable](#XR Simple Interactable)

8、优化与调试技巧

性能优化

调试工具

输入防抖

9、常见问题与解决

问题:物体无法被交互

问题:抓取后物体位置偏移

问题:事件未触发


一、插件介绍

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

Unity XR-XR Interaction Toolkit开发使用方法(九)组件介绍(XR Gaze Interactor)-CSDN博客

XR Interaction Group

Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)-CSDN博客


三、XR Interactable

1、组件介绍

Unity XR InteractableXR Interaction Toolkit 中用于标记物体为 可交互对象 的核心组件,定义了物体如何响应交互器(如手柄、射线、视线)的操作(如抓取、悬停、激活)。它是所有交互行为的"接收方",为开发者提供了灵活的事件系统和属性配置,是构建 XR 交互逻辑的基础。


2、核心功能与特点

交互类型支持

  1. 支持多种交互行为:悬停(Hover)选中(Select)激活(Activate)焦点(Focus) 等。
  2. 可配置交互的触发条件(如仅允许特定类型的交互器操作)。

事件驱动设计

  1. 提供丰富的回调事件(如 OnHoverEnteredOnSelectExited),便于监听和响应交互状态变化。
  2. 支持通过 Unity Event 或脚本绑定自定义逻辑。

物理与运动控制

  1. 与 Unity 物理引擎深度集成,支持基于物理的抓取、投掷、碰撞反馈。
  2. 可配置物体的运动模式(如运动学抓取或物理模拟)。

可扩展性

  1. 作为基类,派生出多种专用交互组件(如 XR Grab InteractableXR Simple Interactable)。
  2. 允许通过继承和重写方法实现自定义交互逻辑。

3、组件配置详解

在 Inspector 面板中,XR Interactable 的关键属性如下:

1. 基础配置

Interaction Manager
  • 绑定的交互管理器(默认为场景中的 XR Interaction Manager)。
Interaction Layer Mask
  • 指定可与此物体交互的层级,过滤无关的交互器。
Colliders
  • 手动指定用于检测交互的碰撞体列表(默认自动获取物体及其子物体的所有碰撞体)。

2. 交互行为配置

Interactable Events
  • OnFirstHoverEntered:首次悬停时触发。
  • OnLastHoverExited:最后一个悬停离开时触发。
  • OnSelectEntered / OnSelectExited:选中开始/结束。
  • OnActivate / OnDeactivate:激活/取消激活(如按下扳机键)。
Filters
  • Hover Filters / Select Filters :通过脚本接口(IXRHoverFilterIXRSelectFilter)过滤交互器。
  • 示例:仅允许带有特定标签的交互器悬停或选中物体。

3. 高级配置

Allow Multiple Selection
  • 是否允许多个交互器同时选中该物体(如双手抓取)。
Custom Reticle
  • 自定义悬停或选中时显示的光标预制体(如高亮图标)。

4、事件系统与脚本交互

XR Interactable 提供的事件可通过 Inspector 面板直接绑定脚本动态监听。以下是典型用法:

1. 通过 Unity Event 绑定

  • 在 Inspector 面板中,将事件(如 OnSelectEntered)拖拽到目标脚本方法。
    示例:抓取物体时播放音效。

2. 通过脚本监听事件

cs 复制代码
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class InteractableDemo : MonoBehaviour
{
    private XRBaseInteractable interactable;

    void Start()
    {
        interactable = GetComponent<XRBaseInteractable>();
        interactable.onSelectEntered.AddListener(OnGrabbed);
        interactable.onHoverEntered.AddListener(OnHoverStart);
    }

    private void OnGrabbed(XRBaseInteractor interactor)
    {
        Debug.Log($"{interactor.name} 抓取了 {interactable.name}");
    }

    private void OnHoverStart(XRBaseInteractor interactor)
    {
        GetComponent<Renderer>().material.color = Color.red;
    }
}

5、与其他组件的协作

与 XR Interactor 的交互

XR Interactor(如 XR Direct Interactor)检测到 XR Interactable 后,触发其事件。

  • 例如:当手柄靠近物体时,XR InteractableOnHoverEntered 事件被触发。

与 XR Interaction Manager 的协同

XR Interaction Manager 管理所有交互器和可交互对象的注册与事件分发。

  • 例如:当一个交互器选中物体时,管理器确保冲突的正确处理。

与物理系统的集成

若物体需要物理反馈(如投掷),需附加 Rigidbody 组件,并配置 XR Grab Interactable 的运动模式:

  • Kinematic:直接控制物体位置(无物理模拟)。
  • Velocity Tracking:通过力或速度驱动物体(模拟物理抓取)。

6、实际应用场景

场景1:基础抓取与释放

  1. 为物体添加 XR Grab Interactable(继承自 XR Interactable)。
  2. 配置 OnSelectEntered 事件:抓取时缩小物体。
  3. 配置 OnSelectExited 事件:释放时恢复原大小并施加投掷力。

场景2:悬停高亮与提示

  1. 监听 OnHoverEntered 事件:悬停时显示发光材质。
  2. 监听 OnHoverExited 事件:隐藏发光效果。

场景3:条件过滤交互

  1. 创建自定义 IXRSelectFilter 脚本:仅允许带有 "Key" 标签的交互器抓取物体。
  2. 将过滤器添加到 XR InteractableSelect Filters 列表。

7、子类与扩展

XR Interactable 作为基类,派生出多种专用交互组件:

XR Grab Interactable

  1. 扩展抓取功能,支持 运动学抓取物理抓取
  2. 可配置抓取附着力、投掷速度比例。

XR Simple Interactable

  1. 轻量级交互,仅响应悬停和基础选中事件(无物理抓取)。
  2. 适用于按钮、开关等简单交互。

8、优化与调试技巧

性能优化

  1. 减少 XR Interactable 对象的碰撞体复杂度(使用简单形状碰撞体)。
  2. 通过 Interaction Layer Mask 过滤不必要的交互检测。

调试工具

  1. 启用 XR Interactable 的调试模式(Gizmos),可视化交互范围。
  2. 使用 Debug.Log 输出交互事件参数:
cs 复制代码
interactable.onSelectEntered.AddListener((interactor) => 
    Debug.Log($"选中者:{interactor.name}, 物体:{interactable.name}"));

输入防抖

  1. 为悬停事件添加延迟触发(通过脚本控制),避免快速移动时的误触。

9、常见问题与解决

问题:物体无法被交互

检查步骤

  1. 确认物体附加了 XR Interactable 或其子类组件。
  2. 检查 Interaction Layer Mask 是否允许当前交互器的层级。
  3. 验证碰撞体是否正确设置(非Trigger类型)。

问题:抓取后物体位置偏移

解决

  1. 调整 XR Grab InteractableAttach Transform 位置。
  2. 检查物体的 Rigidbody 是否被其他力干扰。

问题:事件未触发

排查方向

  1. 确保事件回调方法为 public 或在脚本中动态注册。
  2. 检查交互器与可交互对象的 Interaction Manager 是否一致。
相关推荐
ZKY_248 小时前
【Unity】处理文字显示不全的问题
unity·游戏引擎
快乐非自愿20 小时前
Netty源码—10.Netty工具之时间轮
java·unity·.net
虾球xz21 小时前
游戏引擎学习第195天
c++·学习·游戏引擎
hvinsion1 天前
Unity启动画面去除教程:如何去除Unity的Splash Screen和水印
unity·游戏引擎
虾球xz1 天前
游戏引擎学习第193天
c++·学习·游戏引擎
虾球xz1 天前
游戏引擎学习第196天
c++·学习·游戏引擎
枫景Maple2 天前
简单了解一下Unity的MaterialPropertyBlock
unity·游戏引擎
wkm9562 天前
Unity程序嵌入Qt后点击UI按钮Button没有反应
qt·ui·unity
虾球xz2 天前
游戏引擎学习第189天
学习·信息可视化·游戏引擎
启诚科技2 天前
虚拟现实--->unity学习
学习·unity