【新手向】Unity 2020 + SteamVR 2.x 基础知识
本文将以Unity 2020为编辑器,介绍新版SteamVR的变化、相关操作背后的原理、以及在Unity 2020中使用该插件需要注意的细节,本文内容部分来自视频课程《SteamVR 2.x 交互开发指南》,以下。目录:[*]SteamVR 插件的获取
[*]新版本 SteamVR 2.x 的主要变化
[*]导入 SteamVR 插件
[*]初次运行SteamVR应用程序(自带示例场景)
针对PC VR平台的开发,绕不过去的便是以SteamVR平台为代表的VR设备,尤其是目前国内PC VR设备的现状,无论从采购渠道还是品牌认知度,目前还是以HTC VIVE为主要硬件平台,而HTC VIVE 系列产品均是运行在SteamVR平台之上的。SteamVR 插件是Valve提供给Unity开发者的开发工具,其中包含的Interaction System,是一套脱胎于VR体验应用《The Lab》的交互系统,开发者可以借由这套交互系统,快速开发出常用的VR交互功能。
SteamVR 插件的获取
SteamVR 插件可以分别从Unity Asset Store 和 Github 获取。在Asset Store中,通常只会提供经过广泛测试后相对稳定的最新版本,而在Github中,开发者可以获取该插件自发布以来的所有版本以及即将发布的beta版本。
渠道一:从Asset Store获取
访问网址:https://assetstore.unity.com,搜索栏输入"steamvr"找到该插件,确保使用Unity ID登录,选择"添加到我的资源",然后点击“在Unity中打开”按钮,由于在Unity 2020中,从Asset Store窗口中进行插件下载和安装的功能被移除,此时将自动在Unity编辑器中打开Package Manager,同时定位到在"My Assets"类目下SteamVR Plugin,点击download按钮等待下载完毕,点击Import按钮进行插件的导入。
图1 Package Manager中的SteamVR插件
渠道二:从Github获取
在Github中搜索"steamvr"或访问网址:https://github.com/ValveSoftware/steamvr_unity_plugin,找到SteamVR 插件的代码仓库。在页面右侧,点击链接“Releases”,进入该插件的版本选择列表。如下图所示:
图2 github中的steamvr plugin
在列表中列出了SteamVR Plugin自发布以来的所有历史版本,开发者可选择所需的版本进行下载。在每个版本介绍的底部,选择.unitypackage文件下载即可。
图3 从Github下载SteamVR Plugin
如果开发的项目需要使用早期的插件版本,比如需要使用SteamVR 1.2.3结合VRTK 3.x进行开发的情况——我们知道VRTK在Asset Store中的最新版本(3.x)并不能与SteamVR Plugin 的最新版本(2.x)搭配使用,所以遇到这种情况,只能从Github中下载SteamVR Plugin的旧版本,同理,对于VRTK来说也适用。
新版本 SteamVR 2.x 的主要变化
在SteamVR Plugin 1.x 推出以后,VR生态发生了很多变化,比较显著的是出现了很多不同类型的VR设备以及控制器。随着越来越多的VR设备推出,控制器类型逐渐趋向于碎片化。每当有新的控制器发布,都会给开发者带来一些额外的工作量——游戏项目需要修改交互代码以适配新的设备。从开发层面上来看,不同的控制器具有不同的键值映射,所以,当现有 VR 应用程序移植到另外一个VR平台的时候,需要针对目标平台进行交互适配。鉴于此,Valve为Unity开发者推出了 SteamVR Plugin 2.x(以下简称SteamVR 2.x),能够使开发者在编程中专注于用户的动作,而不是具体的控制器按键。
SteamVR 2.x 的重要更新是加入了 Input System,所有的用户输入均围绕动作Action展开。推出Input System的目的,是为了更加符合OpenXR的标准。Input System与之前处理用户输入有着显著的不同,使用SteamVR Input System,开发者可以在应用程序之外定义默认的动作并与按键进行绑定,而不需要将输入视为某一特定设备的特定按键。这样新的设备可以快速适配应用程序,无需更改代码。比如,当开发者检测玩家是否抓取某个物体的时候,不是检测Vive控制器的Trigger键或Oculus Touch控制器的Grip键是否被按下,而是检测预定义的”Grab”动作是否为True即可。类似在篮球游戏中玩家预先设置"投篮"动作为键盘或手柄上的哪一个按键一样。基于这种机制,不只能够解决控制器碎片化的问题,也可以快速适配未来发布的设备。
图4 在篮球游戏中设置各种动作对应的按键
值得注意的是,Unity同样引入了一套新的输入系统,以解决跨平台(PC、移动、VR)的问题,同样基于动作的输入。可见,使用动作而不是特定按键的输入来处理用户的交互行为,正在成为一种趋势。读者可结合Unity 的 Input System 来学习这种机制的设计思路,以便于更好的理解 SteamVR 的 Input System。
导入 SteamVR 插件
在Unity Hub中,使用Unity 2020创建一个3D项目,如图5所示:
图5 使用Unity 2020创建项目
在Package Manager的My Assets分类下找到SteamVR Plugin,如图1所示,点击右下角 Import 窗口即可开启导入流程。对于从Github下载的插件,需要在Unity编辑器的Project窗口中选择命令Import Package->Custom Package...进行导入。在Unity 2020中,插件导入后将默认安装OpenVR XR Plugin工具包,如图6所示:
图6 插件导入后自动安装OpenVR XR Plugin 工具包
点击OK按钮后,弹出SteamVR设置窗口,该窗口将检测当前项目设置并列出推荐更改的选项,如下图所示:
图7 SteamVR 设置窗口
开发者可以根据项目需求选择接受或忽略对应设置选项,通常情况下,点击窗口底部的Accept All接受所有建议即可。需要注意的是,即使点击Accept All 按钮,在未来的开发过程中,当项目脚本发生改变时,该设置对话框依然会再次弹出,只是在建议设置列表中,仅显示如上图所示的第一项——Show Unity Splashscreen,并建议关闭。接受该选项的目的是关闭显示Unity的启动画面(Splash Screen),而对于个人版Personal用户来说,该选项并不能在Build Settings中将其禁用,如下图所示:
图8 个人版用户无法在Build Settings中禁用 Unity 启动画面
随着开发的进行,频繁弹出此对话框会一定程度上影响项目开发的连续性,要解决这个问题,可以在Project窗口中搜索"SteamVR_UnitySettingsWindow",找到控制设置窗口显示的脚本,双击使用默认代码编辑器将其打开,在第118行处添加代码,强制设置变量show为false,如下代码段中第1行所示。这样在之后的代码中将因为判断条件不成立而不再显示设置窗口。
show = false;
if (show)
{
window = GetWindow<SteamVR_UnitySettingsWindow>(true);
window.minSize = new Vector2(320, 440);
//window.title = &#34;SteamVR&#34;;
}
初次运行SteamVR应用程序(自带示例场景)
SteamVR 插件导入以后,在Unity编辑器的Project窗口将新增三个文件夹,最为主要的是SteamVR文件夹,在这里除了包含这款插件所有的脚本和素材以外,还包含了一个集成度相对较高的交互系统——Interaction System(如图9中1处所示),以及在Unity XR Plug-in Management中使用的OpenVR XR Plugin工具包(如图9中2处所示)。
图9 SteamVR 插件文件结构概览
在文件夹SteamVR_Resources中,包含一个ScriptableObject类型的配置文件——SteamVR_Settings(如图9中3处所示),这里保存了一系列对于SteamVR插件的全局配置选项,我们将在后续开发过程中介绍相关设置。
插件安装完毕以后,建议首先单击SteamVR文件下的readme文件,在Inspector窗口中查看当前版本支持的SDK版本。在开发之前尽量确保SteamVR客户端的版本不低于当前SteamVR插件所支持的SDK版本,如图10所示,如SteamVR 插件版本为2.7.3且支持的SDK版本为1.14.15,则SteamVR客户端的版本尽量保持在1.14.15及以上。关于SteamVR客户端的升级,可以在Steam客户端中进行。
图10 SteamVR 2.7.3 插件发行说明
虽然SteamVR插件能够向下兼容,但是依然会存在由于SteamVR客户端版本过低而导致Unity编辑器报错的概率。
在Project窗口中,路径 SteamVR\InteractionSystem\Samples下,找到场景文件Interactions_Example,这是Interaction System提供的用于演示其部分功能的示例场景。双击将其打开,初次导入插件后可以运行该场景进行体验,如图11所示。同时在后续的开发过程中,可以通过测试示例场景能否运行来初步排除由硬件连接问题引起的项目运行异常。
图11 Interaction System示例场景
在Unity编辑器中点击Play按钮运行应用程序,初次导入插件并运行应用程序时,SteamVR 插件将检测项目是否存在动作以及动作与按键的绑定配置,如果没有,则弹出对话框询问是否打开SteamVR Input窗口,如图12所示。
图12 打开SteamVR Input窗口提示
通常情况下,点击Yes按钮即可。在打开SteamVR Input 窗口的过程中,插件会检测项目中是否存在actions.json文件,该文件存储了项目中动作(Action)与动作集(Action Sets)的信息,在打开SteamVR Input窗口时会读取该文件。如果没有actions.json,插件会建议使用默认提供的示例文件,如图13所示:
图13 将示例文件作为actions.json拷贝到项目中
点击Yes按钮后,插件会将示例文件actions.json以及一些当前主流控制器的按键绑定配置文件拷贝到项目中的StreamingAssets/SteamVR下,未来在程序运行时,也将从此文件夹中读取用户关于动作的配置信息。如图14所示:
图14 动作配置文件的存放位置
经过选择后,此时会打开SteamVR Input窗口,如图15所示:
图15 SteamVR Input 窗口
在SteamVR中,所有的动作按照不同的动作集(Action Sets)进行组织,在SteamVR Input 窗口中,将根据读取的actions.json文件内容,在顶部列出当前项目中所有的动作集(如图15中1处所示),开发者可以对动作集进行创建与删除。
在不同的场景或应用程序之间可以切换使用不同的动作集,比如,应用程序中有一个场景是在地球上拾取并投掷物体,而另一个场景则是在太空中飞行,那么这两个场景可以使用不同的动作集。
选择任一动作集,会在下方的Actions栏中列出当前动作集中包含的动作(如图15中2处所示),开发者可以在此对动作进行添加或删除。选择任一动作,在窗口右侧将显示该动作对应的详细信息(如图15中3处所示),开发者可在此对动作的类型、名称等属性进行设置。
点击SteamVR Input窗口底部的Save and generate按钮,此时SteamVR插件将主要完成两部分工作:首先将动作配置信息保存在action.json文件中;其次,创建或更新以动作集为主体的动作类,便于在开发过程中对具体的动作进行引用,这些类的脚本被存放在Project窗口中的SteamVR_Input目录下,如图16所示。
图16 SteamVR_Input文件夹
需要注意的是,对于创建或修改后的动作,此时并不能够按照预期被系统检测到,需要点击窗口右下角的Open binding UI按钮,打开SteamVR客户端的控制器按键设置窗口完成动作与按键的绑定,我们将在未来进行详细介绍。
关闭SteamVR Input窗口,运行应用程序,此时即可体验Interaction System的示例场景。
下回预告:SteamVR 2.x 中的动作(Actions)。
! 不错不错味道好极了!
页:
[1]