如何使用Unity 5等免费工具做创意原型
虽然到目前为止,仍然没有一款非常成功的 VR 硬件,也没有一款虚拟现实游戏大作,但 VR 这个单词绝对是 2015 年最热门的话题之一,不仅如此,资本界和传统游戏发行商以及平台运营商纷纷加入这个新兴的市场,甚至出现了多次十亿美元级别规模的并购。所以,不论如何,虚拟现实都已经开始出现了起步,其中不乏 Valve、HTC 三星、谷歌以及 非死book 等大公司的入场,而且这几家公司都将在近期内推出 VR 硬件。据 SuperData 的数据估计,VR 市场预计将在 2019 年达到 159 亿美元的规模。
但是,另一方面,由于硬件和软件技术的限制,目前高质量的 VR 体验仍然需要解决很多的问题,而很多正在为之研发游戏的主流工作室都承认,他们自己都不知道在做什么。这其实就像是当时的《毁灭战士(DOOM)》和《德军司令部(Wolfenstein)》一样,没有人知道一个好的 VR 游戏到底长什么样,而且这个领域如今依然等待一些独立工作室成长为该领域的领导者。如果你想要做游戏,那么 VR 可能是一个不错的机会。
所以,我们假设你希望做 VR 游戏,如今的工具已经比以往任何时候都更加对用户友好,而且大多数都是免费的。但是,你该从哪儿开始呢?别着急,这份博客会提供给新手开发者所有需要的工具,而且完全是免费的。
所以,我们下面就开始讲述具体的内容:
你需要准备什么:
想要开始做 VR 游戏,你只需要 3 样东西:
首先,你需要有 VR 头戴设备,目前销量最多的硬件是 Oculus Rift DK2,售价为 350 美元;
第二,你需要一个性能相当不错的 PC,虚拟现实游戏的资源占用是普通 PC 游戏的三倍,所以一定要有强大的 CPU 和显卡,Oculus 的推荐是 i5+GTX 970 或者同等配置,外加 8GB 的内存条。
第三,你还需要最新版的 Windows 7/8/10 系统。
除此之外,你所有需要的东西都是免费的。在软件方面,我们要使用的是:
Unity 5 个人版、The GIMP(Gnu Image Manipulation Program)软件、StreamVR 的 Unity 插件、Primitive Plus 的 Unity 插件、Oculus Windows Runtime。
安装你的工具
首先,我们把所有东西都安装好,下载并运行 Unity 安装器和 GIMP 软件,这都是自解压的程序,当你首次打开 Unity 的时候,它会提示你创建一个帐号,你需要有一个帐号,只是要记得用户们和密码。
在 Unity 里,创建一个新项目(注意是 3D 项目而不是 2D),把目录指向我的文档/My Project 文件夹。
然后,用浏览器进入 Unity Asset Store 商店,登录用户名,这时候,你可以获得开发者工具和资源。使用 Primitive Plus 和 SteamVR 链接以上工具,找到安装文件夹,点击‘用 Unity 打开’按钮,由于这些都是免费资源,你不需要投入一分钱,不过其他东西可能不是免费的,所以在选择的时候需要谨慎。按照弹出的提示,把这些安装包导入到 Unity 里。这时候,你应该可以从 Project 子目录看到新的文件夹。下载这些资源可能需要一点儿时间,所以要有耐心,在按照、导入完成之前不要关闭 Unity 软件。
用 Unity 进行 Scripting
如果你之前学过编程的话,那么 Unity 用起来是非常容易的。如果你不熟悉 C# 语言,可以通过以下新手教程进行初步的熟悉,如果你之前任何编程都没有做过,最好也看一下这个简单的教程,然后解决 Project Euler 上的谜题,这可以让你熟悉在编程中将会遇到的问题,这些都是你需要的问题解决技巧。
C#新手教学
在你熟悉了用 C# 解决问题之后,我推荐投入一些时间探索 Unity,你可以通过他们做的非常不错的新手引导教学,也可以付费参加 Unity 高阶课程。在这片博客中,我会为所有用到的组件进行简短的解释,但是,要做大的项目,你还需要看 Unity 的教程,因为它包含了很多有价值的信息。
为了使用 Unity 脚本,你首先需要添加一个 Object,在编辑器里,你可以用三种方式当中的一个创造 3D 物体:作为安装包直接导入;拖拽文件夹到 My Project/Assets 文件夹目录下;通过屏幕顶部的 GameObject 菜单用编辑器创造, 你可以通过这个方法做简单的形状,比如方块和球体,也可以创作文本和粒子。
如果你选择导入,或者把它们拖拽到资源文件夹,他们就会出现在 Project 的附窗口内,你可以通过选择 Scene 进行选择然后把它们直接拖拽到游戏里。然后你就可以在游戏中看到这些物体。左上角的控制键可以让你对这些物体按照自己的喜好进行扩展、旋转或者定位。这些物体可以作为其他物体的父物体,只需要在 Hierarchy 标签下把它们的名字推拽到其他上面即可。
一旦物体出现在场景中之后,你可以为之添加一个或者多个脚本,这些脚本可以让物体栩栩如生,比如可以让枪开火、子弹运动还可以让角色行走和说话。
想要增加脚本,在 Scene 界面或者 Hierarchy 标签下选择你想要控制的物体,Inspector 标签可以显示所有与该物体相关的组件,一个普通物体通常看起来会是这样的,而且包含以下元素:
一个可以让引擎知道物体是什么形状的 Mesh Filter 滤镜;一个把物体描绘到屏幕上的渲染器;一个可以让物理引擎知道物体存在并定义其属性的 Rigidbody;一个定义物体物理边界的 Collider:你可以通过给一个复杂的物体赋简单的 collider 让物理计算更容易,比如一个箱子或者球体。
从 Inspector 标签下,你可以通过底部的 Add Component 按钮添加新的脚本。从这里开始,你既可以增加一个已经创造好的脚本,也可以做一个新的。把语言切换成C#,输入你想要的名字,然后点击创建,这就会给物体增加一个空白的脚本,在 Inspector 标签下双击脚本名字会直接在 MonoDevelop 里打开这个脚本,这也就是 Unity 的代码编辑器。
在你的新文件里,你会看到一个 Start 和 Update 功能,Start 是当物体首次被创造的时候运行,这时候要做所有需要的创建步骤,Update 则会一直运行,这里也是大多数的逻辑运算需要进行的地方。
为了获得物体组件,你可以输入 gameObject.Renderer、gameObject.rigidbody 等等,主要取决于你希望控制的元素是什么。在 Start 运行之前调用的公用变量将会出现在编辑器中,所以它们变得更容易调整。为了获得如何与更多系统元素互动的信息,你可以去查看 Unity 使用指南。
这是我创造的一个简单脚本,可以让物体按照正弦波进行有节奏地伸缩。在 Unity 里创建一个方块、增加脚本、复制脚本到 Update method。然后你可以在编辑器里保存并点击 Play 按钮,这时候你应该可以看到方块不断地伸缩,要确保 Camera 物体放置在合适的位置,这样它才能看到物体。
开启 VR 模式
现在,我们创建了一个基本的 Unity 场景,那么下一步我们把它展示到你的 VR 头盔中,这时候,我们需要用到 SteamVR 插件,它既可以对 Oculus Rift 也可以对 HTC Vive 进行渲染,并且两种方式用起来都很方便。
在 Project 标签下,进入 SteamVR 文件夹,打开 prefab 子文件夹,你会看到一些可以使用的对象。拖拽 CameraRig 和 SteamVR 预制件到场景中,这些已经包含了你所有需要的东西,把它们移动到你的场景中,放到同一个点,只有移动了它们,你才能看到方块。现在,删除原来的 cemera 物体,如果在场景中存在多个活跃的 camera 会导致 trigger 错误,因为 Unity 不知道你想用哪一个。
这时候,如果你还没有安装 Oculus Windows Runtime 的话,这时候就可以进行安装了,然后把它连接到你的 DK2。
r/Oculus 是一个非常不错的资源,demo 场景应该很流畅地运行,然后追踪头部的旋转和定位,既没有 jerkiness 也没有双图像。
如果它运行正常的话,确保你的 Camera 能够看到你,而且要确保它是正确的。还要确保你的显卡足够强大、后台没有运行特别占资源的应用。
一旦确认了 VR 头盔运行正常以后,打开 Unity 并点击 Play 按钮,我们做的简单场景就可以出现在你的 VR 头盔中了,恭喜,你做出了第一个 VR demo。
做第一个 VR 游戏
到目前来说,这一切看起来都是很简单的,但是,这个 demo 其实并不是很好。为了让你们体验更好的项目,接下来我会讲述制作一个完整 VR 街机游戏的过程,这是我已经完成了的项目,它叫做 ASteroidVR。
这并不是《Skyrim》那样的大作,但至少是一个可以玩的完整游戏,有可以使用的图形和完整的一套玩法。我做这款游戏用了几天的时间,而且属于证明概念型的 demo 级别,你将会用不同类型的游戏进行很多的尝试。
这个游戏其实很简单:你将驾驶一艘被困在大房间里的船,这艘船会按照常速移动,你可以驾驶和射击,但没办法停止。这个房间会慢慢地被随机尺寸的小行星所充满,它们会在房间里无目的的弹跳。你需要做的就是避免撞到这些小行星,也不要撞墙,保持尽可能长的时间。你可以对小行星射击,但你如果打光的话,你弹夹装弹速度会很慢。
这就是该游戏的基本理念,所以,我们不妨从下面开始讲如何制作。由于这只是一个 demo,所以我们只用简单的初始图形,比如方块和球体(使用 Primitive Plus 资源)。
船
这就是我创作的船。
我承认,它看起来更像一个铲车,但至少对于这个 demo 来说够用了。
当创建驾驶员座舱的时候,确保为用户视角做一些明显的结构,特别是在边缘部分。这可以避免用固定的元素、减少他们需要移动的感觉,避免让玩家产生动态眩晕感。这样,他们的大脑就更容易处理缺少移动的情况。
我不得不尝试了多个驾驶员座舱,直到找到了一个不让我感到眩晕的为止。当你有所怀疑的时候,增加更多的支杆,把摄像头移到背后。这时候放大一定要谨慎,因为你在 Unity 增加一个单位,在 VR 里就是多了一米,所以一定要注意你创造的物体大小,因为你做的物体很容易在 VR 里看起来太大或者太小,而一旦做好了之后,这些问题就没法解决了。
在完成了船的打造之后,在它的周围做一个方块,并且把船的所有 Primitive 都与之链接,这样可以作为一个 Collision 盒子与运动中心,为外部的方块增加 rigidbody,禁用渲染(只要不在 inspector 中检查即可)。确保 rigidbody 已经设置好,这样 kinematic 和 use gravity 都会被禁用。为船的每一个 Primitive 增加另一个 rigidbody,这次要把设置调整为 kinematic,但要关掉 use gravity 选项。
移动 CameraRig 和 SteamVR 物体到驾驶员座舱内,并且把它们固定到用户的头部在船內的位置,这时候我会用 Unity 的另一个免费资源确保位置摆放正确(仿真机器人),把它们父级化(parent)到外部的方块,这样就会让他们的移动跟随物体一起移动。
然后为船写脚本,以下是我创造的两个脚本,Vehicle Controller 和 Vehicle Destroyer。第一个脚本是从用户那里读取输入,为船体提供推力,确保船体移动。第二个用于侦测船和一些标签为石头的物体相撞的时候,一旦发生碰撞就终止游戏。为了增加更多的乐趣,它还会把船体拆分成各种组件,让你看到他们在碰撞中四散开来。这个脚本会创造一系列的 object,你需要用船的属性进行填充,当然,是在编辑器内做。
这个脚本还会在玩家死亡的时候展示一些指导教学,创造一个 TextMesh GameObject,然后把它设置为提示‘你已经死亡,射击以便重新开始’,把这个 TextMesh 放到驾驶员座舱内,把它父级化到船体上,禁用它的渲染组件。然后拖拽到 Inspector 里的 VehicleDestroy 脚本 instruction 变量中,正常情况下你是看不到文本的,但在角色死亡的时候会再次出现。
小行星
下一步,我们来创作行星。这是我做出来的一个行星,主要是通过把一些属性放在一起做成的,使用了标准的着色器,没有使用任何复杂的功能,但它看起来还不错。
我增加了一个 rigidbody,把它标记为 Rock,如果你不熟悉 Unity 的 tag 系统,最好是了解一下教程。基本来说,tag 可以让你把特殊的属性附加到对象上,这在撞击的时候可以被侦测到,让脚本知道他们在和什么互动。在这个案例中,tag 会导致船目标侦测到它撞到了危险的东西。
然后给行星做脚本,这里的脚本是 AsteroidInit,主要做两件事。首先,它会对行星进行随机化大小,让它们看起来是有区别的,并且每一个都从不同方向出现。其次,它会侦测行星是否会被标记为子弹的物体击中,如果被击中,那么它就会激活附属的粒子发射器,把原有的对象破坏掉。
竞技场
非常好,这两个基本的游戏元素已经做好了,下一步,就是做竞技场。它可以是你想要的任何形状,但确保它足够大,因为如果让人们在小圈子里转的话,他们很容易不适,通常来说,直接飞行的方式相对没有那么大的负面影响。把所有的墙体都标记为 Rock,确保当船体撞到的时候就会被撞毁,这就是我最后做出来的竞技场:
你会注意到,这些墙体都带有一个简单的 placeholder texture,我是用 GIMP 做的。大多数情况下,我设计这个游戏是用无特色审美观确保其简单性,然而,我发现当冲向一面墙的时候很难被告知,很容易出现问题。所以,为了配合玩法,我给它们加入了 texture,我还为竞技场增加了粒子发射器,确保它可以告诉你在靠近一个对象的时候是如何移动的。幸运的是,竞技场看起来非常被动,所以它们并不需要脚本。
最后,创造一个 Primitive 数据并且把它放到墙体上。
这将会成为你的行星掉落点,为之增加脚本,你会注意到的是,脚本调用的是 Asteroid GameObject 变量,这在编辑器里是可以看到的。在编辑器里把你的行星对象拖拽它的上面,这样你就可以产生无数个行星,频率大概是每秒一个,给游戏增加缓慢增长的难度曲线,把最初的行星放置到很远的地方,避免它会偶尔被破坏或者带来任何问题。
HUD 和枪支
这时候,游戏的基本对象都是可玩的了。现在,我们给游戏增加一些第二功能,让游戏变得更有深度。这个脚本是和 TextMesh 放在一起的,可以记录玩家在游戏里活了多久。第二个脚本与一个文件互动,确定你的最高分数,当你重启的时候就会看到,这时候,一个简单的排行榜系统就出炉了,这可以给玩家创造一个目标。把这些都放置到驾驶员座舱内可以很容易看到的位置。
最后,我们需要加入玩家使用的枪支,为船体增加枪支对象,这其实也并不复杂,把脚本拖拽到枪上,你还需要链接到子弹对象,它可以是带有 rigidbody 和子弹标签的任何物体。把它的颜色调亮,这样才能做到可视化。把这个脚本增加到另一个 TextMesh 中,把它放置到驾驶员座舱内,以便玩家很容易看到。
最后的调整
做到这一步,游戏基本上已经完成大部分了,游戏所需要的所有基本元素都已经完成了,现在是时候测试了,你可以改变行星的尺寸范围,竞技场的尺寸和范围、船行的速度,ammo 的量、装弹频率以及冷却时间等等。你可以用船的方式进行处理。如果你希望这么做,并且具有一些 3D 模型技巧,那么你甚至可以取代我的编程美术资源,使用真实的资源做一个更好的游戏。最重要的是,一定要多试验几次,确认怎样让你感觉良好,而且测试者没有不适感。
如果你希望了解完整的 Unity 项目并且进行使用的话,你可以自行下载,如果你只是为了像我一样做个可玩的游戏,那么只需要简单地下载一些东西就可以了。
做你自己的 demo
如果你一直用自己的教程做游戏,并且有时候遇到了不理解的东西,那么你可能最后要非常好地处理用 Unity 做 VR 游戏的基本操作了,如果你想更近一步,那么最好是做足准备。
也就是说,VR 游戏研发和传统游戏相比是完全不同的,所以我会说一些比较通用的 VR 游戏研发建议,主要是为了让 VR 游戏设计更舒适,还可以充分利用媒介的优势。
动态传感
首先而且最重要的是,矫正用户的头部动态传感,不要放大物体,把它覆盖起来,改变视角,或者加入一些基本的东西,否则的话就会和基本元素混合。Oculus 和 Valve 都在避免让人们产生眩晕方面做了大量工作,除非你手中有一些感知心理学的书籍,但你并不一定要容忍这些,没有什么比一个十米大的物体卡在你脑海中 10 秒钟以上更能够带来不适感了。
同样的,做动态传感也需要仔细,让人们出现不适感的最主要原因是,当他们的眼镜受到了动态信息之后,但内耳并没有收到。总体来说,确保动态传感缓慢而稳定。加速应该是瞬发的,旋转应该是最小化的。当旋转必须发生的时候,给玩家提供固定的点位作为周围视野的参照。如果可以的话,最好不要做带有传感的游戏,你在单个房间里可以做很多非常酷的东西,或者也可以使用微型对象,这样的游戏体验就会变得更加舒适和愉悦。
UI 设计
很多人在做 VR 游戏的时候,理所当然地希望把物体都放到玩家头部周围,就像是军用 HUD。不幸的是,这种方法被证明是不太好用的。当你的眼镜专注于任何游戏世界里比较远的东西的时候,离你头部近的对象就会变成像素级的图像,另外,盯着太近的物体看会让眼睛疲劳。
为避免这种情况,你要尝试把 UI 尽可能放到游戏世界里,可以把《Dead Space》作为参考,你会看到在 AsteroidsVR demo 里,所有的 UI 都是围绕驾驶员座舱的,因为这是玩家周围的空间,所有的 UI 都看起来非常舒适。
同样,要注意文本,目前的 VR 头盔分辨率都非常低,特别是当你计算他们占据多大视野的时候,这意味着文本可能是很难阅读的,所以,尽可能不要依赖它,你所提供的文本应该足够大,在普通视角下可以阅读就行了。
图形优化
你需要记得的是,VR 是非常增强型的体验,DK2 需要运行在 1080p、3D 和 75FPS 帧率条件下,消费者版本的 Rift 和 HTC Vive 都会运行在更高分辨率和帧率的状态下。如果不能达到这样的帧率,将会导致出现双屏闪烁的视野,这是让人很沮丧的,也很容易分心并导致眼疲劳。
因此,你对于性能的设计要比平常更谨慎,这意味着要降低 poly-count,最小化图形效果,使用简单的模型,确保光源最小化,禁用动态阴影并且尝试用同样的材料做尽可能多的对象。在 Inspector 里,你还要把所有不变化或者移动的对象标记为静态,这样 Unity 就可以更容易把它们组合到一起并节约性能。如果可能的话,在游戏设计方面做限制,可以为游戏设计成卡通风格。总体来说,如果你可以在不伤害游戏的前提下减少视觉效果,那最好就这么做。
该规则唯一的例外就是抗锯齿,在每个人的眼中,他们看到的锯齿都不一样,这样会导致 3D 效果降低,引起眼疲劳。所以,你要尽可能多的使用抗锯齿功能(我推荐用 MSAA),还要避免出现高频率视觉细节的纹理,比如树叶、微粒或者远处复杂的纹理。
有些视觉效果是不适合 VR 的,即便你可以做,也最好不要用。
在做后期效果处理的时候要谨慎,比如鲜花盛开,它们本身就会带有立体视差。
还有,你需要意识到的是 3D 会让一些常见的视觉欺骗看起来非常糟糕。普通地图、游戏里的主要物品在 VR 里近看的时候都是平的,用于爆炸效果的 billboard sprite 看起来也是平的,而且这会破坏游戏的沉浸感。同样,很多用于渲染碎片或者植物的 sprite 技术看起来也是扁平和别扭的。
最后,要提防透明物体,现代的渲染引擎在追踪同一个场景中的透明物体的深度方面是有问题的,所以,你要避免从一个透明物体可以看到另一个透明物体的情况。
或许你会发现,在去掉了所有的图像效果之后,你的游戏看起来有些单调,可以尝试使用光贴图和环境遮挡。光贴图可以直接把光照 bake 到地图的纹理层中,这对于所有不移动的物体来说都是不错的,可以给游戏世界增加更多的深度。对于动态物体,比如游戏角色,开发者们可以考虑使用 Shadow blob 纹理创造环境遮挡。它并不是完全现实主义的,但非常有帮助。
随着时间的进展,这些技巧可能都没有那么必要,但目前来说,你还是需要充分利用这些特点来节约性能的。
尽早并且频繁地实验
我最重要的建议就是,忘掉你的先入为主的成见,VR 和我们之前做过的游戏都不一样,有些优势和限制是所有人都无法预测的,有些在纸上看起来很好的想法,但实际用的时候却是很糟糕的。有些最受欢迎的 VR 体验也变成了非常奇怪的东西。
VR 是一个全新的媒介,没有人完全理解它的规则。在传统的游戏领域,我们非常清楚如何做 FPS、RPG 等类型的游戏,这些基本的内容已经非常固定的,这些都是非常固定的规则,每一个新游戏都是一种提高,但通常并不一定是新的内容。在 VR 领域,除了新类型之外就没有什么是新的了,目前这个领域还没有被完全开发,没有人知道他们自己在做什么。
这让人非常兴奋,但它也意味着你必须做到灵活,如果你有个非常不错的想法,那就立即去做,尽快做一个创意原型,然后看是否有效果。但是,也要做好失败的准备,如果你的想法不够有趣或者游戏让玩家感到不适,那么就放弃并且开始新的想法。
最好是每周都做一款新游戏,或者每天也可以,直到你挖到金矿为之。你做的失败的创意原型越多,那么你做出非常酷的游戏的概率就越大。要做非常奇怪的游戏,没有人知道什么是有用或者什么是没有用的,所以要广撒网,有时候后来被证明是精彩游戏的想法会让你都吃惊。
所以,是时候尝试做一些新游戏了,以上就是博客的全文了,祝你们获得有趣的创作体验。
来自: 游戏大观