第 1 章
<br>进入三维世界
<br>在你开始研究任何的三维软件之前,理解你将面对的开发环境是十分必要的。Unity 是一个以3D 为主的开发��具,本书中的很多概念都需要读者对3D 游戏开发和游戏引擎有一定程度的了解。在你潜心钻研本书的其他内容之前,理解这些概念是十分必要的。因此,在这一章,我们将在向你介绍Unity 操作界面的知识之前,让你对这些重要的3D 概念有良好的认识。在本章中,你将学到:
<br>◆ 坐标系和向量;
<br>
<br>◆ 三维图形;
<br>
<br>◆ 材质和纹理;
<br>
<br>◆ 动态刚体;
<br>
<br>◆ 碰撞检测;
<br>
<br>◆ 游戏物体和组件;
<br>
<br>◆ 资源和场景;
<br>
<br>◆ 预制;
<br>
<br>◆Unity 编译器的界面。
<br>
<br>
<br>1.1.了解三维世界
<br>首先,让我们来看一看三维世界中的关键元素,以及怎么使用Unity 来开发3D 游戏。
<br>坐标系
<br>如果你之前接触过其他的3D 软件,你将对z轴的概念感到熟悉。z轴表示的是深度,与之类似的有x轴表示水平方向,y轴表示垂直方向。在3D 软件中,你会注意到物体的坐标信息以x,y,z的格式罗列出来――这个方法也就是众所周知的笛卡儿坐
<br>第1章.进入三维世界
<br>标系方法。我们可以用这个方法来描述三维世界中笛卡儿坐标系的维度、旋转的数值和位置。在本书及其他3D 软件的帮助文档中,你会发现这些信息放在一对括号中,如(3,5,3)。
<br>这么书写主要是为了使代码整齐,实际上,在程序中这些值一定要这样书写。不管它代表的是什么意思。可以确定的是,它们都以x,y,z的顺序排列,并且相互之间使用逗号隔开。
<br>在图1.1 中,一个立方体出现在世界坐标系(3,5,3)的位置,这意味着,它距离原点位置在x轴方向有3个单位的长度,y轴方向有5个单位的长度,z轴方向有3个单位的长度。
<br>
<br>图1.1
<br>本地坐标系和世界坐标系
<br>本地坐标系和世界坐标系是十分重要的概念。在所有的3D 软件中,你将接触的是理论上无限的空间,有时候在这样广大的空间中,得知一个物体的位置是十分困难的一件事情。在任何3D 世界中,都有一个起点,也可称为世界原点,就像代表它的位置(0,0,0)一样。
<br>所有世界坐标系中的坐标都与这一点有着密切关联。当然,为了在某些情况下方便使用,我们也声明了本地坐标系来表示物体间的相对位置。这样的物体间的关系也
<br>1.1.了解三维世界
<br>被称为父子级关系。在Unity 中,你可以简单地通过在层次面板中把一个物体拖到另一个物体上面,以此来建立父子级关系。这样做的结果是使得被拖动的物体成为目标物体的子级,并且使得被拖动物体的坐标系与目标物体坐标系相关联。假设有一个子级物体与父级物体在世界坐标系中处于同一位置,那么我们可以说子级物体在本地坐标系(相对于父级物体而言)中处于(0,0,0)的位置,即使父级物体在世界坐标系中并不是处在(0,0,0)的位置。
<br>本地坐标系假设每个物体都有自己的起点,也就是它所有轴交汇的那一点。通常来说,这一点是物体的**点。此外,通过在物体间建立关系,我们可以比较物体间的相对位置。这样的关系,我们称之为父子级关系。这意味着,我们可以把父级物体的坐标位置当做新的原点,从而可以使用本地坐标系来计算子级物体之间的距离。
<br>在使用3D 模型软件时,这一点尤为重要,你要确保你所创建的模型是放在(0,0,0)的位置。这样做是为了确保当你导入Unity 的时候,坐标系的表现方式是正确的。
<br>因为以上概念在2D 和3D 中同样适用,我们将在图1.2 中展示本地坐标系和世界坐标系的概念。
<br>图1.2(a)中显示了世界坐标系中的2个不同物体:一个位于(3,3)的较大正方形,另一个位于(6,7)的较小正方形。
<br>图1.2(b)中,我们假设小正方形是大正方形的子级,因此,小正方形的坐标位置变成了(3,4),这是因为新的原点(0,0)是父级坐标的位置。
<br>
<br>图1.2
<br>第1章.进入三维世界
<br>向.量
<br>接下来,我们将探讨坐标系中的三维向量。与二维向量类似,三维向量在三维世界中也有长度和方向。向量可以在坐标系中任意移动,但是本身的长度和方向不会发生变化。向量可以用来计算物体间的距离、物体间的角度、物体所面对的方向,因此,向量在游戏开发中十分有用。
<br>相.机
<br>相机是三维世界中必不可少的组成部分,因为它充当着视口的角色。
<br>相机可以放在坐标系中的任意位置,你也可以为它添加动画,或者根据需要把它附加在一个物体上。在一些特定的场景中,Unity 允许多个相机的存在,但是只有一个相机可以渲染出玩家看到的画面。这也是你每创建一个新的场景时,Unity 总会自带一个主相机的原因。
<br>投影器的模式――二维和三维对比
<br>相机的投影器在渲染2D (正交相机)和3D (透视相机)时存在区别。在一般的情况下,相机被设置为透视模式的时候,相机拥有金字塔状的视野(Field of View,FOV )。为了在Unity 中渲染3D 环境,我们通常把相机的投影器模式设置为透视模式。与之相反,为了渲染2D 环境,我们将相机的投影器模式设置为正交模式,因为正交模式的视野是长方形的。我们可以把此方法应用在主相机上来创建2D 游戏,或者应用在其他副相机上来渲染地图、血条等其他平视显示器(HUD )。
<br>在游戏引擎中,你会注意到为了使得玩家看到的游戏世界更加生动、真实,我们可以添加多种**,如灯光、运动模糊等效果。你也可以添加一些人眼在日常生活中无法感知的**,比如当你看太阳时的光晕效果,我们称之为镜头光晕。
<br>目前,大多数3D 游戏使用多个相机渲染玩家视野外的游戏世界。在Unity 中实现这个方法是十分简单的,Unity 允许多个相机存在于同一个场景中,并且,***可以通过脚本在游戏的运行过程中,在任何的时间点切换主相机。为了达到优化的目的,多个相机还可以用来有选择性地渲染游戏场景中的物体。比如,我们可以使用层对场景中的物体进行分类,然后设置相机,使得相机只渲染出特定层的物体。这样,我们可以有选择性地渲染游戏场景中的物体。
<br>1.1.了解三维世界
<br>多边形、边、顶点和网格
<br>在创建3D 模型时,所有的物体都是由相连的多边形构成的,当我们把3D 模型导入Unity 的时候,Unity 自动把多边形转化成三角形。通过连接多个多边形,我们可以使用3D 模型制作软件创造出复杂的形状,这也被称为网格。三角形面(也被称为面)由三条相连的边组成。我们称边与边交汇的地方为顶点(图1.3 )。
<br>
<br>图1.3
<br>通过知道这些点的位置,游戏引擎可以使用这些点来做碰撞运算,为了得到更**的碰撞检测结果,你也可以使用网格碰撞器。比如在射击游戏中,你需要知道子弹打在物体上的准确位置,就可以用网格碰撞器。网格上所保存的数据还有诸多其他用途。比如,你可以使用一个形状大致与原物体一样,但是精细度却低得多的网格来做碰撞。这样做可以使电脑减少大量的计算,从而提升游戏的性能。如图1.4 所示,包裹在车子外围的网格只是呈现出车子的大概形状。
<br>在图1.5 中可以看到,用来做碰撞检测的网格的细节程度远低于可视网格的细节程度。
<br>在游戏项目中,知道游戏中目前的多边形总数是十分关键的。多边形总数指的是游戏中包括摆设、模型,整个关卡(或者以Unity 来说,场景)中的多边形总数越多,计算机就需要进行越多的计算,这样就需要花更多的时间渲染场景。这也是为什么当今的游戏在画面的精细程度上远远超过之前的游戏。让我们来比较一下Quake(1996)和Epic 公司的战争机器(Gears of War,2006 )在画面上的区别,很显然伴随着科技的发展,游戏***能够使用更多数量的多边形去创建精细度更高、更加真实的模型,
<br>第1章.进入三维世界
<br>
<br>可视网格细节
<br>图1.4
<br>
<br>碰撞网格细节
<br>图1.5
<br>这也是目前游戏的发展趋势。换一句话说,伴随着Unity 游戏引擎的诞生,我们所做的游戏能发布到更多的平台(网页、手机)上,而不单单是在家用主机上。然而,硬件方面的限制还是一如既往的开发瓶颈,如手机上的3D 游戏细节的精细程度就受到硬件本身的限制。正是因为如此,当你在创建3D 模型时,要时常根据自己游戏的需要把握好游戏画面的细节程度。
<br>