第01章 走进Unity3D的世界
本章导读
欢迎学习Unity3D专业游戏引擎!本章将带领读者走进Unity3D的世界,这是读者步入游戏制作殿堂的第一步。首先介绍Unity3D的整个界面布局,然后通过一个官方的游戏演示(Angry Bots)来让读者了解Unity3D的界面和用途,接着学习如何创建一个新的项目以及编写脚本。
1.1 Unity3D简介
Unity3D也称为Unity,是由Unity Technologies公司开发的一款让游戏设计师轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发软件,是一个全面整合的专业游戏引擎。Unity3D类似于Director、Blender Game Engine、Virtools或Torque Game Builder,是以交互的图形化开发环境为首要方式的软件,其编辑器可以运行在Windows或Mac OS X下,可发布游戏到Windows、Mac、Wii、iPhone、Windows Phone 8或Android平台,也可以利用Unity Web Player插件发布网页游戏,支持Mac和Windows的网页浏览,它的网页播放器也被Mac Widgets所支持。
1.1.1 Unity3D引擎
打开http://unity3d.com官方网站下载Unity3D软件,下载完成后,双击运行UnitySetup-###.exe安装文件,并接受许可协议,按照屏命令提示进行安装。使用默认安装路径(建议使用默认安装路径,安装路径中不能有中文字符,否则无法识别)即可,如图1-1所示。安装完成后,Unity会提示注册自己的版本。对于免费版和试用的专业版来说,这非常简单,选择互联网激活后,填写一个表单并输入用户姓名和电子邮件地址,然后在反馈回来的网址当中激活即可。
图1-1
1.1.2 Unity3D的欢迎界面
双击软件快捷图标,启动Unity3D软件,会看到一个欢迎界面,如图1-2所示。在欢迎界面中,通过选择不同的选项,可以跳转到不同的教程资源和指南。如果关闭Show at Startup(在启动时显示)选项,那么在以后启动软件时就不会再出现欢迎界面。要想再次看到欢迎界面,可以执行Help(帮助)>Welcome Screen(欢迎界面)菜单命令重新打开欢迎界面,如图1-3所示。
图1-2
图1-3
在关闭了欢迎界面之后,所呈现出来的就是Unity3D游戏引擎的界面,如图1-4所示。
图1-4
1.1.3 菜单栏
Unity3D的菜单栏中一共包含File(文件)、Edit(编辑)、Assets(资源)、GameObject(游戏对象)、Component(组件)、Window(窗口)和Help(帮助)7组菜单。如图1-5所示。
图1-5
File(文件):该菜单组主要用于打开和保存场景项目,同时也可以创建场景,如图1-6所示。
图1-6
Edit(编辑):该组菜单主要用于场景对象的基本操作(如撤销、重做、复制、粘贴等)以及项目的相关设置,如图1-7所示。
图1-7
Assets(资源):该组菜单主要用于资源的创建、导入、导出以及同步相关的所有功能,如图1-8所示。
图1-8
GameObject(游戏对象):该组菜单主要用于创建、显示游戏对象以及为其建立父子关系,如图1-9所示。
图1-9
Component(组件):该组菜单主要用于在项目制作过程中为游戏物体添加组件或属性,如图1-10所示。
图1-10
Window(窗口):该组菜单主要用于在项目制作过程中,显示其Layout(布局)、Scene(场景)、Game(游戏)或Inspector(检查)等的窗口,如图1-11所示。
图1-11
Help(帮助):该组菜单主要用于新手初步了解Unity3D的基础知识,如图1-12所示。
图1-12
1.1.4 场景控件
图1-13
在软件界面中的左上角有4个控制游戏物体的控件,其快捷键分别对应键盘上的Q、W、E、R,如图1-13所示。
手形控件 :该控件的快捷键为Q键。选择该控件以后,按住鼠标左键在场景中拖曳光标,可随意移动视图。如果是按住鼠标右键拖曳场景,则可以旋转视图,如图1-14所示。
图1-14
移动控件 :该控件的快捷键为W键。选择该控件并选择游戏对象以后,可以在坐标轴的X、Y、Z轴上移动游戏对象,也可以通过中间的正方形来自由移动游戏对象,如图1-15所示。
图1-15
旋转控件 :该控件的快捷键为E键。选择该控件并选择游戏对象以后,可以在坐标轴的X(红轴)、Y(绿轴)、Z(蓝轴)轴上旋转游戏对象,如果没有选择任何坐标轴,则可以任意旋转,如图1-16所示。
图1-16
缩放控件 :该控件的快捷键为R键。选择该控件并选择游戏对象以后,可以在坐标轴的X、Y、Z轴上对游戏对象进行单轴缩放,也可以通过中间的正方形来对游戏对象进行等比例缩放,如图1-17所示。
图1-17
1.1.5 小结
Unity3D是一款功能强大而又简单的集成编辑器和引擎,为游戏设计师提供创建和发布游戏所需的所有工具。可以提升游戏设计师的游戏制作技术,是一款值得大家学习的软件!
1.2 Unity3D界面
Angry Bots游戏是Unity3D的一个官方游戏演示,下面通过Angry Bots演示游戏来讲解Unity的界面与用途。
1.2.1 路径
当Unity3D安装完成后,一般Angry Bots演示会被自动打开。如果没有自动打开,则就会出现一个Project Wizard(项目向导)对话框,询问是否打开项目,如图1-18所示。
图1-18
提示
用户可以根据自己的计算机找到Angry Bots演示的打开路径。Max OS计算机在/Users/Unity, Windows XP计算机在C:\Documents and Settings\All Users\Documents\Unity Projects\Angry Bots或C:\Documents and Settings\All Users\Shared Documents \Unity Projects\Angry Bots, Windows 7/Vista/8计算机在C:\Users\Public\Documents\Unity Projects\Angry Bots。
1.2.2 Angry Bots简介
图1-19
在打开Angry Bots演示之后,使用鼠标左键单击屏幕顶端的Play按钮即可开始演示程序的测试,如图1-19所示。
按住键盘上的W、S、A、D键,可控制在Angry Bots演示中人物前、后、左、右的移动。按住鼠标左键能够进行自由射击,如图1-20所示。完成测试后,按下Esc键暂停游戏。最后使用鼠标左键再次单击Play按钮结束测试。
图1-20
提示
在Angry Bots中看到的大多数内容都不能用Unity3D直接制作,大部分素材都是用其他软件制作的,如3D Max、Maya等软件。
1.2.3 场景视图
本节将讲解编辑器中的Scene(场景)视图。场景是游戏工程中最基础的元素,也是游戏制作的第一步,只有建立了场景,才能放置其他资源。Scene(场景)视图是用来对场景进行交互式显示的,场景用于操作和编辑环境、玩家、摄像机、敌人和其他游戏对象。Scene(场景)视图也是编辑器中最重要的视图,制作一款游戏最多的操作都是在Scene(场景)视图中完成的。例如,摆放游戏对象的位置、预览游戏界面效果等,如图1-21所示。
图1-21
Scene(场景)视图的右上角有一个名为Persp的特殊工具,一般将其称为“陀螺仪”,如图1-22所示。Persp的作用是帮助用户迅速地切换观察场景的角度。使用鼠标左键单击绿色小圆锥(即Y轴),那么场景视图将呈现出场景的俯视图,如图1-23所示。Persp(陀螺仪)的上方有一个如图1-24所示的搜索栏,在搜索栏中输入vat(大桶),那么此时Scene(场景)视图会单独显示vat(大桶),如图1-25所示,此时就能对该物品进行单独的操作。操作完成后,左键单击清除按钮即可复原。
图1-22
图1-23
图1-24
图1-25
提示
下面介绍一些在场景视图中的常用操作。
在场景视图中选择任意游戏对象,按下键盘上的F键或是双击场景结构视图的任意游戏对象,可以在场景视图中进行快速定位。
按住鼠标右键旋转鼠标并且使用键盘上的W、S、A、D键可旋转场景摄像机视角。
按住Alt键并且按住鼠标右键左右拖动可以调整摄像机高度,也可使用鼠标滚轮上下滚动达到同样的效果。
按住Alt键并且同时按住鼠标左键拖动,可以使当前视野沿当前纵轴做圆周运动。
使用鼠标右键移动可以调整窗口显示角度。
按住鼠标右键,并且使用方向键可使视图进行X/Z方向平移。
按住鼠标中间可进行平面平移。
选择右上角的陀螺仪可调整视图窗口视角。
1.2.4 游戏视图
Game(游戏)视图是从游戏的摄像机中渲染得到的,它是最终发布的游戏。需要使用一个或多个摄像机来控制玩家玩游戏时实际看到的场景,如图1-26所示。
图1-26
1.2.5 层次视图
图1-27
Hierarchy(层次)视图包含游戏场景中所有具体的游戏对象,如摄像机平面贴图、3D贴图、光源、箱子、球体、胶囊体、平面和地形等,如图1-27所示。任何一个全新的游戏工程创建完毕后,系统都会默认创建一个游戏场景并且将主摄像机添加在该场景的Hierarchy(层次)视图中。对于3D游戏而言,摄像机能够以不同的视角观察游戏世界。
任何一款游戏都由若干场景构成,而任何一个场景都由若干个对象构成。Hierarchy(层次)视图中的游戏对象与Project(项目)视图中游戏资源密切相关,就如同任何一个漂亮的东西都需要美丽的外表来装饰一样。如在Hierarchy(层次)视图中创建一个立方体,在Project(项目)视图中存放这个立方体的显示材质,如果将材质赋予立方体对象,那么立方体对象就好像穿上了衣服,它的表面将发生改变。
提示
用左键单击Hierarchy(层次)视图中一个游戏物体,然后将鼠标放在Scene(场景)视图下,按住键盘上的F键,Scene(场景)视图中就会自动平移和缩放到这个游戏对象,执行Edit(编辑)>Frame Selected(选定帧)菜单命令也可达到此效果,如图1-28所示。
图1-28
1.2.6 项目面板
Project(项目)面板相当于一个资源仓库,在此面板中,用户可以使用它来访问和管理Assets(项目资源),如图1-29所示。
图1-29
1.2.7 检查面板
Inspector(检查)面板中的属性允许用户在代码外部改变脚本及组件的初始值。另外,检查面板中的值允许用户在游戏运行模式下随时更改,并且在游戏中立即生效,停止运行后各属性又恢复到最初的状态,这是Unity3D提供的一种运行时的调试方式,如图1-30所示。
图1-30
1.2.8 小结
本节通过Angry Bots官方演示,让大家熟悉了Unity3D界面的功能以及用途。
1.3 资源管理
1.3.1 创建新项目
双击软件快捷图标,启动Unity3D软件。在弹出的Project Wizard(项目向导)对话框中,使用鼠标左键单击Create New Project(新建项目)选项卡,如图1-31所示。
图1-31
根据个人习惯,在Project Location(项目路径)下选择项目保存路径。然后在Import the following packages(输入以下资源包)中勾选引入需要的系统资源包,如图1-32所示。设置完成后,单击Create(创建)按钮完成新建项目。
图1-32
提示
在Unity3D引擎中,凡是与该软件相关的项目、路径和插件等,都不允许出现中文,否则系统会报错,从而导致项目不能进行,甚至软件崩溃。一旦出现这类的错误提示,检查路径里是否包含中文名,然后修改即可。
1.3.2 创建游戏中的物体
首先执行Game Object(游戏对象)>Create Other(创建其他)>Plane(平面)菜单命令,创建一个平面用于放置物体,如图1-33所示。接着执行Game Object(游戏对象)>Create Other(创建其他)>Cube(立方体)菜单命令,新建一个立方体,如图1-34所示。再执行Game Object(游戏对象)>Create Other(创建其他)>Directional Light(平行灯光)菜单命令,新建一个平行灯光,如图1-35所示。最后使用场景控件调整游戏物体位置,从而完成游戏基本物体的创建,如图1-36所示。
图1-33
图1-34
图1-35
图1-36
1.3.3 游戏物体属性
选中Cube(立方体)时,在Inspector(检查)面板中出现该物体的所有属性,如图1-37所示。在新建Cube(立方体)时,会生成默认组件,如Transform(变换)、Position(位置)、Rotation(轴)、Scale(缩放)、Box Collider(方形碰撞器)、Mesh Renderer(网格渲染器)和Default-Diffuse(材质球),但很多时候在制作游戏时都会在每个游戏物体上加上一些组件,以便操作。
图1-37
1.3.4 添加组件和保存
1.添加组件
游戏物体本身的组件都能在Inspector(检查)面板中显示,其本身也可以附加很多的组件,如Rigidbody(刚体)。执行Component(组件)>Physics(物理)>Rigidbody(刚体)菜单命令,为游戏物体Cube(立方体)添加一个RigidBody(刚体)组件,如图1-38所示,属性设置如图1-39所示。
图1-38
图1-39
RigidBody(刚体):物体的基本物理属性,当检测碰撞之后,就要计算物理效果,而Rigidbody(刚体)就是提供计算基本参数的组件。
Mass(质量):刚体的质量。
Drag(阻力):物体所受的阻力。
Angular Drag(角阻力):影响物体的旋转速度。
Use Gravity(重力):物体的重力。
Is Kinematic(控制物理):能够影响这个刚体。
Interpolate(插值):以固定的帧率平滑物理运行效果。
Collision Detection(碰撞检测):如需详细了解,请查询访问http://game.ceeger.com/Script/Rigidbody/Rigidbody.html。
刚体添加完成后,使用左键单击Cube(立方体)并将其拖曳到图1-40所示的高度,然后单击Play按钮,Cube(立方体)会自由落下与地面发生碰撞,最后停留于场景地面。
图1-40
2.保存场景
执行File(文件)>Save Scene(保存场景)菜单命令或按下快捷键Ctrl+S,如图1-41所示。在弹出的保存场景对话框中输入要保存的文件名,如图1-42所示。此时在Project(项目)面板中就能够找到刚刚保存的场景,如图1-43所示。
图1-41
图1-42
图1-43
1.3.5 资源结构管理
在上一节中,完成了物体落地的场景制作,并将其保存到了项目面板中。下面来学习Assets(资源)目录结构的管理。在一个游戏的制作过程中,会保存或添加许多不同类型的文件。工欲善其事,必先利其器,为了提高工作效率,在游戏制作的过程中需要将不同的文件进行分类整理。图1-44所示为官方演示Angry Bots游戏的项目文件。
图1-44
执行Assets(资源)>Create(创建)>Folder(文件夹)菜单命令,或在Project(项目)面板中执行Create(创建)>Folder(文件夹)命令,即可完成资源文件夹的创建,如图1-45和图1-46所示,最后为其命名,如图1-47和图1-48所示。
图1-45
图1-46
图1-47
图1-48
提示
常见的文件夹名称如下。
Editor:自写的灵活方便插件。
Models:模型文件,其中会包括自动生成的材质球文件。
Others:其他类型的文件(一般作为不常修改的文件类型)。若认为是比较常用的话,可以提取成一个文件夹。
Plugins:主要是DLL的外部插件文件。
Prefabs:预设物储存文件。
Scenes:场景文件。
Scripts:脚本代码文件。
Sounds:音效文件。
Texture:贴图文件。
以上常见文件夹名称可以根据个人喜好进行适当更改。但还有一些文件夹是Unity3D系统指定的(在后面章节中会做详细讲解)。
1.3.6 小结
在本节中学习了项目的创建与管理,下节学习如何完成脚本的编写。
1.4 Unity3D脚本编写
脚本是Unity3D引擎制作游戏中的重要部分,因为脚本定义了游戏的行为。Unity3D引擎支持的编程语言有JavaScript、C#和Boo,Unity3D官方建议使用JavaScript为其编写脚本,作者认为C#定义的东西比JavaScript更加清晰。
1.4.1 脚本命名的规则
Unity3D引擎脚本命名的规则如下。
变量(首字母小写):存储关于游戏状态信息的内容。
函数(首字母大写):函数是一个代码块,编写完成过后能够反复使用。
类(首字母大写):函数的集合。
提示
在阅读代码的时候,注意单词的第一个字母,这样能更容易理解物体间的关系。
1.4.2 玩家输入
本节中,大家将学习编写物体在一个简单的游戏场景中做简单移动的程序。
启动Unity3D软件后,首先执行Game Object(游戏对象)>Create Other(创建其他)>Plane(平面)菜单命令,创建一个Plane(平面)场景,如图1-49所示。再执行Game Object(游戏对象)>Create Other(创建其他)>Cube(立方体)菜单命令,创建一个立方体(Cube)并且将其拖曳到平面场景的中心,如图1-50所示。然后执行Game Object(游戏对象)>Create Other(创建其他)>Point Light(点光源)菜单命令,创建一个点光源,如图1-51所示,并将其放置在长方体之上,使其更容易看见,如图1-52所示。
图1-49
图1-50
图1-51
图1-52
光源属性决定了光源的大小、强度、颜色以及范围。在属性面板中也可以改变任何阴影投射、加入光晕和镜头眩光等特效,如图1-53所示。
图1-53
Type(类型):光源的类型,其下拉菜单中有3种不同的光源,可以进行测试之后再选择光源类型。
Range(范围):点光源照射的范围。
Color(颜色):光源发射的颜色。在要达到某个特定的氛围或实现一个特效时,Color极为实用。
Intensity(强度):调整光源的强度,该属性不会改变向光源发射的光。
Cookie(光源贴图):用于设置复杂灯光的特殊效果。
Shadows Type(阴影类型):投射到其他对象上的阴影边缘的类型。在下拉菜单中Soft(柔和)阴影通常看上去更为真实,但是绘制的开销也最大。
Draw Halo(绘制光晕):绘制一个和光源的范围相等的朦胧光晕效果。
Flare(镜头眩光):为光源赋予镜头眩光效果。在该属性下拉列表中能够选择想要的眩光类型。
Render Mode(渲染模式):光源在任意受光对象上的渲染模式,如Vertex(定点)、Pixels(像素)或Auto(自动)。
Culling Mask(消隐遮罩):用于优化或减弱光源效果。
Lightmapping(光影贴图):在其下拉菜单中能够选择光影模式,如Auto(自动)、Realtime Only(实时渲染)或者是Baked Only(烘培渲染),其中Realtime Only(实时渲染)效果最好但是最占资源,Baked Only(烘培渲染)效率最高但是需要提前烘培好场景。
在游戏中,光源能够将玩家吸引到某一个特定的目标上,这样玩家就不会在黑暗里摸索。这就是在关卡中放置一系列光源的原因。如图1-54所示,在调节好游戏物体的位置后,保存该场景并为其命名为“ss”,即可开始脚本的创建。
图1-54
1.创建脚本
首先执行Assets(资源)>Create(创建)>C# Script(C#)菜单命令,创建一个空白脚本,如图1-55所示。然后在Project(项目)面板中将该脚本命名为Move(移动),如图1-56所示。
图1-55
图1-56
在Project(项目)面板中双击打开Move脚本,进行简单的脚本编写。在Update()函数中插入代码,函数内的每一帧代码,系统都会去执行,代码如下。
Void Update(){ transform.Translate (Inpt.GetAxis(“Horizontal”),0, Input. GetAxis(“Vertical”)); }
代码解析
Input.GteAxis()函数返回-1到1之间的值,在水平轴上,左方向键对应-1,右方向键对应1。
由于目前不需要向上移动摄像机,所以Y轴的参数为0。执行Edit(编辑)>Project Settings(项目设置)>Input(输入)菜单命令,即可修改映射到水平方向和垂直方向的名称和快捷键,如图1-57和图1-58所示。
图1-57
图1-58
2.附加脚本
脚本创建完成后,需要将其附加在物体之上。在Hierarchy(层次)视图中,单击需要添加脚本的游戏物体的Main Camera(主摄像机),然后执行Components(组件)>Scripts(代码)>Move(移动)菜单命令,如图1-59所示,Move(移动)脚本就附加到了Main Camera(主摄像机)上。
图1-59
提示
在Project(项目)面板中,使用左键单击move(移动)脚本并拖曳至Hierarchy(层次)视图中的Main Camera(主摄像机)上,也可附加组件,如图1-60所示。
图1-60
Camera(摄像机)是一个能够捕获并显示游戏世界的设备。在一个游戏场景中可以有无限的摄像机,通过对Camera(摄像机)的设置和操纵,能够真实、个性地显示游戏。摄像机属性参数设置如图1-61所示。
图1-61
Clear Flags(清除标记):清除场景中不需要的摄像机标记。需要多个摄像机显示不同游戏元素时使用。
Background(背景):用于设置所有元素之后的屏幕背景颜色(如果场景中已经附加了天空盒材质球,那么将不能设置背景颜色)。
Projection(投影):用于调整摄像机投影的方式。
Field of View(视野):沿着摄像机视觉的方向调整摄像机视角。
Clipping Planes-Near(裁剪平面-近):设置相对于摄像机位置绘制的最近点。
Clipping Planes-Far(裁剪平面-远):设置相对于摄像机位置绘制的最远点。
Viewport Rect(视口矩形):用于多相机分屏。
Depth(深度):设置摄像机在渲染顺序中的位置。
Rendering Path(渲染路径):设置项目渲染后的位置。
Target Texture(目标纹理):设置一个包含摄像机视频输出的纹理。
Occlusion Culling(遮挡剔除):当一个物体被其他物体遮挡住而不在摄像机的可视范围内时,不对其进行渲染。
提示
如果摄像机不在Clipping Planes-Near(裁剪平面-近)和Clipping Planes-Far(裁剪平面-远)所设置的范围之内,摄像机就无法显示出来。
3.运行游戏
使用鼠标左键单击播放按钮,在场景视图中,使用键盘上的W(前)、S(后)、A(左)、D(右)键移动主摄像机,此时摄像机移动的速度比较快,需要引入一个新的变量(时间增量)来降低其移动速度。
在前面脚本的Update(修正)函数内部代码中,摄像机的速度是以米/帧的方式运行的,但更佳的方案是使用米/秒的方式来运行,只有这样物体的速度才是可控。可以用Time.deltaTime乘以Input.GetAxis()函数的返回值,修改后的Move(移动)脚本如下。
{ using UnityEngine; using System.Collections; public class Move : MonoBehaviour public float speed = 5.0f; float x; float z; } //Use this for initializationvoid Start() // Update is called once per frame { void Update () { x = Input.GetAxis ("Horizontal") * Time.deltaTime * speed; z = Input.GetAxis ("Vertical") * Time.deltaTime * speed; } transform.Translate(x,0, z);
提示
这里的speed(速度)变量声明在Update(修正)函数外部(公开变量),因为该变量显示在脚本所附加游戏物体的属性面板上,当需要改动值的时候可以直接在属性面板上修改,如图1-62所示。
图1-62
1.4.3 移除组件
在属性面板中,单击属性右上方的设置按钮,在弹出的下拉菜单中单击Remove Component(移除组件)选项,如图1-63所示,即可移除该组件。由于所有属性值都将丢失并且不可恢复的,因此在移除组件时需要认真确认。
图1-63
提示
实际上,脚本也是组件的一种,它是一种自定义创建的组件,该组件能执行编写的任何功能。
1.4.4 常用的脚本类型
每当创建一个C#脚本时,该脚本都含有一个Star(t开始)和Update(修正)函数,这两个函数是脚本自带的。下面来介绍常见的函数。
Aweke(唤醒):函数中的代码在脚本初始化的时候被调用。
Update(修正):函数中的代码每帧都会被调用。
Start(开始):在任何Update(修正)函数之前,Awake(唤醒)函数之前被调用。Start(开始)和Awake(唤醒)函数的不同之处在于该函数只在脚本被启用时调用。
OnCollisonEnter(碰撞进入):在含有该函数脚本的物体与其他游戏物体发生碰撞时执行。
1.4.5 小结
在本节中介绍了Unity3D中脚本的基本概念,以及如何创建一个脚本。后面将以市面上5大热门手机游戏为例来讲解如何使用Unity3D进行手机游戏的开发。