草庐IT

Unity XR Interaction Toolkit(二)手柄交互

朽石Biubiubiu 2023-08-26 原文

目录

一、结构配置

二、交互事件

1、事件设置

2、绑定设置

3、组合按键输入

4、事件挂载

三、代码响应

1、事件回调

2、数值获取


注意,本文的Toolkit版本在2.2以上,低版本没有样例和部分api,更新方法在第一张环境配置内

打开Package Manager,在右侧面板中点开Sample列表,导入Starter Assets。

一、结构配置

Starter Assets->Prefabs->Complete XR Origin Set Up

这是一个官方案例给出了完整的交互预制件,集拾取,交互,传送等功能

(没找到的话一定是未来版本删除了这个东西,肯定会有替代品,问题不大)

Input Action Manager:输入管理

InteractionManager:抓取交互管理

EventSystem:UI交互管理

XR Origin

->XR Origin

->Sanp Turn Provider (Action-based):快速转身功能

->Locomotion System:移动传送管理

->Teleportation Provider:传送功能

->Continuous Turn Provider:连续转身功能

->Dynamic Move Provider:持续移动功能

->Two-Handed Grab Move Provider:双手移动旋转功能

Left Hand

->Action Based Controller Manager:碰撞抓取、射线抓取与射线传送之间的切换管理

->XR Controller (Action-based):同步手柄控制器的位移和角度,绑定响应控制器的事件

Direct Interactor:碰撞抓取

Ray Interactor:射线抓取

->XR Ray Interactor:射线交互器

->Line Renderer:绘制射线组件

->XR Interactor Line Visual:射线组件设置组件,会覆盖Line Renderer参数

->Sorting Group:排序组

Teleport Interactor:射线传送交互器

->XR Ray Interactor:射线交互器,在这里可以设置射线的样式

->Line Renderer:绘制射线组件

->XR Interactor Line Visual:射线组件设置组件,会覆盖Line Renderer参数

->Sorting Group:排序组

->XR Controller (Action-bassed):响应传送开始事件,只绑定Select Action和Select Action Value即可

二、交互事件

Starter Assets->XRI Default Input Actions

官方给出的默认XR输入事件

Toolkit的输入事件由Input System负责,更改手柄按键全在这里修改

这是一个新版的输入系统,可以通过配置文件(右键->Create->Input Actions),组合按键输入事件,响应这个事件可以完成逻辑编辑

优点在于可以统一更改输入事件,比如抓取功能想从侧键改为扳机键,只需要改配置文件就可以,不用在代码中一个挨着一个的更改

如上图所示

  • 最左面黄色标头的是事件类别,拿出XRI LeftHand Interaction来说,子项都是交互的事件,XRI LeftHand Locomotion都是移动传送事件
  • 中间的绿色标头都是相应的事件,一个事件可以绑定多个输入,比如抓取事件Select,侧键可以绑定,扳机键也可以绑定,图中的抓取事件绑定了一个trigger(扳机键)和一个空输入
  • 右侧是事件的响应方式,图中是一个Button类型的Antion Type,触发时会响应一次并且无参数

1、事件设置

开发过程中,有各种各样的需求,Input System都可以实现,首先,我们需要设定好要添加的事件

Action Type

Add Binding:是单一值,简单又单纯

Add Positive\Negative Binding:一个正负值,类似于轴

Add Binding With One Modifier:一个组合按键,两个按键联按,手柄上摇杆前推并按下可以这么实现。其中Binding是主要值,Modifier只起到修饰作用

Add Binding With Two Modifier:两个组合按键,可以三键联按

一个Action有三种类型

Value:可以输入参数值,比如扳机键按下的力度,连续输入,需要区分值类型,有数字,向量,Pose等

Button:触发一次的函数,无参

PassThrough:和Value 一样,Value只会响应一个设备,而这会响应所有设备(类似于鼠标和手柄)

Ineractions

选完类型Type后,下方的Ineractions,它可以给输入添加条件(长按、双击等),图中添加一个Hold条件

Processors

值处理,可以反转值,限制值等

2、绑定设置

注意:Action Type不同,绑定的Path也不同,一个2d向量的绑定不能响应Button类型

这里设置绑定选项了,图中是一个2d的向量轴,意思是传送射线激活(Teleport Select)会通过一个2d向量(Primary2DAxis)设置

左手手柄只能设置左值,图中是[LeftHand XR Controller]

点击右侧的Path,来设置响应这个事件的路径

这里有很多选项,新手并不好选,因为部分值看起来很多很杂乱,这里有一个可以debug当前设备输入的工具,可以根据数值变化绑定路径Window->Analysis->XR Interaction Debugger,需要勾选Input Devices选项,同时这里也可以查看正在交互的物体和交互器

3、组合按键输入

上文说过了组合按键,这回来实际应用一下,我的设备是HTC Vive,手柄不是摇杆而是追踪板,当想要实现追踪板按下前端传送的时候,就需要组合输入了

首先这是一个Value类型事件,值类型为二位向量

添加一个修饰,需求是追踪板前端,这个输入就需要判定扇形区域(Sector)为North前端

组合按键是trackpadclicked,这样一个手柄事件就完成了

4、事件挂载

官方案例中给出的预制件已经挂载好了事件,如果想要把刚才做好的事件替换掉,只需要根据名字挨个替换就好了

三、代码响应

1、事件回调

两种回调函数方式,分别为:

// 被动获取值,事件响应

// 
[SerializeField]
InputActionReference m_InputActionReference;

void Start(){
    InputAction inputAction = m_InputActionReference.action;
    inputAction.performed += Callback;
}

void Callback(InputAction.CallbackContext obj){
    var value = obj.ReadValue<int>();
}



// 
[SerializeField]
InputActionProperty m_InputActionProerty;

void Start(){
    InputAction inputAction = m_InputActionProerty.action;
    inputAction.performed += Callback;
}

void Callback(InputAction.CallbackContext obj){
    var value = obj.ReadValue<int>();
}

2、数值获取

// 在Update中主动获取值
void Update(){
    InputAction action = m_InputActionProperty.action;
    float value = action.ReadValue<Vector2>();
}

有关Unity XR Interaction Toolkit(二)手柄交互的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  2. ruby - 如何与 Ruby 中的 Perl 程序交互? - 2

    据我了解,在Ruby和Perl之间没有“桥梁”可以让您直接从Ruby调用Perl函数。据我了解,要从Ruby调用Perl程序,只需将其放在反引号中(即result=`./helloWorld.pl`)。但是,这不允许与Perl程序交互(即您不能与提示交互或提供输入)。我的问题如下:有没有什么方法可以从Ruby向Perl程序提供输入(除了参数)?Ruby和Perl之间没有桥梁,我错了吗?在导航提示时与程序的标准输入交互似乎是错误的方式,我正在处理的程序设计良好,并且具有包含适当Perl函数的库。 最佳答案 有Inline::Ruby模

  3. ruby - IRb:如何使用预加载类启动交互式 ruby​​ session - 2

    在我采用Ruby语言的过程中,我花了很多时间在IRb中。太棒了!但是,由于我不是很清楚它的功能,并且对Ruby仍然是个“笨蛋”,所以我想知道以下内容:如何在不重新启动IRb的情况下“刷新”session(或者这是不可能的)。如何配置IRb加载一堆源文件“hello.rb”和“hello_objects.rb”,即在启动时?我在这些方面投入了大量工作,如果知道加载这些类的速记,而无需再次为每个类手动键入“加载”,那就太好了。 最佳答案 我不确定是否可以“刷新”session。但是,您可以像这样加载您的类:irb-r'hello.rb'

  4. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

  5. BigData/Cloud Computing:基于阿里云技术产品的人工智能与大数据/云计算/分布式引擎的综合应用案例目录来理解技术交互流程 - 2

    BigData/CloudComputing:基于阿里云技术产品的人工智能与大数据/云计算/分布式引擎的综合应用案例目录来理解技术交互流程目录一、云计算网站建设:部署与发布网站建设:简单动态网站搭建云服务器管理维护云数据库管理与数据迁移云存储:对象存储管理与安全超大流量网站的负载均衡二、大数据MOOC网站日志分析搭建企业级数据分析平台基于LBS的热点店铺搜索基于机器学习PAI实现精细化营销基于机器学习的客户流失预警分析使用DataV制作实时销售数据可视化大屏使用MaxCompute进行数据质量核查使用Quick BI制作图形化报表使用时间序列分解模型预测商品销量三、云安全云平台使用安全云上服务

  6. ruby-on-rails - 如何从 Ruby 与 CalDAV 服务器交互? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion我需要在Ruby(准确地说是Rails)应用程序中使用CalDAV在日历服务器上创建事件。我看过一些不同的图书馆并进行了一些谷歌搜索。我查看了ri-cal(http://ri-cal.rubyforge.org/rdoc/),但不确定它是否支持将数据发送到服务器,或者我是否必须自己这样做,这看起来很有希望http://www.local-guru.net/blog/p

  7. ruby - 在 ruby​​ 中运行系统命令并与之交互 - 2

    我需要在命令行上运行一个命令来请求用户响应。如果它有帮助,命令是:gpg--recipient"SomeName"--encrypt~/some_file.txt当你运行它时,它会发出警告然后询问:Usethiskeyanyway?(y/N)响应“y”让它正确完成。我一直在尝试使用open4gem但我无法让它正确指定“y”。这是我尝试过的:Open4::popen4(cmd)do|pid,stdin,stdout,stderr|stdin.puts"y"stdin.closeputs"pid:#{pid}"puts"stdout:#{stdout.read.strip}"puts"st

  8. ruby - 我将如何以编程方式与 VST(i) 插件交互以合成音频? - 2

    以VSTiTriforce为例,由Tweakbench提供。当加载到市场上的任何VST主机时,它允许主机向VSTi发送(大概是MIDI)信号。然后VSTi将处理该信号并输出​​由VSTi内的软件乐器创建的合成音频。例如,将A4(我相信是MIDI音符)发送到VSTi会导致它合成高于中央C的A。它将音频数据发送回VST主机,然后它可以在我的扬声器上播放或将其保存为.wav或其他一些音频文件格式。假设我有Triforce,我正在尝试用我选择的语言编写一个程序,它可以通过发送要合成的A4纸条与VSTi交互,并自动将其保存到系统上的文件?最终,我希望能够解析整个单轨MIDI文件(使用已经可用于此

  9. 基于C++实现一个支持简单交互绘图小程序 - 2

    资源下载地址:https://download.csdn.net/download/sheziqiong/86763967资源下载地址:https://download.csdn.net/download/sheziqiong/86763967基于C++实现一个支持简单交互绘图小程序一、概要设计1.1开发环境IDE:VisualStudio2019Commity运行环境:window10专业版配置要求:内存4g显卡无要求CPU无要求目的调试编译通过图形应用编码、熟悉flk1.2结构化模块设计图UML类图1.3主要模块功能接口描述Graph.cppvoidShape::add(Pointp)//

  10. 微信小程序开发之微信小程序交互 - 2

    目录一、小程序交互前端:1、先在登陆界面中编写代码2、在前端中编写js代码后端:     1、先导入依赖:     2、定义好配置文件     3、编写好实体类     4、将帮助类进行配置     5、编写mapper类     6、定义service层以及对应的实现接口层     7、最后定义controller层     8、进行测试​一、小程序交互步骤:前端:1、先在登陆界面中编写代码login.wxml:{true}}"bind:input="changeValue"maxlength="16"data-label="password"/>登录2、在前端中编写js代码import{r

随机推荐