大神教学|如何在VR世界真实行走

VR游戏的设计与普通游戏本身即不相同,不单单是游戏机制的问题,而是在输入方式上有很大区别,比如手机端用触屏、电脑端用键盘鼠标、而VR端用头控+按钮。下面我会介绍VR场景的基本搭建过程,以及所搭建场景由于在实际场地大小的限制下,如何实现不影响游戏体验的行走模式。一、VR场景的基本搭建

由于VR根据承载眼镜不同,所需要的SDK(软件开发工具包)也是不同的。下面就以最常见的Google CardBoard为例来介绍VR环境的搭建。用Google Cardboard肯定需要下载GoogleVR SDK,从下图来看,大家可以任选Android Studio、Unity、Unreal、Xcode之一进行下载。不过Unity和Unreal的版本对于新手开发会更加可视化,毕竟Android Studio和Xcode是一个纯代码的开发环境。

当然,大家可以根据自己的预算选择实现VR的设备,比如我用的是苹果手机、Mac电脑、安装了Unity,还有一个千幻六代盒子支持内置耳机。下面我以Cardboard+Unity+IOS的开发为例:

1.在Unity官网下载Unity 2017以上版本,安装时需选择IOS Support

2.在Google VR官网上下载SDK

注意的是SDK版本更新换代很快,因此要看清楚官网的更新资料。在unity中导入最新SDK,路径如下:SDK assets→import package→customer package→Google VR SDK。

3.打开Demo文件夹中的Scenes,我们就可以体验Demo场景了。

4.在选择play模式播放后,我们可以按Alt和Ctrl键来模拟头控动作:

5.运行后的玩法:通过移动准星使方块变色。(注意这里的移动是通过Alt和Ctrl键加鼠标移动来模拟头控。)

以上通过官方Demo,我们体验了VR游戏的玩法,如果大家要实操的话,我们该怎么用SDK呢?比如,当我们来到一个森林的场景,拖入GvrEditorEmulator(在VR游戏中它相当于第一人称视角)跟随一个Camera(这里摄像机视角即为第一人称视角),这样就可以实现基本的VR头控了。而其他的行走抓取功能需要理解sdk里面的参数功能,然后使用脚本语言配合输入,下面讲解两种常用行走模式。

二、以传送点为导向的行走模式

VR的行走方式并不像普通游戏那样容易,没有上下左右键来控制,也不是想当然的搭建游戏杆就可以控制的。

我们可以看到在上面这个场景中,有一些黑色音符传送,整个空间是一个简陋的展馆。当然同学们可以同位替换传送点(上图中的黑点与黑色音符)的外观、展馆的造型和环境,甚至后续的渲染都不是难题。当我们具体进入游戏后,会出现下面这个场景:

一般看到左右两个窗口存在视差的游戏界面,就说明输出之后即为VR模式。界面中的准心遇上传送点后会变成放大的圆圈,就说明准心与传送点可以发生交互行为,即接触后可瞬移至传送点位置。

当然每个传送点都要加载一个简单的代码,重点功能从第11行开始,当传送点和玩家进行交互时,玩家的x和z轴的位置会变成传送点的位置,而y轴不变(即在平面上发生位移)。我们看到如果只是位移上的变化,代码和普通游戏一样。这也是大部分VR体验馆游戏的行走模式,有的甚至是原地不动,比如我们上面提到的官方Demo的游戏机制。

三、以自动行走为导向的行走模式

以自动行走为导向,就是通过准心点击开始行走和暂停。这种行走模式稍微能够多一点自由行动,不会像传送点模式一样需要一次次的点击才能完成移动。

我们看到上图场景中没有传送点,只有摄像头和障碍物(墙)。这里摄像头充当第一人称视角在画面中行走。如下图进入游戏中的视角,与上图场景中摄像头的视角完全相符。

我们需要在摄像头附上自动前进的代码,在第10行开始正文内容,表明如果touch大于0次,摄像头就会向前移动。但是上面这份脚本不会自动根据点击停止前进,而下面的这份脚本是添加了点击停止的脚本代码。

在这份脚本中,多了第27行input Fire1这样的描述,其实就是当按下ctrl键时,前进动作停止。这时候有同学会问为什么Fire1就是ctrl键。这时候就需要对应到Unity中的Input Manager了。

这里我们就可以看到,在Input Manager的设置中Fire1=Left Ctrl, 而我们前面又提到Ctrl在VR游戏里是用来模拟头控的,这样一来我们就能够理解为什么按下Ctrl键时前进动作会停止了。

以上,我们介绍了Google Cardboard VR游戏的环境搭建,以及两种行走基本模式。虽然目前VR技术仍有一定局限性,但不可否认它在一定程度上改变了人们对新事物的认知。当然,VR游戏也只是VR应用的一个开端。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();