在继续动手操作之前,我们需要了解一下Unity和游戏开发中的一些名词和核心概念,比如游戏场景、游戏对象神马的。
虽然这些名词和概念看起来似乎跟开发没什么关系,但是如果不理解这些概念,那么你的思维可能就会停留在一个比较低的层面,后续可能就不知道该如何从整体上来设计和实现一款游戏。
012- 你人生的第一款游戏03- Unity核心概念扫盲
Unity的核心子系统
在之前的内容中,我们曾一起了解过3D游戏引擎的基本架构。Unity作为当今最为流行的商业游戏引擎,仍然符合《游戏引擎架构》中所描述的基本架构。接下来介绍一下Unity的一些核心子系统。如果不了解Unity的系统构成,你可能就不太明白编辑器中的那些视图和工具究竟是起什么作用的,对游戏开发有什么帮助。
需要再次强调是,第一遍看这些名词概念的时候,你极有可能无法完全理解。这是正常的,在学习过程中我会不断重复一些重要的概念,直到你可以完全理解并应用到自己的项目之中~
1.视觉渲染系统
视觉渲染系统(Graphic)是任何一个游戏引擎中最为核心的部分,Unity的视觉渲染系统提供了丰富而强大的功能,可以让开发者轻松创作出自己所需的视觉效果。
Unity的视觉渲染系统又包括了以下的一些主要子系统。
(1)光照
在虚拟的世界中,为了展示更为逼真的视觉效果,需要引入现实世界中一个不可缺少的元素,那就是光照(Lighting)。为了计算某个3D游戏对象的阴影,Unity需要了解光照的强度、方向和色彩等等信息。
Unity支持不同类型的光源,并根据实际的情境实现复杂和高级的光照效果。
在后面的内容中,我们会通过实战项目来详细介绍Unity中的光照系统。
(2)摄像机
Unity的游戏场景是通过将物体在三维的空间中放置和移动而创作出来的。但是在非VR的传统设备上(如电脑和手机等),屏幕是二维的。因此,需要采用一种方式捕捉计算机画面并将三维的画面“展平”以显示在2D的屏幕上。而这一切正是通过摄像机(Camera)来实现的。
Unity中提供了两种摄像机:分别是Perspective(透视)和Orthographic(正交)摄像机。
其中透视摄像机模拟的是真实世界中人眼观察世界的方式,用于创建仿真的虚拟世界。默认情况下Unity会使用透视摄像机。不过在某些情况下可能我们需要创建一些非仿真的对象,比如场景地图或游戏信息等,此时就会采用正交摄像机。
(3)材质、Shader和贴图
Unity的渲染是通过材质(Material)、着色器(Shader)和贴图(Texture)共同实现的。
材质定义了游戏对象的表面应该如何渲染,包括色彩、表面平滑度,等等。
着色器其实是小的代码片段,其中包含了渲染每个像素所需要进行的数学计算和算法。在大多数情况下,我们只需使用Unity内置的标准shader即可,但是通过编写自定义的shader可以让游戏画面效果提升到更高的层次。甚至有不少开发者把是否会熟练使用shader作为区分Unity菜鸟和高手的主要判断方式。
贴图其实就是位图。某个材质中可能会引用了贴图,此时该材质所使用的shader将使用贴图来计算出游戏对象的表面色彩。除了基本的色彩,纹理还提供了材质表面的诸多其他信息,如发光或粗糙程度等。
(4)Shuriken粒子系统。
这里的Shuriken可不是指日本的飞镖,而是Unity中对粒子系统的特定叫法。所谓的粒子系统是计算机图形渲染中常用的一种技巧,通过使用大量的小图片、3D模型或其他图形对象来模拟某种“模糊”的自然现象。
比较适合使用粒子系统模拟的自然对象或化学反应效果有火焰、爆炸、烟、水流、落叶、云彩、雾、雪、尘埃、流星尾迹、魔法效果或发光轨迹等视觉效果。此类现象使用传统的渲染技术是很难实现的,但是使用粒子系统就可以轻松实现所需要的效果。
关于粒子系统的具体用法,将在后续内容中详细介绍。
(5)后期屏幕渲染特效(Post Processing)
后期屏幕渲染特效在某种程度上有点类似数码相机或Photoshop中的滤镜。通过使用后期屏幕渲染,可以快速改变游戏场景的整体视觉效果。
后期屏幕渲染的原理是在图像渲染到屏幕之前对其进行全屏滤镜效果处理,从而让游戏画画达到电影级的效果。
在后续的内容中,将对后期屏幕渲染进行详细讲解。
6)其他
在Unity的视觉渲染系统中,除了以上几个主要的子系统,还包括Video Player(视频播放器),Terrain Engine(地形引擎)、Tree Editor(树木编辑器),和一些高级渲染特性。限于篇幅,这里不再一一赘述,开发者可以自行查阅官方的相关技术文档了解更多细节。
2.Mecanim动画系统
Unity内置提供了一个功能强大的动画系统,又名为Mecanim系统。Mecanim系统提供了简单易操作的工作流程,可以轻松设置各类游戏对象的动画,包括物体、游戏角色,等等。
Mecanims支持通过可视化的工具来轻松创建动画,从而让动画师可以独立于程序员来工作。关于Mecanim动画系统的具体用法,将在第8章具体介绍。
3.物理引擎系统
Unity中内置了NVIDIA的Physx物理引擎,另一个知名商业引擎UE4中同样采用了该物理引擎。通过使用物理引擎系统,可以让游戏实时模拟出真实世界的部分物理法则,刚体动力学、柔体动力学、流体动力学,等等。
如果想了解Physx物理引擎系统更底层的东西,不妨去NVIDIA的开发者网站注册一个账号试试(/)。
此外,在GDC大会上,Unity宣布将与知名物理引擎Havok进行更为深度的战略合作~
4.音效系统
任何一款游戏如果没有音效或者背景音乐,都是不完整的。Unity提供了一个强大而又灵活的音效系统。Unity内置的音效系统支持3D环绕立体声,实时混音,预定义效果等等。通过该音效系统,我们可以导入多种格式的音频文件,并设置不同的声音效果。此外,Unity还支持游戏时通过麦克风录制音频并保存传输。
关于音效系统的具体用法,将在后续内容中具体介绍。
5. 导航寻路系统
Unity中提供了强大而又智能的导航寻路系统,可以让角色在游戏世界中自由漫步。通过使用导航寻路系统,角色可以“理解”他们是否需要通过楼梯来抵达第二层,或者跳过某个水坑。
在后续的内容中,将详细介绍Unity中的导航寻路系统。
6.UI系统
Unity早期的版本并不支持原生的UI系统,所以当时大多数开发者使用的是一个名为NGUI的插件,而且至今仍有一个开发者在项目中使用该插件来实现Unity项目中的UI界面。
从Unity 4.6版本开始,Unity提供了原生的UGUI系统,可以轻松创建2D和3D的UI界面。
在后续的内容中,将对Unity中的UI系统进行详细讲解。
7.Input输入控制系统
Unity支持各种形式的传统输入设备,包括键盘、鼠标、游戏手柄、手机触摸屏,同时也支持全新的AR/VR/XR自然交互,如Leap Motion的手势识别、HoloLens的手势识别等等。
此外,Unity还支持通过计算设备的麦克风和摄像头来输入音频和视频信息。
8.UNET网络引擎
在当今时代,多人在线游戏早已经取代传统的单机游戏成为主流。早期的时候,Unity对于网络的支持并非尽如人意。绝大多数的开发者选择自己搭建网络子系统,或是使用知名的第三方网络引擎,如Photon+。
从Unity5.1版本开始,Unity提供了官方的UNET网络引擎,并开源了相关的代码( /Unity-Technologies/networking )。
9.资源导入系统
除了Unity内置的原生游戏对象,Unity还通过强大的资源导入系统支持多种格式的外部游戏资源,包括使用3dsmax、Maya或Blender等建模软件创建的3D模型,各种格式的纹理图片,各种格式的音频文件、视频文件、字体文件等等。
10.Scripting(脚本)系统
脚本是所有游戏的必要元素。即便是最简单的游戏也需要脚本,从响应玩家的输入,到实现特定的游戏逻辑,都离不开脚本。此外,有经验的开发者还可以直接通过脚本来创建视觉渲染效果,控制游戏对象的物理行为,甚至实现角色的AI系统。
Unity中支持使用C#语言进行脚本编写,相比其它3D游戏引擎使用C++,可以说是非常友好的了~
11.2D系统
Unity的设计初衷是为了帮助开发者开发3D游戏,以及实现3D的建筑设计、漫游和VR系统,而无需支付传统商业游戏引擎那样高昂的授权费。
早期的Unity对2D的支持很差,但是随着手游时代的兴起,2D游戏再次占据了市场的主流。而一向审时度势的Unity也在4.3版本中提供了对2D游戏开发的支持,开始在2D手游开发方面与Cocos2d引擎正面交锋。但是实际的情况是,在2D手游领域,Cocos2d几乎占据了绝对的统治地位。Unity真正强大的地方还是在3D领域。
12.AR/VR支持系统
从Unity诞生之初,就提供了对虚拟现实(AR/VR)应用开发的支持。而随着AR/VR时代的来临,Unity 系统内置提供了对多款AR/VR/XR设备的原生支持,包括HTC Vive/Vive Focus、Oculus Rift/Oculus Go、Google Daydream VR、HoloLens、Magic Leap等。此外,Unity也提供了对Vuforia,苹果ARKit和Google ARCore等AR SDK的支持。
在《绝地逃生》这款小游戏中,会涉及到以上的部分子系统,大家可以在学习的过程中自己去体会。
Unity中的重要概念
在了解了Unity的子系统构成之后,让我们再来认识几个Unity中的重要概念。
1.游戏场景(Scene/Level)
游戏常被人称为第九艺术,某种程度上可以看作互动性的电影,或者舞台剧。游戏场景包含了游戏中的所有对象。我们可以在场景中创建主菜单,不同的关卡以及所有的一切。每个场景文件都可以看作是一个独立的关卡。在每个独立的游戏场景中,我们都可以放置环境、障碍物、装饰物等等。
2. 游戏对象(GameObject)
游戏中的每一个对象都是游戏对象(GameObject),这就意味着我们在游戏中所需要考虑的一切都和游戏对象有关。但单纯的游戏对象什么也不能做,我们必须赋予其特定的属性,这样它才能成为游戏角色,游戏场景,或是某种特殊的游戏效果。
游戏对象也是一种容器,可以向其中添加不同的部件,从而让其成为游戏角色、灯光、树木、声音,或任何其他别的东西。而我们所添加的每个部件则被称为组件(Component)。Unity中内置的常用3D游戏对象如图所示。
在Hierarchy层级视图中右键单击空白处,选择对应的对象就能将其添加到场景视图中。
实际上,我们看到的绝大多数游戏中的物体模型都是使用专业建模软件创建并导出后,再导入到游戏引擎中的。
那么Unity3d中内置游戏对象的作用是什么呢?你应该猜到了,其实这些内置游戏对象的主要作用是快速搭建游戏原型,验证游戏逻辑。最终的游戏场景、人物和角色动画通常都需要替换。
3.组件
如果说游戏对象是Unity游戏的核心,那么组件则是用来构建游戏对象的基石。
游戏对象中往往包含了一个或多个组件,组件可以为游戏对象提供不同的功能和特性,Unity中最常用的组件类型如下。
(1)Transform:游戏对象的基础组件,可以修改游戏对象在地图中的位置、旋转和缩放值。默认情况下所有的游戏对象都会有一个Transform组件。
小练习:在Hierarchy层级视图中右键单击,选择Create Empty,创建一个空的游戏对象,此时在Inspector视图中会看到即便是空的游戏对象,也同样有Transform组件。
(2)Mesh(网格)类型的组件:和Mesh相关的组件有五种,包括Mesh Filter(网格过滤器)、Text Mesh(文本网格)和Text Mesh Pro-Text、Mesh Renderer(网格渲染器)和Skinned Mesh Renderer(蒙皮渲染器)。
(3)Particle System(粒子系统):该组件可以模拟各种各样的特效,例如火焰、云彩、水流等。这是一个非常有用并且较为庞大的系统,涉及到非常多数据的设置,在后续章节中我们将对其进行详细介绍。
(4)Physics(物理组件):为了让创造的场景更具有真实性,需要在我们的虚拟现实世界中让物体遵循现实世界的物理规则。为了实现这一点,Unity内置了NVIDIA PhysX物理引擎,以此来模拟真实的物理行为。
(5)Scripts(脚本组件):该组件由开发者自行编写,用于实现较为灵活与定制化的功能。Unity支持C#和JavaScript两种语言。
(6)Audio(音频组件):使用音频组件可以设置音效或背景音乐的各种属性,从而打造更好的游戏氛围。
(7)Rendering(渲染):和视觉渲染相关的组件有很多,包括摄像机、天空盒、灯光、遮挡剔除等等。
(8)Event(事件):通过使用Event相关的组件,可以在游戏中轻松的设置和响应各种事件。
除了上述提到的组件之外,还有Tilemap,Layout,Playables,Analytics,Animator,Terrain等多个其它类型的组件。
关于组件有很多细节的内容,限于篇幅这里不一一赘述。在初学的阶段,我们最重要的是先从整体上认识这些重要概念。
4.Prefab(预设体)
Prefabs是一个游戏对象及其组件的集合,目的是使得游戏对象可以被重复使用。
这么描述或许有点抽象,一个形象的比喻是,预设体就好比模板,我们可以使用预设体在场景中快速创建一个具有特定组件属性值的游戏对象。
创建预设体的方法非常简单,一种方法是从菜单栏上选择Assets-Create-Prefab,然后从Hierarchy视图中将场景中的某个游戏对象拖到所创建的Prefab预设体上。还有一种更简单直接的方式,从Hierarchy视图中将场景中的某个游戏对象拖到Project视图的特定目录下。
需要使用Prefab时,只需将预设体从Project视图中拖动到场景中即可创建实例。除此之外,我们也可以直接通过代码来手动生成Prefab的实例对象。
当然,上面有些话大家看看就好,一时半会儿理解不了也是正常的。
好了,枯燥乏味的理论充电时间结束。
虽然很枯燥,但是这些名词和概念确实很重要,大家在后续有需要的时候也可以回到这部分内容 来随时复习。
从下一课开始,再次回归我们的动手时间~