Unity是一款强大的游戏开发工具,适合大量的游戏类型,从第一视角游戏到复杂的游戏。
Unity的大量的特性,如高度映射地形、网络支持、复杂物理集成和脚本等,可能让新手畏惧,但是掌握这些工具后却能给你带来无穷的回报。
本教程将指导你完成一个第三人称视角的完整3D游戏关卡。包括玩家输入、碰撞检测、一些高级脚本、Blob阴影、基础AI、游戏HUD、场景分屏和音效等。
一、你将学习到什么
本教程将集中讲解使用Unity进行游戏开发的相关技术,包含:
- 角色控制器(Character Controllers)
- 项目(Projectors)、
- 音频监听器(Audio Listeners)、音频源(Audio Source)和音频剪辑(Clips)
- 多个摄像机Camera(包括他们的切换)
- GUI脚本系统
- 碰撞(Colliders)
- 消息和事件(events)
- 灯光(Lighting)
- 粒子系统(Particle Systems)
- Blob阴影(Blob Shadows)
- 脚本编程(AI、状态机、玩家角色控制)
本教程将展示这些特性在创建游戏中的综合应用。
假设你已经知道:
Unity支持的3种脚本语言为javaScript,C#和Boo,你必须熟悉他们之中的至少一种。教程中使用的是js脚本。
本教程还假设你已经熟悉Unity的界面和相关操作,知道如何防止Asset到场景,如何添加Components到GameObject、在Inspector中编辑属性。
二、项目组织结构:
Unity并不强制你如何组织你的项目assets。你可以根据assert的类型来组织,如分多个文件夹,名字为 "Textures"、"Models"、"SoundEffects"等。但是我们发现这种组织方式只适用于小项目。对于复杂的项目,我们建议用户按功能组织文件夹,例如使用"Player"、"Enemies"、"Props"、"Scenery"等作为文件夹的名字。
这个教程是一个多人的team一起完成的,所以每个人都有自己习惯的方式和风格。所以慎重考虑后,我们决定保持本项目的原来组织方式。
1.抽象GameObjects和Components:
Unity的开发中以scene为中心,这样使我们的游戏开发基本是一个可视化的开发过程,通过大量的拖拽操作。这是一个关卡的理想设计方式,但是不是所有的assets都能通过这种方式显示。游戏assets是抽象的,从而不可见,所以他们通过虚拟的icons和wireframe gizmos来展示,或者根本不在场景视图中展示,例如Audio Source和Lights。脚本属于后面一种类型。
脚本Scripts定义了场景中的assets和GameObjects如何相互进行交互,这是游戏的核心。所以在脚本中添加注释将会是一个好的习惯。
本教程假设你能够阅读提供的脚本,并且理解脚本中的注释和内容。但是当一个脚本非常重要或者使用了特殊的技术时,我们将会详细进行讲解。
我们在脚本中添加了大量的注释,并且基本能够说明他们设计的含义。所以鼓励你们通读本教程介绍的脚本,并学习他们,通过大量的实践掌握他们。
2.
文件:
本文档中的项目最新下载地址为:
http://unity3d.com/support/resources/files/3DPlatformTutorialStart.zip
"Scenes"文件夹下面包含本教程的起始场景"TheGame",包含关卡Level geometry、摄像机camera、灯光、太空船SpaceShip和游戏内的收集物.
本教程假设你已经熟悉Unity的基本操作,例如调整场景中的Objects位置。第一个开始场景中已经有的是基础的场景和支撑。
三、排版规则:
这篇文档很长,为便于阅读,下面约定了一些简单的排版规则:
文字背景:
对于代码文本我们添加了特定的背景,从而方便阅读。例如:
// This is some script code.
Function Update()
{
DoSomething();
}
注意:教程的脚本中我们增加了大量的注释从而方便理解,但是在文档中的代码片段中我们省略了他们,从而节省空间。
脚本名、assets、菜单键或者Inspector Properties将会用黑体字显示。 相反,对于函数名我们将使用宋体显示。
四、Unity开发规范:
Unity是一款独特的开发系统。大多数开发者习惯于工作在代码编辑器上,使用90%以上的时间编写代码。Unity不同,是一个以asset为中心的开发工具。基于这个原因,了解Unity的开发规范是很有必要的:
1.Projects:
一个Unity开发的游戏将由Project来构成。里面包含你的项目所有元素,如模型、脚本、关卡和菜单等。通常,一个单独的Project文件包含所有的你游戏中需要的元素。当你打开Unity时,第一件事情就是打开一个Project。
2.Scenes:
每个项目都包含一个或者多个场景Scenes。单个场景将包含一个游戏关卡,但是大多数UI元素,例如游戏菜单、游戏结束界面和主要的分屏也将被包含在自己的Scene文件中。负责的游戏甚至会使用一个场景来仅仅进行初始化。尽管所有的关卡都会是一个场景,但是不是所有的场景都是用来作为关卡的。
3.GameObjects、Components、Assets&Prefabs:
理解Unity的关键就是要搞清楚GameObject和Component的关系。
3.1. GameObjects:
GameObject是构建游戏的基础单元。一个GameObject是一个很多组件Component的容器。一个GameObject一般包含多余一个的组件,所有的GameObject都包含Transform组件,来定义位置和坐标。
(笔者按:包含component最少的是空GameObject,只包含Transform组件)
3.2.GameObject Hierarchies:
GameObject强大的地方在于它可以包含其他的GameObjects。这就允许Hierachy视图中我们对GameObject进行组织管理。我们可以在一个GameObject下面增加复杂的模型和光照。被包含的GameObject我们一般称之为child GameObject。
3.3.Components:
Component组件是构建GameObject的基础。没有组件,GameObject将不能做任何事情。
一个Component组件可以表示可视化实体,如网格meshes、材料materials、地形信息terrian data或者粒子系统Particle System。其他的组件类型更抽象,例如摄像机Cameras、灯光Lights,他们没有物理模型可以表示他们。但是,你们看到他们的icon或者wireframe引导来配置他们。
Component组件总是挂载在GameObject上,而不能单独存在。一些组件可以挂载多个在同一个GameObject上。GameObject可以多个同类型的组件,例如可以包含多个脚本。但是其他的如粒子系统,则只能在一个GameObject中出现一次。例如如果你想定义多个粒子系统,你通常需要使用多个GameObjects,每一个包含自己的粒子系统。
3.4.Assets:
所有外部导入的Asset都会出现在Project面板中,他们可以是任何东西:一个简单的材料、纹理、音频文件,甚至一个完成的、prefab的GameObject。
例如,玩家角色Character的Prefab可以定义成一个单独的Prefab,包含模型和相关动画。也可以包含脚本组件、音频剪辑和其他需要的组件,所以你可以简单的拖动它到场景中,从而立即可以获得一个完整的可操作的avartar。
3.5.Custom Icons&Gizmos:
你可以告诉Unity为你的Asset显示定制的Icon和其他的可视化信息。
你的Project Asset显示在Project面板中。当你拖动到场景中,它将会显示在Hierarchy面板中。
3.6.Prefabs:
Prefab是一个定义模板的Asset。它之于Unity就像文档模板之于文字处理软件。当你放置Prefab到你的场景中,Unity放置的是一个Prefab到Hierarchy面板的连接,而不是完整的拷贝。我们称呼这个过程为实例化。每个连接都是一个到Prefab的引用。
如果你在Project中选择Prefab并且修改设置,将会发现这些改变会立即表现在场景中的实例上。这种特性非常适用于需要大量重复使用的物体上,例如子弹、敌人等。如果发现敌人的设置有问题,只需要调整原始Prefab的设置或脚本即可。
然而,如果你需要对单个的Prefab的实例调整其属性,那这些调整将只会影响这个单独的实例。
Prefabs在Project和Hierarchy面板中用蓝色文本显示。
注意:单个Prefab实例上不能增加新的组件,否则会切断其与原始的Prefab之间的关联。如果你进行上述操作,Unity将会警告你。然而,Unity也允许你在关联破坏后更新这个实例到原始的Prefab中。
五、致谢:
本文档的完成离不开以下同仁的帮助:
David Helgason, Joachim Ante, Tom Higgins, Sam Kalman, Keli Hlodversson, Nicholas
Francis, Aras Pranckevičius, Forest Johnson and, of course, Ethan Vosburgh 他们制作了文档中精美的Assets。