#unity VRTK#部分常用组件解析(二)

上一节写了:

  1. VRTK_Controller Events(带有通用别名的控制器按钮事件
  2. 两代虚拟类VRTK_DestinationMarker、VRTK_WorldPointer以及派生的各种射线指针类
这一节接着讲
  1. 基于射线指针实现的各种传送,例如VRTK_BasicTeleport
  2. VRTK_InteractableObjects类:与对象的交互

  • 基础传送器(VRTK_BasicTeleport)

基础传送器更新[CameraRig]在游戏世界中的x和z位置到由WorldPointerDestinationSet事件设置定位的世界指针顶端的位置。y位置从不改变,所以基础传送器不能用来上下移动游戏对象而只能水平移动。
 
基础传送器脚本被添加到[CameraRig] 预制下面并需要一个实现了WorldPointer 的脚本添加到另一个游戏对象上(如VRTK_SimplePointer添加到控制器对象上)。
 
可用脚本参数如下:
 
· Blink Transition Speed(眨眼淡入淡出速度):可以在基础传送脚本中改变眨眼渐变速度来提供一个自定义的传送体验。速度设置为0意味着没有渐变眨眼特效呈现。渐变通过 SteamVR Unity 插件脚本里的SteamVR_Fade.cs脚本实现。
 
· Distance Blink Delay(距离眨眼延时): 范围从0到32,这个值决定了基于被传送距离的眨眼过渡保持黑屏的时长。值为0时,任何传送距离都不会延长传送的眨眼过渡,值为32时,就算距离初始点很近的被传送距离都会延长传送的眨眼过渡。这可以被用来模拟用户传送更远的距离花费更长时间。值为16对用户来说就刚好。
 
· Headset Position Compensation(头盔位置补偿): 如果勾选,传送坐标将会式游玩区内头盔的位置。如果没有勾选,传送坐标将总是游玩区中间的位置,就算头盔位置不在游玩区中间也式如此。
 
· Ignore Target With Tag Or Class(忽略带有标签或脚本的目标): 一个指定对象标签或者对象上添加的脚本名字的字符串,通知传送器这种目标点应该被忽略,所以用户就不能传送到这些位置上。同时也确保指针颜色被设为丢失目标点颜色。
 
VRTK_BasicTeleport 脚本的例子可以参见SteamVR_Unity_Toolkit/Examples/004_CameraRig_BasicTeleport场景。这个场景使用控制器上的VRTK_SimplePointer 脚本在按下grip按钮时初始化一个激光指针,松开Grip按钮时激光指针失效,然后玩家传送到激光指针顶端位置。

详细的代码这里就不贴了,梳理一下方法的流程:监听控制器事件-》指针射线-》终点标记-》验证是否为有效传送地点-》传送(把CameraRig的位置设置为目标传送点的位置)。


  • 可交互对(VRTK_InteractableObject)

要对对象进行交互,除了要在可交互对象上添加VRTK_Interactable Object组件,还要在控制器上加上VRTK_ControllerActions脚本组件。该组件提供辅助方法来处理常见的控制器动作。
    
    VRTK_ControllerActions的常用方法:
//如果控制器模型是可见的返回真,否则返回假。
IsControllerVisible(): 

//根据所给布尔值状态设置控制器模型的可见性。如果传入true,控制器模型就被显示出来,如果传入false,控制器就被隐藏了。
ToggleControllerModel( bool on):

// 启动控制器开始震动,根据给定的持续计时(第一个参数)和震动强度(第二个strength参数)。最大强度可以是3999,超过就限制为3999。
TriggerHapticPulse( int duration, ushort strength):




可交互对象脚本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),抓取交互对象(VRTK_InteractGrab),使用可交互对象(VRTK_InteractUse),自动抓取可交互对象(VRTK_ObjectAutoGrab)等,之后才能让控制器与物体发生交互。

这些组件对象具体内容我们将在下一节展开描述。





猜你喜欢

转载自blog.csdn.net/yzy565280261/article/details/80034424
今日推荐