HTC vive手柄维修 + Unity 如何判断按下手柄上的哪个按钮??

这是基于SteamVR基础之上的一款插件洅获得硬件设备上比之前单独使用steamVR方便很多。

比如之前我们获得硬件设备是这样的:首先写一个如下图的脚本,挂在CameraRig的手柄上(看需要那個手柄上的按键)


但是在这里,我们来介绍HTC.Unity.Plugin插件的用法

首先我们进行场景和环境的搭建

在脚本中我们需要引入相应的命名空间:Using HTC.UnityPlugin.Vive;然后峩们通过ViveInput类就可以调用之前我们的总总方法如图所示。


我们模拟扣动扳机键让obj进行两个position的位置的切换过程代码


下面我对于这个HTC.UnityPlugin插件的其他功能进行探索,我准备用两天时间写一篇比较系统的教程之前使用过VRTK,但是和HTC.UnityPlugin确实比VRTK在某些功能的实现上好用很多同时也会回顾┅下硬件设备的知识以及以前的一些关于编程代码方面的知识。

首先看一下手柄也就是我们进行交互的载体。

menu按键:默认用来打开游戏菜单

Grip按键:每个手柄上都有两个在侧面都是相同的,而且用的很少

Trigger按键:扳机键,我们用的最多经常用来实现抓取和配合UI进行选择功能,也可以有返回值

Pad按键:可以用来触摸(返回数值)、可用来点击。

每个按钮(哪怕是TouchPad)都有GetPress、GetPressDown、GetPressUp三种方法用HandRole枚举来确定左右手柄,用ControllerButton枚举来确定是哪个按钮GetPress是按住时一直返回true,如同我们的按键时一样的表示一直按住,返回的也是一个状态


其实,我们用手柄也就是为了触发一些跟手柄操作相关的事件。也就是通过回掉的方式进行实现


同时Trigger按钮除了可以触发按下和松开之外Trigger可以有返回值。其中Trigger的返回值是从0到1的改变当没有按动时其值表示0,当全部按下的时候其值表示1


同样的Pad除了可以按下触摸等行为触发事件外,还可以返回一些值



TouchPad有触摸和按下两组方法

Delta是最后一帧移动位置



当运行之后,手柄会发出射线当射线照射到按钮,就会出现一个黄色的球这時候按下Trigger就可以实现点击按钮的动作了。

当运行实现的功能:手柄射线照射到3D物体的时候可以通过Trigger按钮抓住物体并且拖动


然后给Cube添加Dragger组建,在添加Dragger组建的同时然后添加Rigidbody组建,根据实际需要看是否勾选重力

实现功能:当按下Pad键的时候,Player会被传送到抛物线和物体交汇处從而实现远距离移动。

然后新建一个空物体游戏对象命名为Ground,把一些可瞬移的区域或者物体拖入只要你想发生瞬移的物体都可以拖入,比如胶囊体正方体、Plane等都可以成为这样的瞬移区域。然后再给这些物体的父物体Ground添加Teleportable脚本组建


设置父物体Ground添加Teleportable脚本的属性,这些属性如果你按照上面的步骤来,当你添加脚本的时候就会自动设置好如图所示:


之后再VivePointers组建的EventRaycaster上添加脚本Projectile Generator,然后修改Velocity的数值就可以进行瞬移如上面的步骤中,我们不但添加了立方体等还添加了Plane,这样瞬移功能基本可以实现至于一些个性化的设置,需要诸多尝试和说奣我在这里就不再一一赘述。




就可以实现物体的抓取

  1. 创建一个碰撞体的数组保存 OverlapSpherer() 方法找到的所有碰撞体,查找的位置和 scale 是 snapColliderOrigin这是一个透明球体,如上图所示我们后面会添加它。
  2. 如果找到的碰撞体 tag 值等于 InteractionObject同时它又是自甴的,继续

新增方法,调用刚刚的这个方法:

  1. 当扳机被按住时同时有一个对象被抓住时,调用这个对象的 OnTriggerIsBeingPressed()
  2. 当扳机被松开,同时有一個对象被抓住时调用这个对象的 OnTriggerWasReleased() 方法,并停止交互

这些检查确保玩家的所有输入都能被传递到正在和他们交互的 InteractionObject 对象。

添加两个方法记录控制器的速度和角速度:

有时候需要隐藏手柄,以确保体验更加浸入式避免遮住视线。再添加两个方法:

这些方法简单地启用或禁用代表了控制器的 GameObject

  1. 这个方法造成了控制器中的压电线型驱动器(这个词不是我编造的)振动多次。它振动的时间越长震动感就越强烮。它的强度是 1-3999

保存脚本,回到编辑器为了让控制器按照我们的想法工作,还需要做一些调整

在结构视图中选中两个控制器。它们嘟是[ CameraRig ]的子对象

给它们各添加一个刚体。这允许它们使用固定连接并和其它物体进行交互。

反选 Use Gravity勾选 Is Kinematic。控制器不需要受物理的影响洇为在真实世界中,它们被你抓在手上

将 RWVR_Interaction 控制器组件提交给两个手柄。我们待会要配置它

选中球体,命名为 SnapOrigin按 F 键让它在场景视图中居中。你会在地板中央看到一个巨大的白色半球体

删除 Sphere Collider 组件,因为物理检查通过代码进行

最后一步是创建控制器,使用它们的模型和 SnapOrigin

现在来放松一下!打开手柄电源,运行这个场景

将手柄举到头盔前面,看看球体是否能够看见并和控制器粘在一起

测试完后,保存場景准备进入交互系统的使用!

你可能看到附近有这些东西:

你只能看着它们,但无法把它们拿起来你最好尽快解决这个问题,否则你怎么去读我们那本精彩的 Unity 教程呢:]

为了和这些刚体进行交互,你需要创建一个新的 RWVR_InteractionObject 子类用它来实现抓和扔的功能。

这样这个类就继承了 RWVR_InteractionObject后者提供了获得控制器输入的钩子,这样它就能对输入进行适当的处理

在类声明下面声明几个变量:

  1. 一个标志,用于表示控制器模型是否应该在该物体被拿起时隐藏
  2. 为了性能和简单起见,缓存了刚体组件

在变量声明之后添加方法:

  1. 保存刚体组件,以便后面使用

然后是一些助手方法,用于将对象用 FixedJoint 附着在手柄上或者从手柄上放开。

  1. 这个方法接收一个控制器作为参数然后创建一个 FixedJoint 组件添加到手柄上,配置这个连接使它不是那么容易掉,最后连接上当前的 InteractionObjecdt在连接上添加一个力是为了防止用户将对象移过其怹坚固的物体上,否则可能导致一些奇怪的物理问题
  2. 将参数指定的控制器的 FixedJoint 组件(如果有的话)断开。所连接的对象将被删除然后销毀 FixedJoint。

写完这些方法我们可以实现来自于基类的几个 OnTrigger 方法,以处理用户输入首先添加 OnTriggerWasPressed() 方法:

这个方法在玩家按下扳机抓住一个对象时添加 FixedJoint 连接。代码分为几个阶段:

这个方法移除参数指定的控制器的 FixedJoint将控制器的速度传递给刚体,以实现真实的抛掷效果代码解释如下:

  1. 調用基类方法解绑控制器。
  2. 将控制器的速度和角速度传递给对象的刚体这样当你放开对象时,对象会表现出真实的行为例如,如果你扔出一个球你会将手柄从后向前做一个抛物线动作。球应当获得旋转和向前的力就像是在真实世界中你将动能传递给它一样。

保存脚夲返回编辑器。

骰子和书在 Prefabs 文件夹中都有相应的预制件在项目视图中打开这个文件夹:

保存场景运行游戏。尝试拿起几本书或骰子扔到一边。

在下一节我将介绍另一种抓取对象的方法:吸附。

在手柄所在的位置和角度拿起东西是可以的但有时候将手柄吸附到物体的某个位置可能更有用。例如如果用户看到一只枪,当他们拿起枪时会希望枪被指向右边这就是 snapping (吸附)的意思。

  1. 一個标志表示手柄模型是否要在玩家抓住对象时隐藏。
  2. 当抓住对象时添加的位置该对象默认会用这个位置吸附到手柄上。
  3. 同上只是这個变量用于表示角度。
  4. 引用了对象的刚体组件

和 SimpleGrab 脚本一样,覆盖了基类的 Awake() 方法然后保存刚体组件。

接下来是几个助手方法这才算是這个脚本的肉戏。

这个方法和 SimpleGrab 脚本中的方法不同它不使用 FixedJoint 连接,而是将它自己作为控制器的子对象也就是说控制器和所吸附的对象是無法被外力所打断的。在这个教程中这种方式会很稳定,但在你自己的项目中你更应该采取 FixedJoint 连接

  1. 接收一个控制器参数,用于连接它
  2. 將对象的 parent 设置为该控制器。
  3. 让对象的方向和控制器保持一定的偏移
  4. 让对象的位置和控制器保持一定的偏移。
  5. 关闭重力否则它会从你的掱上掉落。
  6. 开启运动学特征当附着到手柄上后,这个对象不会受福利引擎的影响

现在来添加放开对象的方法:

这个方法简单地将对象從父对象中解除,重置刚体并应用控制器的速度详细解释一下:

  1. 方法参数指定要松开对象的控制器。
  2. 重新打开重力并再次使对象再次變成非运动学的。
  3. 应用控制器的速度给对象

覆盖如下方法以实现 snapping 操作:

  1. 将对象从控制器上放开。

保存脚本返回编辑器从 Prefabs 目录中将 RealArrow 预制件拖到结构视图。

在结构视图中将 RWVR_Snap To Controller 组件附加到箭支上,这样你就可以和它交互同时将它的 Hide Controller Model 设为 true。最后点击检视器窗口上方的 Apply 按钮将修改应用到该预制件。

对于这个对象不需要修改 offset,默认它的握持部位就可以了

保存并运行场景。抓住箭支然后扔出去。唤醒你内心野兽吧!

注意箭支握在手上的位置总是固定的,不管你如何拿起它

本教程的内容就到此为止了,试玩一下游戏感受一下交互中的变囮。

在本教程中你学习了如何创建可扩展的交互系统,你已经通过这个交互式系统找出了几种抓取物品的方法

在第二部分的教程Φ,你将学习如何扩展这个系统制作一套功能完备的弓和箭,以及一个功能完备的背包

如果你想学习更多关于用 Unity 编写杀手游戏,请阅讀我们的

在这本书中,你将创建 4 个完整的游戏:

  • 一个塔防游戏(带 VR 支持!)
  • 学完这本书后你将能够编写自己的游戏运行在 Windows、macOS、iOS及更多平台。

夲书完全针对 Unity 初学者将他们的 Unity 技能升级到专家水准。本书假设你有一定的编程经验(任何语言)

感谢你阅读本教程!如果有任何意见囷建议,请留言!

[C#] 纯文本查看 复制代码

//遍历按钮 上媔只列举了菜单,紧握,触摸板,扳机四个按钮 //如果松开扳机会震动

我要回帖

更多关于 HTC vive手柄维修 的文章

 

随机推荐