Unity AR/VR开发:从新手到专家
上QQ阅读APP看书,第一时间看更新

1.1 常用3D引擎介绍

在本节的内容中,我们将介绍什么是游戏引擎、游戏引擎是如何产生的、游戏引擎的基本架构是怎样的,以及主流3D商业游戏引擎的对比分析。

1.1.1 什么是游戏引擎

顾名思义,游戏引擎就是用来开发游戏的软件框架。游戏开发者使用游戏引擎开发各种平台的游戏,包括掌机游戏、主机游戏、PC游戏、手机游戏和VR游戏。

很多游戏引擎都提供了一整套的可视化开发工具以及可重用的软件功能。这些开发工具通常以一种集成开发环境(IDE)的形式提供,让开发者不必从零开始“造轮子”。游戏引擎有时候又被称作“中间件”,给开发者提供了极大的便利和灵活性,可以有效地提高开发效率,降低开发的复杂度,缩减开发成本。

游戏引擎的核心功能通常包括用来生成2D或3D画面的渲染引擎(渲染器)、用来模拟真实世界物理法则的物理引擎(或者碰撞检测),此外还可能包括音效、脚本、动画、人工智能、网络、流媒体、内存管理、线程管理、本地化支持、场景视图和全景视频支持等。

在游戏引擎出现的“史前时代”,游戏开发者的日子非常不好过,大家对游戏开发者的能力要求比其他类型软件的开发也更高。以早期的Atari 2600游戏机为例,游戏开发者必须精通硬件底层,包括如何合理使用和显示相关的硬件,并熟悉相关操作系统的内核。苹果公司创始人乔布斯的第一份工作就是给Atari公司做游戏。当然,为其他设备平台开发相对容易些,但即便开发者可以无视显示部分的底层架构,内存的限制和调用又成了开发者头上的紧箍咒。

在整个20世纪80年代,真正意义上的游戏引擎并未诞生。尽管如此,也出现了一些用来开发2D游戏的类引擎系统,其中就包括了ASCII在1988年推出的RPG Maker。

进入20世纪90年代,一代游戏大神John Carmack创立了id Software,并把目标投向3D游戏的研发。在他的带领下,id Software接连推出了《德军总部3D》、《毁灭战士》、《雷神之锤》等惊世之作。在开发这些游戏的过程中,John Carmack史无前例地采用了自己独创的3D游戏引擎。以《毁灭战士》为例,其软件架构可以清晰地分为三部分:核心游戏组件(如3D图形渲染系统、碰撞检测系统、音效系统等)、美术资源和游戏场景,以及和玩家游戏体验紧密相连的游戏规则。通过使用游戏引擎,游戏开发者得以在游戏核心架构不变的情况下设计自己的游戏画面、人物角色、武器和关卡,也就是所谓的“游戏内容”或“游戏资源”。游戏引擎把和游戏内容本身无关的碰撞检测机制、渲染等独立出来,从而让开发者可以专注于游戏内容和机制的设计。

在id Software的《雷神之锤III竞技场》和Epic Game于1998年推出的Unreal游戏中,开发者都采用了类似的理念,也就是将引擎本身和游戏内容区分开来。游戏引擎本身和游戏内容一样开始具备独立的商业价值。在这个时期,高端的商业引擎开始出现,比如Epic Games推出的Unreal Engine(虚幻引擎)。这种高端商业引擎虽然授权费动辄数万甚至数百万美元,但可以让多个公司使用,以快速开发自己的游戏内容。从这个角度来看,游戏引擎推动了整个游戏行业的发展。

随着游戏引擎技术发展的成熟,引擎界面和操作流程对开发者来说也越来越友好,引擎本身的应用领域也越来越广,从传统的游戏开发拓展到其他领域,比如视觉设计、培训、医疗、军事模拟和建筑等。与此同时,除了传统的游戏主机、掌机和PC,游戏引擎开始支持更多的设备平台,包括智能手机(Android手机和iPhone)、网络浏览器和VR设备等。

此外,大多数的3D游戏对GPU的资源要求与日俱增,也受限于显卡性能的桎梏。但考虑到提高开发者效率的需求,越来越多的游戏引擎不再需要开发者使用C语言或C++语言开发,而是使用更高级的编程语言,如Java、C#、Python、Lua等。

1.1.2 游戏引擎架构基础

由Jason Gregory撰写的非常经典的《游戏引擎架构》一书,将游戏引擎分为工具套件和运行时组件两部分。这里仅作简单的介绍。

图1-1显示了一个典型3D游戏引擎的运行时组件,它由以下一些大的模块组成。

图1-1 游戏引擎架构图

(1)硬件层(Hardware)

该层代表执行游戏的游戏主机系统,包括基于Windows或Linux操作系统的PC设备、基于苹果Mac操作系统的Mac电脑、微软的Xbox系列游戏主机、索尼的PS系列主机、任天堂的游戏主机,以及现在非常火爆的iPhone或Android智能手机及平板设备。PC、游戏主机、掌机、移动设备的硬件架构具有相当大的差异,这对于游戏引擎的设计也会有所影响。

(2)设备驱动(Drivers)

该层代表由操作系统或硬件厂商提供的驱动程序,用于管理硬件资源。

(3)操作系统(OS)

该层代表硬件之上运行的操作系统,它的主要作用是协调游戏硬件设备上多个程序的执行。

(4)第三方SDK(3rdParty SDK)

很多游戏引擎都会借助第三方软件开发工具包(Software Development Kit, SDK)和中间件,并提供基于函数或基于类的应用程序接口(Application Programming Interface, API)。

这些第三方的SDK可以用于处理数据结构及算法(如STL)、图形(如OpenGL、Di-rectX)、碰撞和物理(Havok、PhysX)、角色动画(Granny、Havok Animation、Edge)、人工智能(Kynapse)、生物力学角色模型(Endorphin和Euphoria)等。

(5)平台独立层(Platform Independence Layer)

大多数的游戏引擎需要支持不同的平台,因此在游戏引擎的架构中通常有一个平台独立层在硬件、驱动程序、操作系统和其他第三方SDK之上,从而将引擎的其他部分和底层平台隔离。

(6)核心系统(Core Systems)

这里所谓的核心系统并非指引擎的核心功能,而是指引擎中一些有用的软件。核心系统层通常支持断言(assertion)、内存管理、数学库、自定义结构及算法等。

(7)游戏资源(Resources/Game Assets)

每个游戏引擎都需要有一个特定形式的游戏资源管理器提供特定的接口,以便访问各种类型的游戏资源,如3D模型资源、纹理贴图资源、材质资源、骨骼资源、碰撞资源、物理参数、游戏世界/地图,等等。

(8)视觉渲染(Visual Rendering)

在游戏引擎中,视觉渲染部分是最重要的组件之一,其中又包括低阶渲染器(low-level renderer)、场景图/剔除优化、视觉效果(粒子特性、光照贴图、动态阴影、后期处理效果、颜色校正等)、前端(HUD、游戏内置图形用户界面、游戏内置菜单、游戏内置全景视频等)等。

(9)分析与调试(Profiling & Debugging)

游戏引擎中通常会内置分析和调试工具,如内存分析、代码调试等,以便让开发者更方便地对游戏进行优化。

(10)碰撞和物理(Collision & Physics)

游戏引擎中内置的碰撞检测和物理系统用于模拟真实世界中的物理法则,更常用的是刚体动力学模拟。

(11)骨骼动画(Skeletal Animation)

很多游戏中存在的活生生角色,比如人类、动物、卡通角色和机器人等。对于此类角色,需要使用动画系统让他们在游戏中变得活灵活现。

(12)人机接口设备(Human Interface Devices)

任何一个游戏都需要玩家和游戏世界产生互动,而玩家的输入需要使用人机接口设备来实现。

(13)多人在线(Online Multiplayer)

对于支持多人同时在线的游戏,游戏引擎必须提供对应的网络功能。

(14)音效(Audio)

好的游戏背景音乐和音效可以大大提升游戏的吸引力,因此在绝大多数游戏引擎中都会提供音效系统。

(15)游戏性基础(Gameplay Foundations)

除了画面、声音和对真实世界的模拟,任何一款游戏都需要具备特定的游戏规则,在游戏引擎中即为游戏性基础系统。其中包含了游戏世界和游戏对象模型、事件系统、脚本系统等。

(16)游戏专用子系统(Game-Specific Subsystems)

该系统处于低阶引擎组件之上,用于实现游戏本身的各种特性,包括玩家机制、游戏摄像机、武器系统、载具等。

除了用于实现游戏核心内容的运行时组件,游戏引擎通常还提供了一些工具套件,用于丰富游戏内容。

游戏引擎需要使用各种形式的数字内容,比如3D模型、纹理贴图、骨骼动画、音频文件等。因此,在游戏引擎中通常需要内置专用的资源管道,以便从外部的DCC(Digital Content Creation,数字内容创作)软件中导入相关资源。

很多游戏中使用了酷炫无比的粒子特效,虽然有类似Houdini这种第三方工具,但游戏引擎并不能支持这种第三方工具所制作的所有效果。因此,大多数游戏引擎都有内置的粒子特效编辑工具。

虽然使用3ds Max或Maya软件可以导出所需的游戏场景,但大部分的商用游戏引擎也内置了世界编辑器,既可以作为资源管理工具,也可以用于创建游戏世界和场景。

1.1.3 主流3D引擎对比分析

在游戏引擎的发展史上,曾经出现过众多璀璨的明星,至今仍然星光闪耀。打开维基百科,在游戏引擎清单的词条下会看到长长的一串列表,比如Unity、Unreal Engine、CryEngine、Cocos2D、Corona、Frostbite(寒霜)、Gamebryo、GameMaker、id Tech系列、Infinity Engine、OGRE、Panda3D、Renderware、RPG Maker、Source、Torque3D,等等。

其中有些引擎大家可能听说过,比如Unity、Unreal和Cocos2D,而更多的引擎则很少为常人所熟知。

虽然可供选择的游戏引擎很多,但具体到AR/VR开发领域,最值得我们关注的两款商用3D游戏引擎莫过于Unity和Unreal了。

这里先对这两款游戏引擎做一个简单的介绍和对比分析,在后面的内容中将会着重对Unity做详细的介绍。

Unreal引擎是由Epic Games开发的一款商用游戏引擎,第一个版本发布于1998年。Epic Games本身也开发自己的游戏内容,因此Unreal引擎最初是用于开发Unreal Tournament(虚幻竞技场)这款游戏的。在2014年3月的时候,Epic发布了Unreal引擎4(Unreal Engine 4),也就是业界简称的UE4。Unreal引擎曾用于开发多款PC和主机平台上的3A级别大作。使用Unreal引擎开发的游戏画面表现力惊人,而且在Github上开放了引擎的所有源代码。Unreal引擎的早期授权价格对于小型开发团队来说是个天文数字,但是目前已经免费。遗憾的是,虽然Unreal引擎的功能很强大,但是学习曲线比较陡峭,入门相对较难。此外,和Unity引擎相比,Unreal引擎对各种新设备平台的支持稍微滞后一点,比如到本书截稿为止UE4仍然不支持HoloLens设备的开发。

相比Unreal引擎这种专业且复杂的游戏引擎而言,Unity引擎自诞生的初衷就是:人人皆能开发游戏。Unity的编辑器界面简洁、易上手,脚本语言支持C#和JavaScript,而且教程、资源非常丰富,开发者能够很轻松地上手进行开发。而且随着Unity的不断迭代更新,曾经为人诟病的渲染、光照、粒子特效等影响游戏视觉效果的部分已经大大提升,最新的Unity 2017版本更是一个质的飞跃。除此之外,相比Unreal引擎而言,Unity的另一个巨大优势就是,它提供了一个类似Appstore的素材资源商城Assetstore,其中包含了游戏开发所需的各种资源,包括3D模型、音效资源、骨骼动画、各种强大的功能插件,等等。小型团队和独立开发者可以充分利用Assetstore中的资源快速创建游戏,而Unreal引擎虽然也拥有自己的素材商城MarketPlace,但是其中的资源数量相比Assetstore实在是寥寥无几。

也许你已经发现了,对于新手来说,如果希望尽快完成自己的第一款AR/VR作品,那么无疑Unity就是最好的选择。不需要太高的成本,也不需要太多精力,只要你有丰富的创意,就可以立即动手开发AR/VR作品。