2.3 创建场景

游戏是发生在太空中,背景是一颗巨大的火星和浩瀚的星空。在这部分,我们将介绍如何创建材质球,并为星空完成一个UV动画。

2.3.1 创建火星背景和星空动画

步骤01 在菜单栏中选择【File】→【New Scene】创建一个新的场景。

步骤02 在菜单栏中选择【File】→【Save Scene As】,将当前场景存放到Assets路径下,这里命名为level1.unity,如图2-3所示。接下来这个游戏的大部分工作都将在这个场景中完成。

步骤03 在菜单栏中选择【GameObject】→【3D Object】→【Plane】,创建一个平面体作为火星背景模型。

图2-3 新建场景

游戏中使用的3D模型主要是在3D动画软件中制作的,Unity提供了一些基本形状的模型,通常只是用来快速测试一些简单效果。

步骤04 在Project窗口中单击鼠标右键,选择【Create】→【Material】创建一个材质球,将其命名为Background,选择贴图框旁的按钮指定mars.png作为贴图,如图2-4所示。

图2-4 指定贴图

当贴图较多时,选择查找比较困难,可以在Project窗口中浏览到目标贴图,直接将其拖至材质球的贴图框内,Unity中的很多操作都可以使用这种拖拉的方式。

步骤05 在Scene窗口中选择前面创建的火星背景模型,在Inspector窗口中找到Materials下面的Element 0,单击右边的小按钮(或拖拽),指定Background材质球,如图2-5所示。

步骤06 我们会发现火星贴图四周呈现出边框,这是因为默认材质设置不能显示Alpha通道的原因。选择Background材质球,将Rendering Mode设为Cutout,即可以显示出透明效果,如图2-6所示。

模型、材质和贴图的基本关系是,模型的表面质感需要由材质球呈现,贴图可以为材质提供不同的纹理表现。

图2-5 指定材质

图2-6 更改渲染模式

接下来,我们将在火星后面创建一个星空背景,创建星空与创建火星背景的方式相似,在此基础上为星空制作一个UV动画,使画面看起来在缓缓向前移动。

步骤01 创建另一个平面体,将其放大一些,置于火星下面作为星空的背景,然后为其创建一个材质球,星空背景比较简单,也不需要接收光线,我们为其换一个简单的Shader,在Shader中选择【Unlit】→【Texture】,将材质Shader设为Unlit/Texture,并指定star.png作为其贴图,如图2-7所示。

本书后面的章节对Shader会有专门的讲解。通俗点理解Shader,Shader就像是一个材质的模版,选择不同的Shader即可获得不同的质感表现,Unity内置了很多Shader,创建新的Shader需要使用专门的语言,在Unity中主要是使用CG语言,最新版本的Unity还提供了一个可视化Shader编辑器,使用户无需要编写代码即可创建Shader。

图2-7 为星空材质更改Shader

步骤02 选择星空背景模型,在Project窗口中单击鼠标右键,选择【Create】→【Animator Controller】,创建一个动画控制器,确定星空背景模型在场景中处于选择状态,拖动动画控制器到Inspector窗口下方空白处,将动画控制器组件指定给星空背景模型,如图2-8所示。

图2-8 指定动画控制器组件

这步操作会给星空模型添加一个Animator动画组件,并自动与当前的动画控制器关联,注意Animator组件中Controller中的设置。

步骤03 确定选中星空模型,在菜单栏中选择【Window】→【Animation】→【Animation】,打开动画窗口,选择【Create】创建一个动画文件并保存在工程中的Assets目录内。如果还需要创建更多动画,选择【Create New Clip】即可,如图2-9所示。

游戏中的动画有很多种制作和表现方式,除了使用专业的动画软件,在Unity内可以直接添加一些基本的动画效果,比如位置,旋转或缩放、特别适合用来制作游戏内的UI动画效果。

步骤04 选择【Add Property】,然后选择Material._Main_Tex_ST添加动画UV属性,现在我们可以动画这个属性了,如图2-10所示。

图2-9 创建新动画

图2-10 添加动画属性

另一种添加动画属性的方式是,单击Animation窗口左上角的“动画记录”按钮进入动画录制状态,然后改变场景中Game Object相关属性的值,比如位置、旋转等,该属性即可被自动添加到动画属性中并记录动画。

步骤05 单击左上角的“动画记录”按钮进入动画录制状态,将时间轴前进至30帧左右,将Material._Main_Tex_S属性中的w值设为-1,播放动画,星空贴图将会缓缓移动,如图2-11所示。

图2-11 添加UV动画效果

实际上,Material._Main_Tex_S属性对应的就是当前材质中Offset的值,如图2-12所示,除了可以在Animation窗口中手动设置关键帧外,也可以直接在Inspector窗口中改变数值,Animation工具会自动为数值变化添加关键帧。

默认动画是循环播放的,如果需要修改,选择动画文件,在Inspector窗口中设置它的Loop Time,即可改变循环模式,如图2-13所示。

图2-12 动画Shader中的值

图2-13 设置动画循环方式

2.3.2 设置摄像机和灯光

摄像机是用来展示游戏世界的窗口,游戏引擎在运算过程中,根据摄像机视角范围内进行裁切,将3D模型顶点位置投射到摄像机的矩形平面内,再进行坐标转换将顶点位置最终投射到屏幕的像素坐标上(无论是3D或2D游戏,我们的显示器仍然是二维平面的)。在Unity的游戏场景中,允许同时有多个摄像机,实际上摄像机就是一个普通的游戏体,上面有一个Camera组件,与其他游戏体一样,可以移动、旋转,用脚本控制等。

在这个太空射击游戏中,摄像机的工作很简单,就是从上向下展望火星,所以这个游戏看起来更像是一个2D游戏,只是太空飞船使用的是3D模型。

步骤01 在Scene窗口中调整视图角度。

步骤02 在Hierarchy窗口中选择Main Camera,这是场景中默认的摄像机。在菜单栏中选择【GameObject】→【Align With View】,使摄像机视角与当前视图一致,如图2-14所示。

Hierarchy窗口是一个名称列表,可以按子父层级关系排列显示,它们与Scene窗口中出现的游戏体是一一对应的。

现在,如果我们运行游戏,如果发现在Game窗口中的画面亮度与Scene窗口不一致,在Scene窗口上方单击“太阳”图标,Scene窗口将使用真实的灯光信息,因为这时场景中还没有灯光,所以画面是比较暗的。

步骤03 在菜单栏中选择【Window】→【Rendering】→【Lighting Settings】,选择Ambient Source,将Skybox改为Color,这样会使用颜色作为环境光代替默认的天空盒,然后调整Ambient Color的颜色,可以整体影响场景光线的亮度。本示例不需要使用Lightmap,取消Lighting界面最下方的Auto(自动)选项,防止Unity自动为场景构建Lightmap。

图2-14 调整视图角度

步骤04 在菜单栏中选择【GameObject】→【Light】→【Point Light】,创建一个点光源,将其置于火星模型上方,然后调节其Range的值改变灯光范围,调节Intensity的值改变灯光强度,如图2-15所示。

图2-15 调节灯光