快速上手
· 克隆仓库 git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit.git
· 用Unity3d打开SteamVR_Unity_Toolkit
· 从Unity资源商店导入SteamVR Plugin
· 浏览Examples场景作为例子来看脚本的用法
概要
这个工具包提供了很多Unity3d里的常用VR功能,如下(但并不局限于此):
· 带有通用别名的控制器按钮事件
· 控制器世界指针(如激光指针)
· 玩家传送
· 用控制器抓取对象
· 用控制器和对象交互
这个工具类基本是受到 SteamVR Plugin for Unity3d Github Repo的启发,并基于此。
这个工具存在的原因是因为SteamVR plugin含有令人困惑或不完善的代码,所以我决定创建一个脚本/资源集合,这在用Unity3d创建VR时是很有用处的。
预制
可用预制:
[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文本的颜色。
FramesPerSecondCanvas 预制的例子可以在SteamVR_Unity_Toolkit/Examples/018_CameraRig_FramesPerSecondCounter场景中找到,在头盔视野中间显示了帧率。按下扳机键(trigger)生成一个新的小球,按下触摸版(touchpad)生成10个新的小球。通过最终当很多小球出现的时FPS将下降来演示这个预设。
脚本
这个目录包含了所有添加到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脚本。