Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)
目录
一、插件介绍
二、主要组件
XR Interaction Manager
XR Controller
XR Interactor
XR Direct Interactor
XR Ray Interactor
XR Socket Interactor
XR Gaze Interactor
三、XR Interaction Group
1、组件介绍
2、核心功能与特点
优先级与冲突管理
动态交互切换
协作式交互
事件统一管理
3、组件配置详解
4、工作原理
初始化阶段
每帧检测阶段
冲突裁决阶段
交互执行阶段
5、事件系统与脚本交互
示例脚本:动态切换交互器焦点
6、实际应用场景
场景1:双手协同操作
场景2:动态交互模式切换
场景3:多人协作交互
7、高级用法与优化
自定义冲突裁决逻辑
混合交互策略
性能优化
8、常见问题与解决
问题:组内交互器无法同时激活
问题:优先级切换不生效
问题:组事件未触发
一、插件介绍
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
1、组件介绍
Unity XR Interaction Group 是 XR Interaction Toolkit 中用于管理 多个交互器(Interactor)协同工作 的核心组件,旨在解决多交互器场景下的优先级冲突和协作问题。它通过定义组内交互器的执行顺序和协作规则,确保复杂的交互行为(如双手操作、多模式切换)能够有序进行,提升交互的自然性和可控性。
交互组(Interaction Group)是交互器(Interactors)的中介协调者。一个组包含多个按优先级排序的成员交互器,且同一时间仅允许组内一个交互器进行交互(悬停或选择)。交互组优先遵循持续选择原则——若某个成员交互器在前一帧已处于交互状态,且在当前帧能开始或继续选择,则该交互器将被选中进行交互,即使有更高优先级的交互器尝试介入。
您可为每个成员配置交互覆盖规则。具有覆盖权限的组成员可忽略优先级,并阻断当前活跃成员的交互(前提是它能选择活跃成员正在交互的所有可交互对象)。当这种情况发生时,覆盖成员将被选为唯一的交互执行者。若多个成员同时尝试覆盖,优先级规则仍然生效。例如,您可能希望通常让"点击交互"(Poke)保持优先,使"直接悬停"(Direct hover)不会阻碍它,但仍需允许用户抓取(Direct select)正在被点击的可交互对象。
交互组的成员排序列表也可包含其他交互组。当父级组进行交互优先级排序时,嵌套的子组会被视为单个交互器。组内选中的交互器会向上冒泡传递至父级组,直至最终被顶级组选中进行交互,或像其他交互器一样被跳过。
需注意:在交互组调用Awake方法后,其初始成员配置(Starting Group Members)及覆盖规则在运行模式(Play Mode)中将无法被修改。

2、核心功能与特点
优先级与冲突管理
- 定义组内交互器的 执行顺序,当多个交互器同时检测到可交互对象时,按优先级选择激活的交互器。
- 自动解决交互冲突(例如,双手同时抓取同一物体时,优先响应先触发的交互器)。
动态交互切换
- 根据上下文自动切换激活的交互器(如近距离时使用直接抓取,远距离时切换为射线交互)。
- 支持手动锁定或释放交互器的控制权。
协作式交互
- 允许多个交互器协同操作同一对象(如双手调整物体位置和旋转)。
- 支持组内交互器的 状态同步(例如,一个交互器激活时,其他交互器临时禁用)。
事件统一管理
- 提供组级别的交互事件(如
OnGroupInteractionStarted),简化多交互器的逻辑处理。
3、组件配置详解
| 属性 | 描述 |
|---|---|
| Interaction Manager | 该交互组(Interaction Group)将通信的XR交互管理器(XRInteractionManager)。若未指定,系统会自动查找一个可用实例。 |
| Starting Group Members | 在Awake阶段注册到该组的交互器(Interactors)或交互组(Interaction Groups)的有序列表。该顺序决定了成员间的优先级关系。 |
| Interaction Override Configuration | 为每个组成员配置其他成员是否能够覆盖其交互行为。当高优先级成员尝试选择低优先级成员已悬停或选中的交互对象时,通过勾选框指定列对应的成员能否覆盖行对应的成员。例如:若第2列勾选第1行,则成员2可覆盖成员1的交互。 |
4、工作原理
初始化阶段
- 将组内交互器按配置的优先级排序,并注册到
XR Interaction Manager。
每帧检测阶段
- 组内交互器按优先级顺序检测可交互对象。
- 根据
Execution Strategy决定是否允许多个交互器同时激活。
冲突裁决阶段
- 若多个交互器检测到同一对象,选择优先级最高的交互器执行操作。
- 若高优先级交互器失败(如抓取条件不满足),按规则传递控制权。
交互执行阶段
- 激活的交互器触发事件,控制对象行为(如抓取、释放)。
- 协作模式下,多个交互器共同影响同一对象的运动(如双手缩放)。
5、事件系统与脚本交互
XR Interaction Group 提供以下关键事件:
| 事件 | 触发时机 | 典型应用 |
|---|---|---|
OnGroupInteractionStarted | 组内任一交互器开始交互时 | 播放全局音效、记录操作日志 |
OnGroupInteractionEnded | 组内任一交互器结束交互时 | 重置状态、触发后续逻辑 |
OnActiveInteractorChanged | 激活的交互器切换时 | 更新UI提示、切换交互模式动画 |
示例脚本:动态切换交互器焦点
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;public class InteractionSwitcher : MonoBehaviour
{public XRInteractionGroup interactionGroup;public XRBaseInteractor dominantHand;void Update(){// 当右手举起时,强制切换为右手交互器优先if (IsRightHandRaised()){interactionGroup.MoveInteractorToFront(dominantHand);}}private bool IsRightHandRaised(){// 根据设备输入或姿态判断逻辑return false;}
}
6、实际应用场景
场景1:双手协同操作
- 创建两个
XR Direct Interactor(左右手),加入同一XR Interaction Group。 - 设置
Execution Strategy为All,允许双手同时抓取物体。 - 监听物体的
OnSelectEntered事件,当双手同时抓取时,启用物理关节约束,实现双手调整物体位姿。
场景2:动态交互模式切换
- 组内包含
XR Direct Interactor和XR Ray Interactor。 - 配置优先级顺序为直接交互优先,射线交互次之。
- 当用户远离物体时,直接交互器失效,自动切换至射线交互。
场景3:多人协作交互
- 为每个玩家分配独立的
XR Interaction Group。 - 使用
Allow Failed Interactions确保当一个玩家释放物体后,其他玩家可接管。 - 通过组事件同步多人操作状态(如共同搬运大型物体)。
7、高级用法与优化
自定义冲突裁决逻辑
- 继承
XRInteractionGroup,重写SelectInteraction方法,实现基于距离、角度等条件的优先级计算:
public class CustomInteractionGroup : XRInteractionGroup
{protected override bool SelectInteraction(List<XRBaseInteractor> validTargets){// 示例:选择距离最近的交互器XRBaseInteractor closestInteractor = null;float minDistance = float.MaxValue;foreach (var interactor in validTargets){float distance = Vector3.Distance(interactor.attachTransform.position, focusPoint);if (distance < minDistance){minDistance = distance;closestInteractor = interactor;}}return closestInteractor;}
}
混合交互策略
- 组合使用
Execution Strategy和脚本逻辑,实现分阶段协作(如左手定位、右手微调)。
性能优化
- 限制组内交互器数量,避免过多检测计算。
- 为低频交互器设置
Allow Failed Interactions为false,减少无效检测。
8、常见问题与解决
问题:组内交互器无法同时激活
检查:确认 Execution Strategy 设置为 All,且目标物体支持多交互器协作(如 XR Grab Interactable 的 Multiple Grab 模式)。
问题:优先级切换不生效
解决:确保通过 MoveInteractorToFront() 动态调整顺序后,调用 XRInteractionManager.ProcessInteractors() 强制刷新。
问题:组事件未触发
排查:验证交互器是否正确注册到组内,且事件回调未被其他逻辑覆盖。
相关文章:
Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)
目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor 三、XR Interaction Group 1、组件介绍 2、核心功能与特点 优先级与冲突管理 动态交互切…...
深入理解 并查集LRUCaChe
并查集&LRUCaChe 个人主页:顾漂亮 文章专栏:Java数据结构 1.并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后根据一定规律将归于同一组元素的…...
详解 c++ 中的 namespage
C 中的命名空间很特别,其他编程语言基本都没有。命名空间介于函数与类之间,兼顾了二者的一些优点。这篇博客根据 chatgpt 的回答整理。 文章目录 **1. 什么是 namespace(命名空间)?****2. 语法****3. 使用 namespace 访…...
50周学习go语言:第五周 复合类型与词频统计
以下是第五周复合类型(数组、切片与映射)的详细学习内容,按照第四周的深度要求设计: 第五周:复合类型与词频统计 一、复合类型详解 1. 数组(Array) // 声明与初始化 var arr1 [3]int …...
HTTP非流式请求 vs HTTP流式请求
文章目录 HTTP 非流式请求 vs 流式请求一、核心区别 服务端代码示例(Node.js/Express)非流式请求处理流式请求处理 客户端请求示例非流式请求(浏览器fetch)流式请求处理(浏览器fetch) Python客户端示例&…...
深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全
在当今医疗科技飞速发展的时代,医疗设备的电磁兼容性(EMC)已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性,更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…...
详解:事务注解 @Transactional
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! Transactional 是 Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使…...
【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)
今天是2025年2月24日,画的是fate/Grand Order里面的阿尔托莉雅.卡斯特,武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…...
在Linux桌面上创建Idea启动快捷方式
1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…...
渗透测试(WAF过滤information_schema库的绕过,sqllib-46关,海洋cms9版本的注入)
1.sqlin-lib 46关 打开网站配置文件发现 此网站的对ID进行了排序,我们可以知道,order by接不了union ,那我们可以通过测试sort,rond等函数,观察网页的反馈来判断我们的盲注是否正确 我们发现 当参数有sort来排序时&…...
Unity基础——资源导出分享为Unity Package
一.选中要打包的文件夹,右击,点击Exporting package 二.勾选 Include Dependencies,点击Export Include Dependencies:代表是否包含资源依赖的选项 三.选择保存的位置,即可生成Unity package 最终形成文件:…...
C语言【指针篇】(三)
C语言【指针篇】(三) 前言正文1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 总结 前言 本文主要基于前面对指针的掌握,进一步学习:数组名的理解、使用指针…...
DevSecOps普及:安全与开发运维的深度融合
一、引言 随着软件开发模式的演进,DevOps已成为现代软件工程的主流实践。然而,在传统的DevOps流程中,安全往往被视为开发和运维之外的额外环节,导致安全漏洞在产品交付后才被发现,增加了修复成本和风险。为了解决这一…...
【JAVA-数据结构】Map和Set
上一篇我们聊到了排序相关内容,这一篇我们对Map和Set进行一系列说明,大家自取。 1.搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节…...
从 0 到 1,用 Python 构建超实用 Web 实时聊天应用
从 0 到 1,用 Python 构建超实用 Web 实时聊天应用 本文深入剖析如何运用 Python 的 Flask 框架与 SocketIO 扩展,搭建一个功能完备的 Web 实时聊天应用。从环境搭建、前后端代码实现,到最终运行展示,逐步拆解关键步骤࿰…...
轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置
一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时,合理的环境管理是必不可少的,特别是当你在多个项目中…...
【新人系列】Python 入门专栏合集
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...
linux ununtu安装mysql 怎么在my.cnf文件里临时配置 无密码登录
在 Ubuntu 中,若需通过修改 my.cnf 临时禁用 MySQL 的密码验证(例如忘记 root 密码需要重置),可以通过添加 skip-grant-tables 选项实现。以下是具体步骤: 步骤 1:编辑 MySQL 配置文件 1. 打开 MySQL 配置…...
git,bash - 从一个远端git库只下载一个文件的方法
文章目录 git,bash - 从一个远端git库只下载一个文件的方法概述笔记写一个bash脚本来自动下载get_github_raw_file_from_url.shreanme_file.shfind_key_value.sh执行命令 END git,bash - 从一个远端git库只下载一个文件的方法 概述 github上有很多大佬上传了电子书库…...
python生成的exe文件防止反编译(pyinstaller加密)
python生成的exe文件可以轻松的被破解,为了防止反编译,知乎友友们给出了很多不同的见解,其中主流的回答是pyinstaller加密和niutka打包python,本篇介绍的方法是第一种,pyinstaller打包的时候进行加密,防破解…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
