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

news2025/4/9 21:24:21

目录

一、插件介绍

二、主要组件

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、核心功能与特点

优先级与冲突管理

  1. 定义组内交互器的 执行顺序,当多个交互器同时检测到可交互对象时,按优先级选择激活的交互器。
  2. 自动解决交互冲突(例如,双手同时抓取同一物体时,优先响应先触发的交互器)。

动态交互切换

  1. 根据上下文自动切换激活的交互器(如近距离时使用直接抓取,远距离时切换为射线交互)。
  2. 支持手动锁定或释放交互器的控制权。

协作式交互

  1. 允许多个交互器协同操作同一对象(如双手调整物体位置和旋转)。
  2. 支持组内交互器的 状态同步(例如,一个交互器激活时,其他交互器临时禁用)。

事件统一管理

  1. 提供组级别的交互事件(如 OnGroupInteractionStarted),简化多交互器的逻辑处理。

3、组件配置详解

属性描述
Interaction Manager该交互组(Interaction Group)将通信的XR交互管理器(XRInteractionManager)。若未指定,系统会自动查找一个可用实例。
Starting Group Members在Awake阶段注册到该组的交互器(Interactors)或交互组(Interaction Groups)的有序列表。该顺序决定了成员间的优先级关系。
Interaction Override Configuration为每个组成员配置其他成员是否能够覆盖其交互行为。当高优先级成员尝试选择低优先级成员已悬停或选中的交互对象时,通过勾选框指定列对应的成员能否覆盖行对应的成员。例如:若第2列勾选第1行,则成员2可覆盖成员1的交互。

4、工作原理

初始化阶段

  1. 将组内交互器按配置的优先级排序,并注册到 XR Interaction Manager

每帧检测阶段

  1. 组内交互器按优先级顺序检测可交互对象。
  2. 根据 Execution Strategy 决定是否允许多个交互器同时激活。

冲突裁决阶段

  1. 若多个交互器检测到同一对象,选择优先级最高的交互器执行操作。
  2. 若高优先级交互器失败(如抓取条件不满足),按规则传递控制权。

交互执行阶段

  1. 激活的交互器触发事件,控制对象行为(如抓取、释放)。
  2. 协作模式下,多个交互器共同影响同一对象的运动(如双手缩放)。

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:双手协同操作

  1. 创建两个 XR Direct Interactor(左右手),加入同一 XR Interaction Group
  2. 设置 Execution Strategy 为 All,允许双手同时抓取物体。
  3. 监听物体的 OnSelectEntered 事件,当双手同时抓取时,启用物理关节约束,实现双手调整物体位姿。

场景2:动态交互模式切换

  1. 组内包含 XR Direct Interactor 和 XR Ray Interactor
  2. 配置优先级顺序为直接交互优先,射线交互次之。
  3. 当用户远离物体时,直接交互器失效,自动切换至射线交互。

场景3:多人协作交互

  1. 为每个玩家分配独立的 XR Interaction Group
  2. 使用 Allow Failed Interactions 确保当一个玩家释放物体后,其他玩家可接管。
  3. 通过组事件同步多人操作状态(如共同搬运大型物体)。

7、高级用法与优化

自定义冲突裁决逻辑

  1. 继承 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;
    }
}

混合交互策略

  1. 组合使用 Execution Strategy 和脚本逻辑,实现分阶段协作(如左手定位、右手微调)。

性能优化

  1. 限制组内交互器数量,避免过多检测计算。
  2. 为低频交互器设置 Allow Failed Interactions 为 false,减少无效检测。

8、常见问题与解决

问题:组内交互器无法同时激活

检查:确认 Execution Strategy 设置为 All,且目标物体支持多交互器协作(如 XR Grab Interactable 的 Multiple Grab 模式)。

问题:优先级切换不生效

解决:确保通过 MoveInteractorToFront() 动态调整顺序后,调用 XRInteractionManager.ProcessInteractors() 强制刷新。

问题:组事件未触发

排查:验证交互器是否正确注册到组内,且事件回调未被其他逻辑覆盖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2025.2.25更新】wordpress免费AI插件,文章内容、图片自动生成、视频自动生成、网站AI客服、批量采集文章,内置deepseek联网满血版

wordpress免费AI插件&#xff0c;文章内容、文章图片、长尾关键词、视频自动生成、网站AI客服、批量采集文章&#xff0c;插件已接入腾讯云大模型知识引擎xDeepSeek&#xff0c;基于腾讯云大模型知识引擎xDeepSeek可联网满血版&#xff0c;插件可实现文章生成、长尾关键词生成、…

ISIS(中间系统到中间系统)——基础

ISIS是一项通用的动态路由协议&#xff0c;其隶属于链路状态路由协议&#xff0c;最初运行与OSI七层的网络层&#xff0c;采用组播地址224.0.0.14和224.0.0.15两个组波段&#xff0c;由于其较高的拓展性与高速收敛&#xff0c;被大多数运营商网络所使用 起源 ISIS最初是由国际…

DeepSeek 开源狂欢周(二)DeepEP深度技术解析 | 解锁 MoE 模型并行加速

在大模型时代&#xff0c;Mixture-of-Experts (MoE) 模型凭借其强大的容量和高效的计算能力&#xff0c;成为研究和应用的热点。然而&#xff0c;MoE 模型的训练和推理面临着巨大的专家并行通信挑战。近日&#xff0c;DeepSeek 开源了 DeepEP 项目&#xff0c;为解决这一难题提…

Linux网络之传输层协议(UDP,TCP协议)

目录 重新认识端口号 端口号划分 netstat pidof UDP协议 UDP的特点 面向数据报 UDP的缓冲区 全双工和半双工 TCP协议 TCP的特点 TCP报头分析 源端口&#xff0c;目标端口&#xff0c;数据偏移(报文首部长度) 序号 确认号 窗口 6个标志位 ACK SYN …

HTML第二节

一.列表 1.列表的简介 2.无序列表 注&#xff1a;1.ul里面只能放li&#xff0c;不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注&#xff1a;要实现上图的效果需要CSS 二.表格 1.表格介绍 注&#xff1a;1.th有额外的效果&#xff0c;可以…

坐标变换及视图变换和透视变换(相机透视模型)

文章目录 2D transformationScaleReflectionShear&#xff08;切变&#xff09;Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标&#xff08;Homogenous Coordinates&#xff09;3D transformationScale&TranslationRotation Viewing / Camera t…

Vue 表单优化:下拉框值改变前的确认提示与还原逻辑实现

在开发表单类功能时&#xff0c;我们经常需要对用户的重要操作进行确认提示&#xff0c;以避免误操作导致的数据丢失或错误。本文将通过一个实际案例&#xff0c;介绍如何在 Vue 中实现下拉框值改变前的确认提示&#xff0c;并在用户取消操作时还原原始值。 场景描述 在项目中…

使用mermaid查看cursor程序生成的流程图

一、得到cursor生成的流程图文本 cursor写的程序正常运行后&#xff0c;在对话框输入框中输入诸如“请生成扫雷的代码流程图”&#xff0c;然后cursor就把流程图给生成了&#xff0c;但是看到的还是文本的样子&#xff0c;保留这部分内容待用 二、注册一个Mermaid绘图账号 …

(八)趣学设计模式 之 装饰器模式!

目录 一、 啥是装饰器模式&#xff1f;二、 为什么要用装饰器模式&#xff1f;三、 装饰器模式的实现方式四、 装饰器模式的优缺点五、 装饰器模式的应用场景六、 装饰器模式 vs 代理模式七、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢…

JVM线程分析详解

java线程状态&#xff1a; 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

毕业项目推荐:基于yolov8/yolo11的野生菌菇检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

DeepSeek 助力 Vue3 开发:打造丝滑的页眉(Header)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

PHP应用程序设计:一个实际的例子(3)

使应用程序适用于网络 如果你正好计划用P H P开发你自己的服务程序&#xff08;或者其他一些相似的东西&#xff09;&#xff0c;请重新思考一下。你可能已经对这些思想有些迷惑了&#xff1a;实现一个聊天服务程序意味着实现一个网络服务程序。这是我们实际上介绍给大家的东西…

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途&#xff1a;不同进程Process/线程T…

OpenCV给图像添加噪声

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果你已经有了一张干净的图像&#xff0c;并希望通过编程方式向其添加噪声&#xff0c;可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…

Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名

作者&#xff1a;来自 Elastic Toms Mura 将阿里云 AI 服务功能与 Elastic 结合使用。 更多阅读&#xff0c;请参阅 “Elasticsearch&#xff1a;使用阿里 infererence API 及 semantic text 进行向量搜索”。 在本文中&#xff0c;我们将介绍如何将阿里云 AI 功能与 Elastics…

管理后台环境配置

后端配置及启动 a. 软件安装 1. Java sdk 1.8 2. maven 3.6 3. intellij IDEA 2024 4. Visual C Redistributable 5. mongodb 7.0 6. mysql 8.0 双击安装&#xff1a;mysql-installer-community-8.0.41.0.msi 版本选择&#xff1a;Full&#xff0c;包括服务器和客户端 …

数字IC低功耗后端设计实现之power gating和isolation技术

考虑低功耗设计需求&#xff0c;下图中间那个功能模块是需要做power domain的&#xff0c;即这个模块需要插MTCMOS。需要开启时&#xff0c;外面的VDD会和这个模块的LOCAL VDD形成通路&#xff0c;否则就是断开即power off状态。 这些低功耗设计实现经验&#xff0c;你真的懂了…

【网络编程】几个常用命令:ping / netstat / xargs / pidof / watch

ping&#xff1a;检测网络联通 1. ping 的基本功能2. ping 的工作原理3. ping 的常见用法4. ping 的输出解释5. ping 的应用场景6. 注意事项 netstat&#xff1a;查看网络状态 1. netstat 的基本功能2. 常见用法3. 示例4. 输出字段解释5. netstat 的替代工具6. 注意事项 xargs&…

sqlilab 46 关(布尔、时间盲注)

sqlilabs 46关&#xff08;布尔、时间盲注&#xff09; 46关有变化了&#xff0c;需要我们输入sort&#xff0c;那我们就从sort1开始 递增测试&#xff1a; 发现测试到sort4就出现报错&#xff1a; 我们查看源码&#xff1a; 从图中可看出&#xff1a;用户输入的sort值被用于查…