可交互对象(VRTK_InteractableObject)


可交互对象脚本被添加到需要用(如控制器)来交互的任何游戏对象上。
 
可用脚本参数如下
 

Touch Interactions 触摸交互

· Highlight On Touch:如果勾选,这个对象在控制器触摸它时就会高亮。
· Touch Highlight Color:对象被触摸时高亮的颜色。颜色可以被任何全局的设置颜色来覆写(例如InteractTouch 脚本)。
· Rumble On Touch:控制器触碰对象时触发振动反馈,x表明时长,y表明震动强度。(x和y将来会被自定义编辑器代替)。
 


Grab Interactions 抓握交互

· Is Grabbale:决定对象是否能被抓握。
· Is Droppable:决定对象在被控制器抓握后能否被放下。如果没有勾选,一旦用控制器按钮拾起了物品就不能放下了。但是如果抓握的机制是关节(Fixed_Joint)的话,当对象受力足够大之后关节断开,物品也就被放下了。所以最好使用控制器子物体的抓握机制(Child_Of_Controller)来防止这种情况。
· Hold Button To Grab:如果勾选,控制器就需要持续按住设置为抓握的按钮来保持抓握状态。如果没有勾选,抓握的按钮切换抓握行为通过按下一次抓取,再按一次释放。
· On Grab Collision Delay:当对象被第一次抓取时延迟碰撞的作用的时间量。这在防止游戏对象被抓取时卡到另外一个物体时很有用。
· Grab Snap Type(抓取对齐方式):这个设置了当对象被抓取时的对齐方式
     o Sinmple_Snap:把抓取的对象的中心位置放到控制器的附加点上(默认是控制器的tip)
     o Rotation_Snap :调整抓取的对象到一个指定旋转,由Vector3 类型的Snap To Rotation变量提供。
     o Precision_Snap :没有把对象的位置对齐到控制器,而是用控制器触摸对象时的点来拾起对象(就像真实生活中用手拿起东西一样)。
     o Handle_Snap: 允许一个空的GameObject作为可交互对象的子物体来用作参考对齐点。抓取时,空GameObject的旋转和位置用来定位抓取的可交互物体到控制器。
· Snap To Rotation:表示欧拉角的Vector3变量,决定在对齐时相对于控制器的对象的旋转。在拾取枪或剑的时候很有用,对控制器的相对旋转对便于使用是很重要的。
· Snap To Position:一个Vector3变量,决定对象对齐控制器时的相对位置。
· Snap Hanlde:一个由空游戏对象提供的Transform,它必须是被抓取物品的子物体并用作一个被拾取物品相对于进行抓取的控制器的旋转和位置的定位点。
· Rumble On Grab:控制器抓取对象时触发振动反馈,x表明时长,y表明震动强度。(x和y将来会被自定义编辑器代替)。

Grab Mechanics 抓握机制

· Grab Attach Type:这决定了抓取的物品在被抓取时怎样被添加到控制器上。
     o Fixed Joint(固定关节):用一个固定的关节把对象附加到控制器上,意味着附加对象以完全1:1的方式追踪控制器的位置和旋转。
     o Spring Joint(弹性关节):用一个弹性关节把对象添加到控制器上,意味着物体和控制器之间有一些弹性,弹力驱动物体。在想要牵引一个物体而不是直接把物体对齐到控制器上是很有效的。就感觉物体有运动阻力一般。
     o Track Object (追踪对象):不是通过关节来把对象附加到控制器上,而是确保对象追踪控制器的方向,这适用于铰链式关节。
     o Child Of Controller (控制器子物体):简单地让对象成为抓取控制器的子物体,所以自然地追踪了控制器运动位置。
 
· Detach Threshold(分离阈值):当对象从被抓取的控制器分离时的力值。如果控制器试着施加一个高于这个阈值的力到对象上(从另一个对象上拉它或者推它到另一个对象),然后保持对象到抓取控制器的关节就将断开并且对象将不能再被抓起了。这在Tracked Object抓取机制下也有效,只是这个 值确定断开抓取钱控制器可以离对象多远。
· Spring Joint Strength(弹簧关节力):弹簧力保持对象到控制器。小数值将意味着弹簧很松并且对象需要一个更大的力去移动,大数值就意味着弹簧很紧,小点的力就可以移动它。
· Spring Joint Damper(弹簧关节阻尼):弹簧的阻尼量在使用弹簧关节抓取机制下有效。在移动被关节的交互对象时,值越高震动效果越小。
· Throw Muliplier(投掷倍数):值用来乘以给定对象被扔出时的速度值。这还可以被用来连同Interact Grab脚本的Throw Multiplier来让对象被扔的比平常更远(或者输入的值小于1就扔的很近)。

Use Interactions 使用交互

· Is Usable(是否可用):决定对象是否可以被使用
· Hold  Button To Use:如果勾选,控制器上的使用(use)按钮需要被持续按下来保持使用。如果没有勾选,use按钮用一次按钮按下来启动使用和再一次按下来停止使用。
· Pointer Avtivates Use Action:如果勾选,当一个世界光束指针(由控制器投射)碰到了交互对象,如果对象的Hold Button To Use没有勾选的话,当指针在对象上的时候就会运行对象的StartUsing方法,指针移开失效就会运行StopUsing方法。这个选项在被勾选以后,为了防止在用一个指针来使用对象时发生不必要的传送,就不会抛出目标点设置( Destination Set )事件。
· Rumble On Use:控制器触碰对象时触发振动反馈,x表明时长,y表明震动强度。(x和y将来会被自定义编辑器代替)。
下面的事件是被发送的:
· InteractableObjectTouched:当另一个对象碰到当前对象时发出事件。
· InteractableObjectUntouched: 当其他对象停止触碰当前对象时发出事件。
· InteractableObjectGrabbed:当其他对象(如控制器)抓握当前对象时发出事件。
· InteractableObjectUngrabbed:当其他对象停止抓握当前对象时发出事件。
· InteractableObjectUsed:当其他对象(控制器)使用当前对象时发出事件。
· InteractableObjectUnused:当其他对象停止使用当前对象时发出事件。
发出的事件有效信息载体包涵:
· interactingObject:初始化交互的对象(如控制器)。
 
脚本基本是提供一个简单的机制来区分游戏世界中的对象是否能被抓取或者使用,最好是把这个脚本看做是一个基类来派生出功能更丰富的脚本。
 
VRTK_InteractableObject 的例子可以看SteamVR_unity_Toolkit/Examples/005_Controller_BasicObjectGrabbing.场景。这个场景还在控制器上使用了VRTK_InteractTouch和VRTK_InteractGrab 脚本,来展示一个交互对象怎样被抓取和对齐到控制器以及在游戏世界中扔出。
另外一个例子在场景SteamVR_Unity_Toolkit/Examples/013_Controller_UsingAndGrabbingMultipleObjects。这个场景展示了更多对象,可以被按住按钮抓取或者切换按钮点击来抓取的对象,还有对象通过切换它们的Using 状态来展示多种物品可同时被开启。

触摸交互对象(VRTK_InteractTouch)


触摸交互脚本被添加到[CameraRig] 预制里的控制器对象上。
 
可用参数如下:
· Hide Controller On Touch: 当有效触碰发生时隐藏控制器模型
· Hide Controller Delay:触摸隐藏控制器之前的等待秒数。
· Global Touch Highlight Color: 如果交互对象被触碰就能高亮显示,没有设置本地颜色的话就使用全局颜色。
发出事件如下:
· ControllerTouchInteractableObject:当有效对象被碰到时发出
· ControllerUntouchInteractableObject: 当一个有效对象不再被触碰时发出
 
发出事件有效载体信息包含:
· controllerIndex(控制器序号):正在交互的控制器的序号
· Target(目标): 控制器正在交互的对象的GameObject
 
VRTK_InteractTouch 的例子参见SteamVR_Unity_Toolkit/Examples/005_Controller_BasicObjectGrabbing场景。场景演示了添加了 VRTK_InteractableObject 脚本的对象被控制器触碰时能够高亮显示交互对象的能力。
 
 

抓取交互对象(VRTK_InteractGrab)


交互抓取脚本被添加到[CameraRig] 预制里的控制器对象上,并且需要添加VRTK_ControllerEvents脚本用来监听抓取和释放交互游戏对象的控制器按钮事件。它监听AliasGrabOn和AliasGrabOff 事件来确定对象合适应该被抓取和释放。
 
控制器对象也需要添加VRTK_InteractTouch 脚本用来确定何时一个可交互对象被触摸到。只有有效的被触摸对象才能被抓取。
 
如果控制器触碰到一个包含VRTK_InteractableObject脚本并且isGrabbable 标志位设置为真的游戏对象,该对象就可以被抓取。
 
如果有效可交互对象是可抓取的,按下控制器上所设置的抓取按钮(默认是Trigger按钮)将抓取和对齐对象到控制器上,并且直到抓取按钮松开才会被释放。
 
当控制器抓取按钮松开时,如果可交互对象是可抓取的,它将会被按一定速率沿着控制器松开时的方向进行推动,这就模拟了对象投掷。
 
可交互对象需要碰撞体用来激活触发和一个刚体用来拾取它们并在游戏世界中四处移动它们。
可用脚本参数如下:
· ************************************************************
· Controller Attach Point:控制器模型上用来吸附抓取的对象的刚体点(默认为tip)
· Hide Controller On Grab:当有效抓取发生时隐藏控制器模型。
· Hide Controller Delay:在抓取时隐藏控制器之前的等待时间秒数。
· Grab Precognition(预先抓取): 在抓取按钮按下时和控制器正在抓取某个东西时之间时间量。例如,如果一个对象下落过快,因为人的反应时间可能很难及时按下抓取按钮来抓住对象。这个值越高意味着抓取键可以越提前在控制器碰到对象以及碰撞发生前按下,如果抓取键仍然被按下(如果抓取对象需要持续按键抓取的话),则抓取动作就会成功。
· Throw Multiplier(投掷乘数):用来乘以对象被扔出时速度的量。在放大 CameraRig 来模拟能够把物体扔的更远时是很有用的。
· Create Rigid Body When Not Touching:如果勾选,当抓取按钮按下时,如果控制器没有碰到一个可交互的对象,那么添加到控制器上的刚体就允许控制器去推动周围其他的刚体对象。
发出事件如下:
· ControllerGrabInteractableObject: 当有效对象被抓取时发出
· ControllerUngrabInteractableObject: 当有效对象从抓取到放开时发出
 
发出事件有效载体信息包含:
· controllerIndex: 正在交互的控制器序号
· target: 控制器正在交互的对象的GameObject
VRTK_InteractGrab的例子可以参见SteamVR_Unity_Toolkit/Examples/005_Controller/BasicObjectGrabbing场景。场景演示了抓取挂有VRTK_InteractableObject 脚本的可交互对象。对象可拾起可抛出。
 
更复杂一点的例子可以参见场景SteamVR_Unity_Toolkit/Examples/013_Controller_UsingAndGrabbingMultipleObjects ,这里演示了每个控制器都能单独抓取和使用对象并且对象也可以被同时切换它们的使用状态。SteamVR_Unity_Toolkit/Examples/014_Controller_SnappingObjectsOnGrab场景演示了不同的对齐抓取的对象到控制器上的机制。
 
 
 

使用可交互对象(VRTK_InteractUse)


交互使用脚本被添加到[CameraRig] 预制里的控制器对象上,并且需要添加VRTK_ControllerEvents脚本用来监听使用和停止使用交互游戏对象的控制器按钮事件。它监听AliasUseOn 和AliasUseOff 事件来确定对象合适应该被使用和停止使用。
 
控制器对象也需要添加VRTK_InteractTouch脚本来决定何时可交互对象被触碰。只有有效的触碰对象才能被使用。
 
如果控制器触碰到一个包含VRTK_InteractableObject 脚本且isUsable标志位设置为真,这个对象就能被使用。
可用脚本参数如下:
· Hide Controller On Use:当有效使用动作开始时隐藏控制器模型
· Hide Controller Delay:在使用之前,隐藏控制器的等待时间秒数
 
发出事件如下:
· ControllerUseInteractableObject: 当一个有效对象开始被使用时发出
· ControllerUnuseInteractableObject: 当一个有效对象停止被使用时发出
 
发出的事件的有效载体信息包含:
· controllerIndex: 正在交互的控制器序号
· target: 控制器正在交互的对象的GameObject
 
例子参见SteamVR_Unity_Toolkit/Examples/006_Controller_UsingADoor场景,模拟打开一扇门和关上。地上也有一个立方体可以被抓取来展示可交互对象怎么被使用或者抓取。
 
另一个例子可参见SteamVR_Unity_Toolkit/Examples/008_Controller_UsingAGrabbedObject场景,它展示了对象可以用一个按钮抓取并用另一个按钮使用。
 
 

自动抓取可交互对象(VRTK_ObjectAutoGrab)


通过把VRTK_ObjectAutoGrab脚本加到控制器上并指定应该默认抓取的对象,来让特定控制器能自动抓取可交互对象。
 
自动抓取对象脚本添加到[CameraRig] 预制里的控制器对象上,控制器对象还需要添加VRTK_InteractGrab 脚本。
 
可用脚本参数如下:
· Object To Grab(抓取的对象):在游戏开始时被控制器抓取的游戏对象(在场景或者预制里)。
· Clone Grabbed Object(复制被抓取对象):如果勾选,Object To Grab(抓取的对象)将被复制到一个新对象并添加到控制器上,而被复制的对象留在场景里。这在两个控制器都需要抓取同样的对象时是需要的,因为单个对象不能被不同的控制器同时抓取。如果被抓取的对象是一个预制就也需要被复制,因为它需要存在于场景中被抓取。
 
例子参见SteamVR_Unity_Toolkit/Examples/026_Controller_ForceHoldObject场景。这里每个控制器自动抓取了一把剑,同时为了防止剑被扔掉,剑被永久的添加到用户的控制器上

SteamVR Unity工具包(VRTK)之控制器交互的更多相关文章

  1. SteamVR Unity工具包(VRTK)之概览和控制器事件

    快速上手 · 克隆仓库  git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit.git · 用Unity3d打开SteamVR_ ...

  2. SteamVR Unity工具包(VRTK)之激光和移动

    简单激光指针(VRTK_ SimplePointer) 简单指针(Simple Pointer)脚本从控制器尾部发出一个有色光束来模拟激光束.这在场景中指向对象很有用,它能判断所指向的对象以及对象距控 ...

  3. Unity5.6之前版本VRTK插件基础交互

    一.VR运行环境配置: 安装steam,在steam上安装SteamVR驱动. 在Unity项目中需要导入VRTool插件包(已上传服务器),里面包含两个插件一个是SteamVR插件,一个是VRTK插 ...

  4. SteamVR Unity Plugin - v2.0.1中的InteractionSystem

    最近写VR项目的时候用到了SteamVR Unity Plugin - v2.0.1插件,感觉比之前用到的SteamVR plugin for Unity - v1.2.2版本改进了很多,就算不用VR ...

  5. Unity与Android之间的交互之AndroidManifest

    https://blog.csdn.net/qq_15003505/article/details/70231975 AndroidManifest,中文名一般称之为清单文件.它描述了应用程序的组件的 ...

  6. AngularJs-指令和控制器交互

    前言: 前段时间我们学习了angular的指令,他通过ECMA的方式创建元素,可以让我们共用这些元素,我们也知道可以通过 link的方法给这个指令添加一些动作事件,本节,我们将写入和让angular的 ...

  7. OpenFlow 交换机与控制器交互步骤

    1. Hello 控制器与交互及互相发送 Hello 消息.Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的 ...

  8. Unity与Android的相互交互

    1.Unity调用Android. Unity块代码: using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.play ...

  9. Unity与Android间的交互

    1.打开Android Studio,命名并自动生成包名 2.点击Next,设置最小支持的SDK 3.点击Next,选择Empty Activity 4.点击Next,默认就行不用管 5.Finish ...

随机推荐

  1. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  2. 你足够了解Context吗?

    你足够了解Context吗? 这里有关于Context的一切-写在前面: 当我还是一个24K纯Android新手的时候(现在是也是个小Android萌新),拿着工具书对着电脑敲敲打打,那个时候我就有一 ...

  3. A better SHOW TABLE STATUS

    From command line we have the entire MySQL server on hands (if we have privileges too of course) but ...

  4. SET ROWCOUNT,SET NOCOUNT

    SET ROWCOUNT (Transact-SQL) 在停止特定查询之前要处理的行数(整数). 重要提示 在 SQL Server 的将来版本中,使用 SET ROWCOUNT 将不会影响 DELE ...

  5. SQL server 中的dbo、guest

    dbo database owner 数据库的创建者,创建该对象的用户. guest 顾客 能够访问数据库中对象的数据, 要求dbo分配权限给guest, 一般给他查看的权限select 数据库所有者 ...

  6. bash feature

    bash调用-启动文件-交互式shell-条件表达式-shell算术-别名-数组-目录栈-提示符控制-受限shell-posix模式 受限shell bash --restricted 它用来建立一个 ...

  7. javascript 函数式编程

    编程范式 编程范式是一个由思考问题以及实现问题愿景的工具组成的框架.很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等. 函数式编程 ...

  8. 树莓派 2 win 10 IOT

    Setting up Windows 10 for IoT on your Raspberry Pi This week at the BUILD conference in San Francisc ...

  9. js键盘事件全面控制

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

  10. ES6 中的 Set、Map 和 WeakMap

    Set 是 ES6 新增的有序列表集合,它不会包含重复项. Set 支持 add(item) 方法,用来向 Set 添加任意类型的元素,如果已经添加过则自动忽略: has(item) 方法用来检测 S ...