如何在VR场景中位移与行走Unity VRTK - SteamVR Unity Toolkit针对VR开发的工具包

转载自:

https://blog.csdn.net/KiTok/article/details/52836088

 

如果您碰到什么其他问题的话,欢迎来 我自己的一个 讨论群`559666429`来,大家一起找答案,共同进步

 

    在使用HTC VIVE StreamVR 开发VR项目的时候,需要使用许多的,比如激光定位,贝塞尔曲线激光指针,位移,触碰,抓取等功能。这时候一个很好的插件就很重要,这里我们使用的是“VRTK - SteamVR Unity Toolkit”。VRTK

 

   一, 概要

      这个工具包提供了很多Unity3d里的常用VR功能,如下(但并不局限于此):

     · 带有通用别名的控制器按钮事件

      · 控制器世界指针(如激光指针)

      · 玩家传送

      · 用控制器抓取对象

      · 用控制器和对象交互

      这个工具类基本是受到 SteamVR Plugin for Unity3d Github Repo的启发,并基于此。这个工具存在的原因是因为SteamVR plugin含有令人困惑或不完善的代码。

 二, 预制

      可用预制:[CameraRig]直接从SteamVR Unity plugin例子——SteamVR/Extras/SteamVR_TestThrow场景中拿来,因为它包含了控制器上相关模型的子物体(这在SteamVR plugin默认预制SteamVR/Prefabs/[CameraRig].prefab中似乎是缺失的)。

      SteamVR_Unity_Toolkit/Prefabs/[CameraRig]可以被拖到任何场景中,通过VR头盔和包括模型呈现的VR控制器的追踪来提供对VR游戏相机的即时访问。

  三,帧率显示

     这个画布添加一个表示帧率的文本元素到头盔上。使用这个预制必须把它放到场景中,然后头盔的相机需要被添加到画布上。

   · 选择场景中的FremesPerSecondCanvas对象

   · 找到Canvas组件

   · 设置Render Camera参数为 [CameraRig]预制里的Camera(eye)

 

     预制上有很多可以被设置的参数。展开层级视图中的FramesPerSecondCanvas对象,显示子对象FramesPerSecondText并点击显示额外参数,这些参数可以通过FramesPerSecondViewer脚本(可以在SteamVR_Unity_Toolkit/Scripts/Helper/FramesPerSecondViewer找到)来设置。

 

    可用脚本参数如下:

   · Display FPS:FPS文本可视切换。

   · TargetFPS:认为可接受的帧率,被用来作为改变FPS文本颜色的基准。

   · Font Size:FPS显示字体尺寸。

   · Position:FPS 文本在头盔视野的位置。

   · Good Color:当处在目标FPS的合理范围之内的FPS文本颜色。

   · WarnColor:当FPS降到低于目标FPS合理范围的FPS文本颜色。

   · Bad Color:当FPS处在相对目标FPS为不合理水平时FPS文本的颜色。

 

SFramesPerSecondCanvas 预制的例子可以在达到SteamVR_Unity_Toolkit/Examples/018_CameraRig_FramesPerSecondCounter场景中找到,在头盔视野中间显示了帧率。按下扳机键(trigger)生成一个新的小球,按下触摸版(touchpad)生成10个新的小球。通过最终当很多小球出现的时FPS将下降来演示这个预设。

 

 四, 脚本(VRTK_ControllerActions)

   这个目录包含了所有添加到Unity的VR功能的工具脚本。

   当前可用脚本有:控制器行为脚本提供了处理常见控制器行为的帮助方法。如下可用公共方法:  

 

    · IsControllerVisible(): 如果控制器模型是可见的返回真,否则返回假。

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

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

 

   VRTK_ControllerActions脚本的例子在SteamVR_Unity_Toolkit/Examples/016_Controller_HapticRumble场景中,展现了隐藏控制器和让控制器在给定强度下震动给定时长的能力。

 

 五:控制器事件(VRTK_ControllerEvents)

   控制器事件脚本被添加到 [CameraRig]预制里的控制器对象上,为控制器上的每个按钮按下提供事件监听(除了系统菜单按钮,因为这个按钮不能被重载,只能总是由Steam使用)。

   当一个控制器按钮被按下,脚本发出一个事件表明按钮被按下了,这使得其他脚本去监听这个事件而不需要实现任何控制器逻辑。脚本也有一个公共的布尔类型的按下状态变量,允许被其他脚本查询按钮是否被按下。当一个控制器按钮被释放,脚本也发送一个事件表示按钮被释放了。控制器触摸板有两个状态,既可以用户只把手指放到压力传感板上来触摸,也可以用户在板上按下去直到发出声响来点击。控制器事件脚本同时分别处理触摸板触摸和点击事件。

   控制器上有两个按钮轴:

 

 · 触摸板触摸位置,位置的x和y值基于触摸板当前被触摸位置。

  · 扳机按钮,有个基于扳机键被按下去程度的x值。

 

  当触摸板的轴或者扳机键的轴值改变时,会有两个额外的事件发出,这可以被用来确定两个轴的变化来进行精确控制,如用触摸板来移动角色,或者知道扳机键被按下程度。

  触摸板的轴由变量TouchpadAxis 记录,在所有控制器事件的脚本中更新。

  扳机键的轴由变量buttonPressure 记录,在所有控制事件脚本中更新。

  任何其他按钮按压只记录一个为1或者0按钮压力,因为所有其他按钮都是数字量(要么就是点击要么就没有),但扳机是一个可以记录不同按钮压力的模拟量。

  轴值变化的精确度可以由脚本中的axisFidelity 参数来决定,默认值为1。

  值只要超过2就可能会产生灵敏过度的结果。

  事件发出的有效载体信息包含:

 

· controllerIndex:所使用控制器的索引。

· buttonPressure:0到1的浮点数,表示按钮按下的所施加的压力值。

· touchpadAxis: 一个表示触摸板触摸位置的Vector2类型变量。

· touchpadAngle:一个表示触摸板触摸位置的转动位置的浮点数,0是顶部,180是底部,其他角度随之对应。

 

   当控制器被按下时也会有通用动作的别名事件被发出。这些动作别名可以被映射到想要的控制器按钮上。

   这些别名是:

 

· Toggle Pointer:打开关闭镭射棒

· Toggle Grab:抓取游戏对象

· Toggle Use:使用对象

· Toggle Menu:打开一个游戏内菜单

 

    每个上面的别名都可以通过在脚本参数窗口的下拉栏里选择映射其使用到喜好的控制器按钮上。

    当所设置的映射按钮被按下时将发出一个实际按钮事件以及一个额外别名开启的事件。

    当按钮释放的时候就发出一个实际按钮事件以及一个额外的别名关闭的事件。

    监听这些别名事件而不是实际的按钮事件意味着可以很轻易的自定义控制器按钮到它们应该执行的行为上。VRTK_ControllerEvents脚本的例子可以在SteamVR_Unity_Toolkit/Examples/002_Controller_Events场景中看到,事件怎样被使用和监听的代码例子可以参见SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerEvents_ListenerExample.cs脚本。

 

 

六,简单激光指针(VRTK_ SimplePointer)

 

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

    激光束默认按下控制器的抓握键(Grip)来激活。

    因为所侦听的事件是AliasPointer别名事件,所以这个指针开关按钮可以通过在 VRTK_ControllerEvents脚本参数里来改变 pointerToggleButton来选择设置。

    简单指针脚本(VRTK_ SimplePointer)添加到[CameraRig] 预制里的控制器对象上,同时添加需要VRTK_ControllerEvents脚本来监听启用和禁用光束的控制器按钮事件。

    下面是可用脚本参数:

     ∙ Enable Teleport(启用传送):如果勾选了,在目标设置事件中的teleport标志位就设为true,所以传送脚本就知道是否要行动到新的目标。如果这个选项没有勾选的话,控制器光束启动但是不会触发位移。 

      ∙ Point Hit Color(指针碰撞颜色):当光束和一个有效目标碰撞的颜色。每个控制器可以有不同的颜色设置。      

      ∙ Pointer Miss Color(指针无碰撞颜色):当光束没有命中有效目标时的颜色。每个控制器可以有不同的颜色设置。

     ∙ Show Play Area Cursor(显示游玩区光标):如果这个启动,游玩区界限就会在光束指针的顶端显示出来,颜色和当前指针颜色相同。

     ∙ Play Area Cursor Dimensions(游玩去光标尺寸):决定游玩区光标和碰撞的尺寸。如果值为零,PlayArea Cursor 的尺寸将根据Play Area空间进行校正。

     ∙ Handle Play Area Cursor Collisions(处理游玩区光标碰撞):如果勾选,当游玩区光标和其他物体发生碰撞时,指针颜色就会变成Pointer Miss Color的颜色且WorldPointerDestinationSet 事件将不会被触发,这将防止传送到游玩区会发生碰撞的区域。

     ∙ Beam Always On(光束总是开启):如果这个勾选,光束指针总是可见,但是设置目标点事件仍然只会在所指定按钮松开时发出。

     ∙ Pointer Thickness(指针光束厚度):光束长宽也可以在脚本里设置以及能够开关显示在光柱最后的球形光柱顶端(表示光标)。

     ∙ Pointer Length(指针光束长度):在停止前光束投射的距离。

     ∙ Show Pointer Tip(显示指针顶端):切换是否光标显示在光束指针的尾部。

   

     简单指针对象扩展自VRTK_WorldPointer 抽象类并因此发出相同的事件和有效数据。

     

     VRTK_SimplePointer脚本的例子可以在SteamVR_Unity_Toolkit/Examples/003_Controller_SimplePointer场景中看到并且事件用法和监听的脚本例子可以看SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerPointerEvents_ListenerExample.cs脚本。

 

   七,贝塞尔曲线激光指针(VRTK_BezierPointer)

 

    贝塞尔指针从控制器末端发出一个曲线(由游戏对象组构而成)到(任何高度的)地面上一点。

    这比简单激光指针要有用的多,因为终点能够弯曲到玩家看不见的对象顶部,所以就可以传送到各种高度的对象上。

    激光束默认按控制器上的抓握键Grip来激活。事件侦听AliasPointer别名事件,所以Pointer Toggle button可以通过在VRTK_ControllerEvents 脚本中改变Pointer Toggle button来进行选择设置。

    贝塞尔指针脚本被添加到[CameraRig]预制里的控制器对象上,控制器对象同时需要添加VRTK_ControllerEvents脚本用来监听控制器按钮开关光束的事件。

    可用脚本参数如下:

      ∙ Enable Teleport(启用传送):如果勾选了,在目标设置事件中的teleport标志位就设为true,所以传送脚本就知道是否要行动到新的目标。如果这个选项没有勾选的话,控制器光束启动但是不会触发位移。         

 

      ∙ Point Hit Color(指针碰撞颜色):当光束和一个有效目标碰撞的颜色。每个控制器可以有不同的颜色设置。

     ∙ Pointer Miss Color(指针无碰撞颜色):当光束没有命中有效目标时的颜色。每个控制器可以有不同的颜色设置。

      ∙ Show Play Area Cursor(显示游玩区光标):如果这个启动,游玩区界限就会在光束指针的顶端显示出来,颜色和当前指针颜色相同。

      ∙ Play Area Cursor Dimensions(游玩去光标尺寸):决定游玩区光标和碰撞的尺寸。如果值为零,PlayArea Cursor 的尺寸将根据Play Area空间进行校正。

      ∙ Handle Play Area Cursor Collisions(处理游玩区光标碰撞):如果勾选,当游玩区光标和其他物体发生碰撞时,指针颜色就会变成Pointer Miss Color的颜色且WorldPointerDestinationSet 事件将不会被触发,这将防止传送到游玩区会发生碰撞的区域。

      ∙ Beam Always On(光束总是开启):如果这个勾选,光束指针总是可见,但是设置目标点事件仍然只会在所指定按钮松开时发出。

      ∙ Activate Delay(激活间隔):能够再次激活指针光束的延迟时间秒数。用来防止持续传送。   

 

     ∙ Pointer Length(指针光束长度):在停止前光束投射的距离。

      ∙ Pointer Density(指针密度):贝塞尔曲线光束渲染的物体个数。这里数值太高将很可能会因为大量渲染对象来对游戏性能有负面影响。

      ∙ Show Pointer Cursor(显示指针光标):在光束终点位置的地面显示光标。用来看光束终点位置的高度很有用,它可以通过切换这个来关闭。

      ∙ Pointer Cursor Radius(指针光标半径):地面指针光标的尺寸,这个值也会影响贝塞尔曲线光束里的对象的尺寸。半径越大,对象尺寸越大。

      ∙ Beam Curve Offset(光束曲线偏移): 投射光束时应用的高度偏移量,就算在光束径直指向时也能产生一个光滑的曲线。

      ∙ Custom Pointer Tracer(自定义指针轨迹): 可以在这里设置一个自定义的游戏对象用来代替光束轨迹的默认球体。自定义游戏对象将和控制器的旋转想匹配。

     ∙ Custom Pointer Cursor(自定义指针光标):  可以在这里设置一个自定义的游戏对象用来代替指针光标的默认平柱体。

 

      贝塞尔指针对象扩展自VRTK_WorldPointer 抽象类并因此发出相同的事件和有效数据。

      VRTK_BezierPointer脚本的例子参见SteamVR_Unity_Toolkit/Examples/009_Controller_BezierPointer场景,它被连同Height Adjust Teleporter脚本一起使用,来显示怎样可以不需要看到对象的顶部就能使用曲线指针来传送到不同高度的对象上。

      另一个例子可以参见SteamVR_Unity_Toolkit/Examples/012_Controller_PointerWithAreaCollision场景,这里演示了一个开启了游玩区光标和碰撞检测的贝塞尔指针怎样被用来穿过游戏区域,但是不允许传送到墙壁或者其他对象的区域而导致游玩区让玩家穿进墙壁。

      贝塞尔曲线生成的代码是另一个脚本,位置在SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs。

 

 

   八,基础传送器(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按钮时激光指针失效,然后玩家传送到激光指针顶端位置。

 

 

    九,可调节高度的传送器(VRTK_HeightAdjustTeleport)

    

    高度调整传送器继承自基础传送器,它允许根据传送位置是否在其他对象顶部来让[CameraRig]改变y位置。

    和基础传送器一样,高度调整传送器被添加到[CameraRig]预制并需要一个可用的世界指针。

    可用脚本参数如下:

    · 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(忽略带有标签或脚本的目标) : 一个指定对象标签或者对象上添加的脚本名字的字符串,通知传送器这种目标点应该被忽略,所以用户就不能传送到这些位置上。同时也确保指针颜色被设为丢失目标点颜色。

    · Play Space Falling(游玩区坠落):检查是否玩家是否走出对象,即所在游玩区的位置不在对象上,然后就会自动传送到最近的地面上。

   

     反过来说Play Space Falling 选项是在玩家头盔在一个对象上方时会自动传送到一个对象的顶部,这一点在模拟爬梯子时很有用,不需要使用指针光束定位。如果这个选项关闭,玩家就能在他们所站在的对象的同样y高度的空中行走(也就是有一部分游玩区在对象外部)。

 

   VRTK_HeightAdjustTeleport 脚本的例子参见SteamVR_Unity_Toolkit/Examples/007_CameraRig_HeightAdjustTeleport场景。场景有许多不同高度对象,玩家可在来回走或者使用激光束爬到它们顶部。

   另一个例子参见SteamVR_Unity_Toolkit/Examples/010_CameraRig_TerrainTeleporting场景,展示了玩家也能够在地形碰撞器上传送。

   还有个例子SteamVR_Unity_Toolkit/Examples/020_CameraRig_MeshTeleporting场景中,显示玩家在网格碰撞器上传送。

 

 

 十,头盔碰撞淡出(VRTK_HeadsetCollisionFade)

 

    头盔碰撞淡出的目的是为了检测用户的VR头盔何时碰撞到其他游戏对象并淡出屏幕到一个单色。

    这是为了处理玩家把头放进一个游戏对象里看到对象内部的裁剪,这不是我们所期望的。

    之所以这么做,是因为如果玩家把头放到不该放的地方就会淡出到一个颜色(如黑色),这就让玩家意识到他们做错了什么,然后可能自然的就会后退。如果头盔正在碰撞,那么传送行为就被禁用来防止穿插穿墙的作弊。

   使用Unity 5.3及之前版本,头盔碰撞淡出脚本添加到[CameraRig] 预制的Camera(head)对象上。

   使用Unity 5.4及之后版本,头盔碰撞淡出脚本添加到[CameraRig] 预制下的Camera (head)里的Camera(eye)对象上。

   可用脚本参数如下:

   · Blink Transition Speed(眨眼淡入淡出速度):碰撞时淡入淡出速度。

   · Fade Color(淡出颜色):头盔碰撞时淡出颜色。发出事件如下:

   · HeadsetCollisionDetect: 当用户头盔碰到其他游戏对象时发出。

  · HeadsetCollisionEnded:当用户头盔停止碰撞游戏对象时发出。发出事件的有效载体内容包括:

   · collider: 头盔所碰撞的游戏对象的碰撞器。

   · currentTransform: 当前头盔碰撞淡入淡出脚本所添加到的对象(相机)的Transform。

 

    VRTK_HeadsetCollisionFade 脚本例子参见SteamVR_Unity_Toolkit/Examples/011_Camera_HeadSetCollisionFading场景。场景在游玩区周围有可碰撞的墙壁,如果玩家把头放进墙壁,头盔就将渐变成黑色。

 

  十一,玩家呈现(VRTK_PlayerPresence)

 

    VR用户在游戏呈现中有身体这一概念,它通过在用户站立在游玩区中的位置添加碰撞和刚体来实现。

    身体的碰撞和刚体将防止用户能狗穿过墙壁或者和其他可碰撞对象穿插。

    碰撞体的高度由用户头盔所在高度决定,如果用户下蹲,碰撞体同样收缩,这意味着可能在低的空间去下蹲和爬行通过。

    可用脚本参数如下:

 

   · Headset Y Offset(头盔y偏移):为用户创建的盒型碰撞体的高度由用户头盔位置设置。如果需要碰撞体小一点来让游玩区和头盔之间留有空间的话,这个值将降低生成的盒型碰撞体的高度。

   · Ignore Grabbed Collisions(忽略抓取碰撞):如果勾选,任何被控制器抓取的物品都不会和游玩区的盒碰撞体及刚体发生碰撞。这在用户需要抓取和挥动对象时是很有用的,因为如果碰撞体激活,这些抓取的东西就会被游玩区的碰撞体弹开。

 

     VRTK_PlayerPresence 脚本例子可参见SteamVR_Unity_Toolkit/Examples/017_CameraRig_TouchpadWalking场景。场景有很多墙体和斜坡,用户可以用触摸板来四处行走,但是不能穿过这些对象,因为它们是可碰撞的并且刚体物理将不允许发生穿叉。

 

  十二,触摸板移动 (VRTK_TouchpadWalking)

 

   通过手指在触摸板上滑动来实现用这个脚本让游玩区在游戏世界中能够移动。

   TouchpadWalking脚本用在[CameraRig]预制上,并且在用户位置添加一个刚体和盒型碰撞来防止他们穿过其他带碰撞的游戏对象。

   如果Headset Collision Fade脚本已经被添加到相机预制上,如果用户试着和一个对象发生碰撞,那么他的位置就会被重置为最近的正常的位置。

   这可能发生在用户穿过需要躬身的区域中途站了起来和顶部发生了碰撞。与其允许用户这样做而引起碰撞问题,倒不如直接移动回到一个正常的位置。这确实破坏了沉浸感,但用户正在做的事情也是不自然的。

   可用脚本参数如下:

   · Left Controller:如果勾选,左控制器的触摸板就能移动游玩区。在运行时可以被切换。

    · Right Controller:如果勾选,右控制器的触摸板就能移动游玩区。在运行时可以被切换。

    · Max Walk Speed:当触摸板被触摸到轴的极限时游玩区所能达到的最大移动速度。触摸板距离中心越近的位置被触摸,移动速度就越慢。

   · Deceleration(减速度):当用户不再触摸到触摸板时游玩区从减速到完全停止的速度。这种减速度效果可以减缓可能遭受的移动恶心。

 

    VRTK_TouchpadWalking 脚本的例子参见SteamVR_Unity_Toolkit/Examples/017_CameraRig_TouchpadWalking场景。场景中有很多墙壁和梯子,用户可以用触摸板来移动。还有个区域只有用户蹲下才能穿过。在俯身区域挺起身体将导致用户闪回他们最近的正常位置。

  

  十三,VRTK_RoomExtender(游玩区空间扩展)

 

     这个脚本允许游玩区跟随玩家移动。

     CameraRig 只在达到定义的圈的边缘才会移动。目的是为了创造一个虚拟的更大的游玩区。

     测试这个脚本的demo场景为028_CameraRig_RoomExtender。把脚本添加到CameraRig来使用。

     可用脚本参数如下:

      · Additional Movement Multiplier(额外移动乘数): 圈边缘的移动放大因数。0就是不移动CameraRig。值越高模拟的游玩区域就越大,但是也可能就越不令人舒适。

     · Head Zone Radius(头部空间半径):游玩区不会发生移动的圆圈尺寸,一切都正常的。如果值太低,在蹲下时就会感到不舒服。

      · Debug Transform(调试Transform): 这个transform让玩家周围的CameraRig不移动圆圈显示出来。在demo场景里就是一个在地板上的柱体。记得关闭碰撞。

 

 

  十四,可交互对象(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场景。这里每个控制器自动抓取了一把剑,同时为了防止剑被扔掉,剑被永久的添加到用户的控制器上

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值