Unity VR游戏开发干货教程:VR中的运动
发表于2016-09-07
GameRes游资网授权发布 文/王寒
对于VR应用来说,除了之前所提到的没有实现目标帧速,VR场景中的运动也是导致VR眩晕的重要原因之一。因此在产品中具体解决这个问题时,需要慎重考虑。最好从产品开发的早期,甚至是在概念设计阶段就考虑清楚这个问题,因为如果所选的运动解决方案导致了用户的恶心不适(nausea),会严重影响用户体验。
VR中的nausea(恶心不适)和舒适度
VR应用最恼火的问题莫过于恶心眩晕,也就是所谓的晕VR。导致这个问题的根源是,在现实世界中玩家的身体处于静止状态,但是他们的视角却在虚拟的环境中移动。(幻动)现象也与此密切相关,但是应尽可能的避免。
通常来说,一个基本的原则是避免移动摄像机,除非需要使用它来复制玩家的运动,或是不这么做会导致所谓的前庭觉问题。简单来说,所谓的“幻动”现象是指用户的大脑被来自眼睛、耳朵和身体的冲突信号彻底搞糊涂了。此时人的大脑会感觉到自己“中毒“了,此时就会引发和中毒类似的反应-呕吐恶心。当然,和任何事情一样都存在例外,因此在开发游戏的过程中,需要尽可能对不同的用户做测试。
值得注意的是,对允许使用空间跟踪的某些VR系统,比如允许在房间里面来回走动的HTC Vive来说,因”幻动“现象引发的呕吐恶心现象不是很明显。不过作为开发者仍然要注意,当用户在虚拟环境中运动的时候,不要破坏了来自身体各个感官的平衡。
目前来说,最舒服的VR体验是静止的,简单来说就是让用户坐在某个固定的位置。因此装甲炮塔类的游戏在VR中非常流行:比如我们在示例中提供的Shooter 180(Target Gallery)和Shooter 360(Target Arena)场景就展示了此类游戏。
VR中的第一人称游戏
传统的第一人称角色控制方式,比如使用鼠标、WASD键或游戏手柄很容易导致恶心,因此我们应该尽量避免使用。如果开发者打算在游戏中使用第一人称控制,最好测试尽可能多的用户,并绝对禁止转头。我们可以参考下disabling yaw,并使用snapping旋转来替代,也可以考虑同时使用快速的摄像机消隐。关于quick fade和snapping rotation的更多信息,可以看看CameraOrbit组件。
如果我们在游戏中需要实现玩家的运动,不管是因为技术原因(比如Maze这个场景),或是其它原因,那么注意保证向玩家提供一个静态的视觉参考物,比如飞船的驾驶座舱、汽车的内部座椅,或是类似的东西。关于座舱方面的实际游戏案例可以参考Radial-G ,Lunar Flight,还有Titans of Space。
VR中的淡入/淡出和闪烁渐变
在虚拟的环境中实现运动的一个常用方法是使用淡入淡出或闪烁渐变,比如快速淡出到黑色,将摄像机移动到期望的位置,然后再淡入。除此之外,还可以考虑更复杂的方法,也就是使用闪烁渐变。关于这一点的具体说明,可以参考Oculus Connect 2014上的Tom Forsyth的讲解。
VR Samples示例项目场景中的运动
在本系列教程的第二篇中我们曾提到,开发者不能直接在Unity中移动摄像机。如果要移动摄像机,需要将其设置为游戏对象的子对象,然后根据parent对象的transform来更改位置和旋转。
我们需要确保用户在VR Samples项目中能够获得舒适的VR体验,因此大多数的场景都不包含摄像机的运动。不过在Flyer和Maze场景中都包含了运动:让我们一起来看看其中包含了什么杨的运动,以及为何我们会选择这种运动。注意到,在Menu场景的用户界面中,我们将此类场景标记为“Comfortable for some(仅部分人会感到舒适)”,而不是“Most(大多数人会感到舒适)”。虽然我们不能在VR发展的早期就把大多数人排除在外,但是向用户坦承他们可能遇到的麻烦会更靠谱。
Flyer 场景中的VR运动
在Flyer场景中,摄像机以恒定的速度向前飞,当摄像机从介绍界面淡入后就会一直保持运动。因此我们不会感觉到突然的加速,而加速往往是导致恶心现象的罪魁祸首。
为了进一步提升用户体验,我们让飞船的尾部显示轨迹粒子特效,粒子在场景的边缘运动,从而有助于让玩家获得对速度的感受。此外,玩家还获得了一种视觉参照物,从而更好的避免恶心现象。
当然,想获得类似的效果,还可以让摄像机保持静止,然后让所有的东西相对于摄像机运动。
Maze- 桌面风格游戏中的VR运动
Maze场景是桌面风格游戏的示例,其中摄像机看起来处于固定的位置,玩家可以使用swipe来旋转迷宫。
但是因为我们使用lightmapping和NavMesh让游戏角色在迷宫中漫游,就不能旋转桌面,因为它们需要依赖被标记为静态的对象。为了解决这个问题,我们使用了下面的对象层级。
VROrbitCamera对象被放在迷宫的中央,而MazeUnityLogo对象则放在迷宫的一角,MainCamera放在另一角。
通过这种方式,我们就可以旋转VROrbitCamera对象,并让子对象围绕迷宫的中央旋转。Unity的logo用作玩家的视觉参照物,让我们误以为只有桌面在旋转。
为了实现这种旋转,VROrbitCamera提供了两个组件:
CameraOrbit,可以处理旋转
Rigidbody,可以方便我们调整质量和阻尼参数6
CameraOrbit组件有三个重要的Orbit Style选项:
Smooth(平缓)-这也是我们在项目中所使用的选项。旋转该选项可以平滑的旋转桌面,同时对运动有个缓慢的阻尼效应。我们可以调整Rotation Increment和RigidBody的属性来获得不同的运动速度、阻尼效应和摄像机的旋转量。
Step(分级)-如果想立即旋转到下一个位置,就可以考虑这个选项。调整Rotation Increment参数可以调整摄像机的旋转量。
Step With Fade(分级加淡入淡出)-和分级旋转的方式类似,不过同时会让摄像机快速变黑,然后再淡入。通过让摄像机快速淡出,调整摄像机的位置,然后再淡入,可以让用户在VR环境中运动,同时又不导致恶心现象。我们可以调整Rotation Fade Duration参数来设置每次淡入淡出的时间间隔。
总的来说,在开发VR内容时,我们必须慎重对待玩家的运动,并避免恶心眩晕感。我们强烈推荐大家仔细阅读Oculus关于Simulator Sickness和Motion的相关说明。
Shooter 180/360(Target Gallery/Arena)中的VR运动在这两个示例场景中,我们使用跟踪头部旋转来控制运动的输入,以及简单的射击开火输入。需要注意的是周围的环境并没有随着玩家的运动而变化- 目标会在静态的环境中出现,让玩家可以瞄准射击。
这些场景在Menu场景中标记为“Comfortable for most(大多数人会感到舒适)”,因为这种游戏机制几乎不会引起玩家的nausea(恶心眩晕)。