在上面的章节中,我们创建了一个“New Unity Project”工程,并保存到了“E:\workspace”工作空间下。那么,我就先看看这个工程的文件结构(E:\workspace\ New Unity Project)。
接下来,我们简单介绍一下这些目录:
Assets:资源目录,我们所有的模型,材质,代码都在这里。
Library:库目录,Unity把Asset下支持的资源导入成自身识别的格式,以及编译代码成为DLL文件都放在Library文件夹中,还包括我们使用的Packages插件库。
Logs:日志目录,保存工程中输入的log信息。
Packages:包目录,使用的一些插件,通常我们使用Package Manager窗口进行管理。
ProjectSettings:工程设置目录,当前工程下的各项设置参数记录。
Temp:临时目录,unity编译的时候自动生成的临时文件。
UserSettings:用户设置目录,记录用户的使用偏好等等。
在我们Unity主界面上的Project工程面板中有Assets和Packages,其实就是对应了上面的两个同名的目录。我们在Project工程面板中操作Assets和在Windows目录中操作Assets文件夹的效果是一样的。但是,仍然建议大家还是在Project工程面板中操作,尽量不要去Windows目录中操作Assets文件夹。因为Unity会自动为每一个资源文件创建一个同名的meta文件,大家去Windows目录下查看,就能发现这些meta文件。需要注意的是,在这个Assets目录下,Unity会忽略一些特殊的文件或文件夹。这些文件或文件夹不会纳入到Unity的管理范围之内(不会为其创建meta文件)。这些文件包括:
1. 隐藏的文件夹
2. 以“.”开头的文件和文件夹
3. 以“~”结尾的文件和文件夹
4. 名为 cvs 的文件和文件夹
5. 扩展名为 .tmp 的文件
接下来是Packages目录,建议在Package Manager窗口中管理。注意,Packages的目录只保存了插件库的配置信息。那么这些插件库的真实文件在哪里呢?就是存放到了 Library目录下。这个Library目录是Unity根据Packages中的配置信息自动管理的。我们可以删除(不要在打开Unity的情况下删除),删除后Unity会自动重新下载。我们可以在 Packages 文件夹中找到名为 manifest.json 的项目清单文件,该文件使用 JSON(JavaScript 对象表示法)语法。Unity 加载项目时,Unity Package Manager 会读取项目清单,以便计算要获取并加载的包的列表。当用户通过 Package Manager 窗口安装或卸载包时,Package Manager 会将这些更改存储在项目清单文件中。项目清单文件通过依赖关系对象来管理包的列表。
另外,Unity中有一些特殊文件夹名称,大家也需要了解一下。通常可为创建的文件夹选择任何名称来组织 Unity 项目。但是,Unity 为特殊目的保留了一些文件夹名称。
1. Editor文件夹,编辑器脚本在开发期间向 Unity 添加功能,但在运行时在构建中不可用。
2. Gizmos 文件夹允许将图形添加到场景视图,以帮助我们更好的识别游戏对象。
3. Resources文件夹可从脚本中加载资源,而不必手动将资源拖拽在场景中创建游戏对象。
4. Standard Assets官方标准资源文件夹,里面提供了很多的免费3D资源。
5. StreamingAssets流媒体资源文件夹也用于加载一些资源。
接下来,我们介绍2D游戏和3D游戏。
我们创建游戏项目工程的时候,可以指定是以2D游戏还是3D游戏。如下所示
3D 游戏通常使用三维模型作为游戏对象,并在游戏对象的表面上渲染材质和纹理,使它们看起来比较贴近现实世界的事物。同时,摄像机可以在场景中自由移动和旋转,当游戏对象靠近摄像机时,对象在屏幕上显得较大,反之就较小,这就是透视效果。这类摄像机也称之为透视摄像机。3D游戏世界对应的是XYZ三维坐标系。
2D 游戏使用平面图形(就是图片),也称之为spirit精灵。这些二维图形被绘制到屏幕上,就连动画也是通过绘制一系列的连续帧图片的方式来实现的。同时,摄像机没有透视效果,也就是说,所有的二维图形不会因为距离摄像机的远近而变大变小,我们称之为正交摄像机。2D游戏世界对应的XY二维坐标系。
还有一类游戏,他们使用三维模型来构建游戏世界,但是透视摄像机只能在X/Y两个维度上移动,并且不能旋转,类似于2D游戏的玩法。对于这些游戏,3D 效果的用途只是为了营造逼真的游戏世界,这种类型的游戏有时也被称为“2.5D”。当然,我们也可以在2D游戏中使用透视摄像机,让二维图形可以展现3D的效果。优秀的技术只会让游戏更加的精彩。也就是说,从技术角度出发,不存在严格意义上的2D游戏和3D游戏的区分。
那么,我们开始创建工程的时候,为什么还要区分2D和3D呢?其实,只是两种Unity工作模式而已。我们创建2D工程,就是2D模式,同理3D工程就是3D模式。但而后也可以随时在2D模式和3D模式之间切换。请注意,这里的模式跟我们通常所说的2D/3D游戏是两个概念。Unity中的2D/3D模式是为了帮助我们更加方便的开发2D/3D游戏,它体现的是Unit 编辑器的一些功能设置的不同。如何在项目工程中切换2D和3D模式呢?请在菜单栏选择:Edit -> Project Settings,然后选择 Editor(编辑器) 选项,然后将 Default Behavior Mode 设置为 2D 或 3D。
注意,这个修改并不会对我们当前已存在场景造成太多的影响。也就是说,虽然我们可以将3D模式改为2D模式,但是这并不代表说,我们的3D场景游戏会变成一个2D场景游戏。2D和3D模式的区别在于Unity编辑器的一些设置不同。在2D模式下,导入的任何图像都被作为精灵处理,同时也会启用Sprite Packer等工具,Scene 视图也会设置为2D效果,摄像机为正交类型,同时不使用天空盒,环境光将使用颜色值,实时光照和烘焙会关闭等等。在3D模式下,则正好相反,图像作为贴图处理,禁用Sprite Packer等工具,Scene 视图为3D效果,摄像机为透视类型,同时启用天空盒,环境光来源于天空盒,实时光照和烘焙也会开启等等。其实,这些设置的不同,目的就是为了让我们在2D模式下更方便的开发2D游戏,3D模式下更方便的开发3D游戏。
介绍完2D/3D模式与2D/3D游戏的关系之后,我们来介绍一个正交/透视摄像机。在我们的DirectX课程中讲过,摄像机本质就是取景变换矩阵和投影变换矩阵。取景变换矩阵就是摄像机的位置和观察点信息,而投影变换矩阵则分为正交和透视两种。透视投影就是一个正四棱锥,它由视域角度,远近裁剪面构成;而正交投影则是一个立方体,它有长和宽两参数构成。在Unity中,它给专门给我们提供了摄像机这个游戏对象。它可以通过菜单栏GameObject -> Camera方式来创建,一般情况下,一个场景需要一个摄像机就够了,但是有些时候可以创建多个来实现一些特殊功能。
以上是一个透视摄像机,经常用于3D游戏,是一个正四棱锥结构。
以上是一个正交摄像机,经常用于2D游戏,是一个立方体的结构。
在Scene 视图中点击选中摄像机,在Inspector检视视图中查看它的所有属性,
摄像机的Inspector检视视图中主要组件就是“Transform”和“Camera”两个。Transform组件代表了移动,旋转和缩放(世界三大变换),每一个游戏对象都拥有该组件(提醒一下)。Transform变换位置定义了摄像机位置(眼睛的位置),其向前的 (Z) 轴定义观察方向(眼睛观察方向),向上的 (Y) 轴定义摄像机的上方向(眼睛的上方向是Y轴),相当于我们之前的取景变换矩阵。如果我们需要调整摄像机的位置,或者旋转摄像机的话,我们就需要修改它的“Transform”组件。例如,我们让摄像机跟随玩家一起移动,就可以将玩家的移动同步到摄像机上。
Camera组件,根据名称可以得知,该组件是摄像机独有的组件,该组件定义了摄像机观察区域的大小和形状,相当于我们之前的投影变换矩阵。通过设置组件的各个参数,摄像机能够显示其在当前屏幕上观察到的内容。以下是Camera 组件中一些重要的参数。
1. Clear Flags(清除标记)默认天空盒,表示在屏幕上空的部分将显示天空盒。
2. Background(背景色)没有天空盒的情况下,屏幕上空的部分将显示背景色。
3. Culling Mask(剔除遮罩)默认Everything层,也就是摄像机渲染这个Layer层。我们可以点击控制栏右边的“Layers”查看Unity为我们预创建的几个Layer层。
很明显,Everything层代表了所有层的游戏对象,反之Nothing代表没有任何层。如果我们选择Nothing的话,就代表摄像机不渲染任何层的游戏对象,我们就看不见他们了。
4. Projection 代表摄像机类型,Perspective为透视摄像机,Orthographic正交摄像机。这两种摄像机的区别,我们在上面已经说明。当切换两种类型的时候,下面的一些参数会自动改变。当Perspective透视摄像机的时候,下面有“FOV Axis”,“Field of View”和“Physical Camera”三个参数;当Orthographic正交摄像机的时候,下面只有“Size”一个参数。
透视摄像机:FOV Axis代表视野轴,可以分为Horizontal水平和Vertical垂直两种,这两个选项与Field of View(视角范围)有密切关系。当选择Horizontal的时候,调整Field of View数值就是改变摄像机左右(水平方向)开合角度;当选择Vertical的时候,调整Field of View数值就是改变摄像机上下(垂直方向)开合角度。这个就类似于我们投影变换矩阵中的视域角度,只不过Unity可以让我们从水平和垂直两个轴向来改变这个角度值。Physical Camera参数我们在后面章节中再介绍,这里直接忽略掉即可。透视摄像机的结构是一个正四棱锥,我们看到的视野范围,就是由锥体的开合角度决定的。这个应该很容易理解。
正交摄像机:Size也代表摄像机的视野。它的值表示的是在屏幕的竖直方向上,摄像机所绘制出来的区域的一半。如果数值是5的话,那么正交摄像机采集区域(立方体)的高度就是10。这里的数值单位是Unity的单位哦,而不是屏幕的像素单位。当然,两者存在一个转换的问题。默认情况下,100像素等于1个 Unity 单位。那我们如何来设置正交摄像机采集区域的宽度呢?这里就涉及到了屏幕分辨率自适应的问题了。Uinty通过屏幕的宽高比得到aspect,再通过纵向的采集高度乘以 aspect 获得摄像机横向的采集范围。说到这个aspect,大家要区分Game视图中的aspect,这个指最终游戏屏幕的宽高比,它主要让我们对不同屏幕进行游戏画面的测试。
5. Clipping Planes开始和停止渲染位置到摄像机的距离,分为Near和Far两个数值,其实就是我们上文提到的近裁剪面和远裁剪面,两个数值之间的内容才会被摄像机采集。
6. Viewport Rect 通过四个值指示将在屏幕上绘制此摄像机视图的位置。在DirectX课程中,我们在渲染管线章节中也提到过视口转换,就是将投影平面的内容转换到屏幕窗体上。它的主要参数就是X/Y坐标和W/H宽高。我们在该参数中也对应看到了这个四个参数值。
7. Depth(深度)摄像机在绘制顺序中的位置,具有更大值的摄像机将绘制在具有更小值的摄像机之上。默认情况下,Main Camera的Depth值是-1。新创建的摄像机的Depth值是0,只有Depth值大的摄像机的视图才会呈现到Game游戏视图中。在Unity场景中,一个摄像机对应一个游戏视图。如果场景中有多个摄像机,我们需要设置其余摄像机的输出。
8. Rendering Path定义摄像机的渲染路径,默认值为Use Graphics Settings。我们可以去在Editor -> Project Setting -> Graphics窗口可设置默认的渲染路径,
当然,每个Camera可覆盖上面默认的渲染路径。渲染路径是与光照和阴影相关的一系列操作。不同的渲染路径具有不同功能和性能特征。其中两个比较重要的选项分别是“Deferred延迟渲染”和“Forward前向渲染”。 前向渲染是内置渲染管线中的默认渲染路径。关于两者的详细区别,我们这里不介绍了,大家可以去官方或者第三方资料查阅一下。
9. Target Texture将摄像机视图输出的渲染纹理。我们可以在工程面板中创建一个“渲染器纹理”,然后再创建一个摄像机,将刚刚创建的渲染器纹理应用到新摄像机的目标纹理上。这样,摄像机采集的内容就会输出到这个纹理上面。然后我们再创建一个平面,将纹理拖拽到平面上。我们就可以在平面上看到摄像机照射的内容了。
10. Occlusion Culling为此摄像机启用遮挡剔除,意味着隐藏在其他对象后面的对象不会被渲染。这个对游戏对象的渲染起到一个优化的作用。
关于摄像机的内容,我们就暂时介绍到这里。