如何使用Unity制作2.5D游戏(第1部分)

原文出自:http://www.raywenderlich.com/4551/how-to-make-a-2-5d-game-with-unity-tutorial-part-1, 由游戏邦翻译, 转载请注明来自游戏邦

2.5D游戏从根本上来说是3D游戏,但是经过开发者的处理后,游戏玩法只停留在2D轴上。(请点击此处查看第2部分

《超级玛丽兄弟Wii》、《小小大星球》和《Paper Monsters》都是绝妙的2.5D游戏。

制作2.5D游戏(3D游戏也可以使用)的绝妙方式是使用流行、简单和廉价的游戏开发工具Unity。

所以,在本系列教程中,我将向你展示如何使用Unity来制作简单的2.5D游戏《Shark Bomber!》。

如果你是个Unity新手,而且想要学习这种工具,那么本教程正适合你!你会学到如何从头开始制作出简单的游戏,并在此过程中学到许多东西。

在这款游戏中,你控制的是架小型但装备精良的飞机,你的目标是向邪恶的鲨鱼投炸弹,同时还要保护可爱的小丑鱼。

Unity不使用Objective-C,所以阅读此教程不需要任何Objective-C经验。但是,拥有OO语言经验会使学习更加顺畅,比如C#、Java或Actionscript。

要记住,这是个针对Mac用户的教程,Windows用户可能无法使用。而且还要记住,你只能在iOS设备(不是模拟器)上进行测试,所以要先确保拥有可使用的设备!

安装Unity

首先,让我们来安装Unity编辑器。如果你的Mac电脑上已经安装了这个工具,可以跳过这个步骤。

从下载页面处下载Unity。获得DMG文件后,打开Unity安装程序,经过标准安装过程后,你会在二进制数据存放点看到/Applications/Unity文件夹。

打开Unity,点击“注册”按钮(该工具可以先免费试用)。选择“连网激活”,点击“下一步”,填写网页上的表格。

重点:根据本教程需要,你需要选择“激活专业/iOS测试版”选项,这样你才能将游戏发布到iPhone上。

注册完成后,Unity就会开启如下窗口:

关闭弹出窗口“欢迎来到Unity”,选择“文件\新项目”,选择文件夹存放点,将项目命名为“SharkBomber”。确保所有程序包都未被选择,然后点击“创建项目”。

现在,你看到的是个空白窗口。窗口上有许多按钮,我们将在下个部分中挨个解释。

Unity编辑器概述

现在,让我们通过某些额外的调试来实现已知的配置。
在应用窗口右上方,你会看到选择框,从列表中选择“高度”。这会重新分布窗口内容(默认选择为“宽度”)。

现在,在窗口左上角(工具栏下方)找到“游戏”标签,将其拖动到窗口底部附近的区域,直到你看到它将融入底部的指示,将其放在底部。

现在,你应当可以看到如下图所示的窗口布局:



让我们花点时间来阐述下这几个不同的面板:

  1. 场景:你可以在这里移动3D模型,浏览3D世界。
  2. 游戏:这是你所选择的镜头(游戏邦注:在这款游戏中指主镜头)看到的画面,在你使用编辑器时会即时更新。当你点击“运行”时,你的游戏可在此处运行,你可以测试游戏。
  3. 等级系统:显示你的对象树(游戏邦注:类似于HTML DOM),目前你只有一个镜头,但是我们随后会添加更多东西。该列表中的对象会呈现在场景中。
  4. 项目:这里的内容有你的项目、资产、音频文件以及所有你现在或随后将用到的东西。
  5. 检查器:你可以在这里看到场景中所有选择对象的资产并对它们做出调整。Unity的独特之处在于,当你运行场景时检查器依然保持运转,所以它同样也是你的调试器!
  6. 工具栏:这里有你可以用来与场景中对象互动的工具和用来测试场景的“运行”和“暂停”按钮。

在你的Unity3D项目中,你可以拥有许多不同的场景,并在它们之间来回切换。现在,你已经在编辑器中设立了一个空白的场景。让我们将其保存。

  1. 在项目面板中点击右键,选择“创建/文件夹”,新文件夹生成。
  2. 将其重命名为“场景”,左键单击文件夹名称或选择文件夹后按“回车”都可以重命名文件夹。
  3. 现在,在主菜单处选择“文件/保存场景”,将保存对话框导航到“(你的项目目录)/资产/场景”,将场景保存为“LevelScene”。

让我们来确认下,在项目面板中打开场景文件夹,你可以看到LevelScene场景。
现在,我们做好了运行游戏的准备,点击上方的播放按钮!虽然画面没有发生改变,但事实上游戏正在游戏面板中运行!不要忘了,再次点击播放按钮来暂停游戏,这一点很重要!

设置iPhone Unity3D项目

Unity的精妙之处在于,它可以用来为iPhone、 Mac、Wii和其他平台构建游戏。在本教程中,我们将构建的是iPhone游戏,所以我们需要先创建某些细节。

从菜单中选择“文件/构建设置”,然后点击“添加当前”按钮将当前选择场景添加到项目中。你可以看到,当它被添加时获得了指数“0”,这意味着它将是游戏开启时首个被加载的场景。这正是我们想要的结果。

从平台列表中选择iOS,点击“转换平台”按钮。现在,Unity的图标显示在iOS列中。

这便是我们现在需要的所有设置,点击“玩家设置”并关闭这个弹出窗口。你会注意到,玩家设置在检查器中开启,我们也需要在这里进行许多设置。

在“呈现平台”中,确保显示iPhone的标签已被选中,如下图所示:

此处可以进行诸多设置,多数内容你已经在Xcode中接触过,你可以随后自行体验和探索。

现在,使用这个检查器进行下列修改:

  1. 在“分辨率和呈现”选项的“默认方向”中选择“水平左向”。
  2. 在束检查器的“其他设置”选项中输入所有你想要的内容(除了默认值)。
  3. 在“其他设置”选项中,将目标设备选择为“仅限iPhone”。

最后个步骤:左方的“游戏”标签下有许多可用的不同方向和分辨率,选择“iPhone Wide (480×320)”以匹配默认的横向方向。

祝贺你,现在你完成了个基本的“Hello World”项目,你可以尝试将其在iPhone上运行!

在iPhone上运行游戏

为测试之前我们进行的设置,我们准备在Xcode和iPhone上测试项目。

首先从开发者最喜欢的Xcode版本开始,如果有欢迎屏幕的话先将其关闭,转换回Unity。这是种告诉Unity运行何种Xcode版本的技巧,同时运行两者即可。

回到Unity中,从菜单中选择“文件/构建&运行”,构建设置会再次弹出,点击“构建和运行”按钮。

你会被询问要将Xcode保存在何处。在项目目录中创建名为“SharkBomberXcode”的文件夹(Xcode内容将保存于此文件夹中),在文件名栏中输入“SharkBomber”。

片刻之后,项目构建完成,你会看到Xcode窗口弹出,打开的项目名为Unity-iPhone。Unity已经生成了Xcode项目源代码,现在这个已生成的项目以做好了构建和运行的准备。
你或许想要看下源代码,但是它事实上只是个样板文件,加载包含些许dll文件和资产的单框架。

你有两个目标,所以确保你的iOS设备已插入,选择“Unity-iPhone”目标和你的设备。我无法让模拟器目标运行,如果你可以做到的话,是件很棒的事情,我在下文阐述中使用的都是针对iOS设备。
片刻后,点击“运行”按钮,你的Unity项目现在能够在iPhone上运行了!

你会看到默认的Unity开启屏幕,然后便是场景的蓝色背景(角落处还有“试用版”字样)。
停止运行任务,切换回Unity,保存项目。

设置场景

首先,让我们来设置场景的主镜头。选择“等级系统”中的“主镜头”,在检查器中找到“投影”并将其设置为“正交”,“大小”设置为“10”,在剪裁平面中将“近端”设置为“0.5”,将“远端”设置为“22”。现在,你可以看到场景中镜头附近有个盒子,这是场景中可视范围的边界。

注意,我们已经将镜头投影设置为“正交”,这意味着深度坐标不会影响到内容在屏幕上的外观,我们可以有效地创建出2D游戏。现在我们先这样来做,直到你熟悉了Unity,我们再转向3D投影。

在检查器中将镜头位置坐标设置为(0,0,0)。注意,从现在开始,当我将位置编写成(x,y,z)的形式时,就是为该资产设定了在3个盒子中的值。

右键点击项目面板,再次选择“创建/文件夹”,将新文件夹命名为“纹理”。然后下载我为该游戏制作的背景图片,将其保存在你的硬盘中。将背景图片从查找器中拖动到你刚刚创建的“纹理”文件夹中。

我的iMac完成此次导入耗费了20秒左右的时间,完成后打开文件夹,选择“背景”纹理,然后在检查器中查看纹理资产。在预览面板的低端有行文字,表明Unity已经识别我们正在导入纹理,对其进行压缩处理。

从菜单中选择“游戏对象/创建其他/飞机”,你会看到镜头旁边出现蓝色矩形。这便是我们刚刚添加到场景中的飞机,我们将把已经获得的纹理运用到它身上。

在等级系统面板中选择“飞机”,检查器上方的文本显示“飞机”进入“背景”。这会改变对象的名称,你可以通过这种方式来将对象重命名。从项目面板中拖动“背景”纹理,将其放入等级系统的“背景”对象中。在检查器中将飞机的位置设为(4,0,20),旋转设为(90,180,0),缩放设为(10,1,5)。正如你在“场景”面板中看到的那样,游戏会缩放和旋转飞机,使之面对镜头,这样镜头才会将飞机视为游戏的背景。

现在,为了能清楚地看到场景中的内容,我们需要光照(这点类似于现实生活),选择“游戏对象/创建其他/方向性光照”,这会给你的场景添加些许光照。在“等级系统”中选择方向性光照,将其坐标设置为(0,0,0)。

现在,我们完成了场景的所有设置和背景,到了添加对象并让它们开始移动的时候了!

向场景添加3D对象

从菜单中选择“游戏对象/创建其他/方块”,这样就像你的场景中添加了一个方块对象。这代表的就是游戏玩家,所以我们将它重命名为“玩家”。
将其位置设置为(-15,5.3,8)。你会看到方框出现在靠近“游戏”面板屏幕左侧的位置上,这便是我们游戏中飞机的起点,它将飞过海面到达屏幕的另一端。

现在,让我们导入飞机模型!我们使用由Reiner “Tiles” Prokein制作的免费3D模型,他将其免费发布到自己的网站上。
要进行上述步骤,先下载他的飞机模型并将内容解档。

在“项目”面板中点击右键,选择“创建/文件夹”,将文件夹重命名为“模型”。你可以在文件夹中解档飞机模型,将文件“airplanelinnenmesh.obj”拖动到“项目”面板的“模型”文件夹中。

然后右键点击“模型”文件夹,选择“创建/文件夹”,将新的子文件夹重命名为“纹理”,我们将运用到模型中的纹理保存于此处。将“airplanelinnentex.bmp”文件拖动到新创建的“纹理”文件夹中。

接下来,在“等级系统”面板中选择“玩家”对象,查看“检查器”,“网状过滤器”选项是设定对象几何的过滤器(目前其设定的是方块几何)。在“网状-方块”行中寻找中间带点的小圆圈,然后点击它,这样就能打开弹出窗口,你应当在窗口中双击飞机模型,这会将你的对象集合转变为飞机。

现在,有个细节问题,飞机看起来有点糟糕。我不是个3D专家,但我发现Unity中有解决这个问题的方法:在“项目”面板中选择“airplanelinenmesh”,然后在“检查器”中找到“普通”,然后选择“计算”,接下来向下滑动滚动条,点击“应用”按钮。

现在,你可以看场景中看到平滑的飞机模型!接下来,让我们来应用它的纹理: 将“airplanelinnentex”纹理从“项目”面板中拖动到“等级系统”面板的“玩家”中。Unity会自动将纹理应用到场景中的飞机模型上。

最后对飞机做些许调整:在“玩家”对象中将旋转设为(0,90,350),缩放设为(0.7,0.7,0.7),这会旋转和缩放飞机,使之看起来在海平面上飞行。

这款游戏还并未完善,在下个版块中我们将让飞机开始飞行!

开始用C#进行Unity3D编程

正如你已经在构建设置对话框中看到的那样,Unity可以将你的项目构建成Wii游戏、iPhone游戏、单机Mac游戏等。正因为Unity如此全能,所以它需要某些跨媒体层次,你可以用来对游戏编程,每个不同的构建都会将其转变为平台专用代码。

所以,你需要使用C#在Unity中编程(而不是Objective-C)。当Unity生成你的Xcode项目时,它会自动将C#代码转换为平台专用代码!在“项目”面板中点击右键,选择“创建/文件夹”,将新建文件夹重命名为“类”。右键点击“类”文件夹,选择“创建/C#脚本”,将新文件重命名为“玩家类”。在“项目”面板中点击右键,选择“同步MonoDevelop项目”,这样会打开MonoDevelop IDE,在这个IDE中,你可以用C#来编程。

注:MonoDevelop是个移植自Linux的程序,用户界面类似于Gnome,所以程序崩溃是很正常的事情,尤其是在你重新调整窗口大小时。如果发生上述情况,只需要再次点击“同步MonoDevelop项目”即可打开。

以下是MonoDevelop GUI的3个主要区域:

  1. 你的MonoDevelop项目浏览器,在资产/类中你可以看到PlayerClass.cs文件
  2. 当前打开类的概览
  3. 编辑器区域,句法高亮和自动完成能够为你的编程提供帮助

在项目浏览器中找到你的PlayerClass.cs文件,双击将其在编辑器中打开。确保类如下所示:

using UnityEngine;
using System.Collections;
public class PlayerClass : MonoBehaviour
{
    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
    }
}

“using”句法包括所提供的库和框架,在UnityEngine这个库中,你可以访问iPhone加速计、键盘输入和其他手持设备功能。

你可以定义新类并继承自MonoBehaviour,这可以让你获得大量的内容:你可以使用当特定事件被触发时会被调用的大量方法。

下面数行就是开始和更新方法,这是两个重要事件。

  1. 开始在对象显示在屏幕上时调用,这样你才能进行初始化(很像viewDidAppear: in UIController)。
  2. 更新在每帧播放时调用(每秒调用次数可能是30、60或100),以实现移动和游戏逻辑等。

现在,让我们先转回Unity片刻。我们想要让飞机在海面上飞行,而且当它从屏幕右侧移出时能够再次从左侧移入屏幕。让我们来看看要将飞机移动到屏幕左侧的哪个位置。“场景”面板的右上角有个方向部件,点击X柄(显示是个红色的圆锥体,作者将其称为“柄”):

这可以旋转场景,将其方向调整为水平面对你。再次点击现在位于部件左侧的柄,这会再次使场景旋转,你可能需要多次点击左柄,直到你看到的场景正面如下所示:

现在,你可以使用鼠标滚轴来缩放场景,使其适合“场景”面板的大小。确保上方工具栏的移动工具被选中,在“等级系统”中选择“玩家”。

现在,你可以看到有个新部件附在飞机上,带有绿色和红色的箭头。现在,你可以拖动箭头,它们会根据箭头所代表的轴来移动飞机:

我们需要做的就是拖动红色箭头(代表水平轴),将飞机向右侧拖动,直到它离开下方的“游戏”面板。

在“场景”面板中拖动时,要同时查看“游戏”面板。将飞机放置在可视屏幕之外,在“检查器”中查看它的位置。

现在,X的值应当在17.25左右,这是屏幕的右侧边界,你可以向左拖动飞机,这样便可以看到左侧边界的值为-17.25左右,所以我们将在设定飞机飞行时使用18和-18这两个值。将飞机放回屏幕左侧之前的位置。转换回MonoDevelop,对PlayerClass.cs进行下列修改:

//just after class declaration line
public float speed;

//inside the Update method
if (transform.position.x > 18) {
//get new speed
speed = Random.Range(8f,12f);
transform.position = new Vector3( -18f, transform.position.y, transform.position.z );
}
transform.Translate(0, 0, speed * Time.deltaTime);

或许你已经猜到,你刚刚在类上设定了公共资产“速度”,Unity的独特之处就在于,所有的公共类资产都可以通过“检查器”面板访问!

所以,你可以在IDE中设定类资产值,你可以在游戏运行时自由地即时调整资产值,这难道不是件很棒的事情吗?

对每个游戏对象(屏幕中的所有东西都是游戏对象)来说,“改变”变量是个处理对象空间位置的资产,包括旋转、位置和缩放等。根据每次更新调用来调整对象的位置,这样它才能够移动到屏幕右侧。

我们不能只按照更新的每次调用来将飞机移动特定距离,因为没有人知道该命令每秒的调用次数。事实上,我们以每秒单位数来确定速度,将速度除以最后一次调用更新所经过的时间。这样,对象的移动就会独立于当前帧率,保持以相同的速度移动。

转化调用涉及到3个值,也就是每个轴上面需要做出的转化。你或许已经注意到,我们也在Z轴(这就是第3个参数)上移动飞机。我们必须这么做,因为我们要在屏幕上旋转飞机,所以转化Z轴从玩家的视角来看就是将其移动到右侧!

看看“if”条件,我们查验transform.position.x是否大于18,如果条件满足,我们会将飞机的位置设置在相同的坐标上,但X轴值改变为“-18”。我们使用新的Vector3(x,y,z)来设定位置,我们将在定位中大量使用这些矢量。你还会看到,我们将速度设定为8到12间的随机值,这只是为了让飞机可以更自由地移动,让游戏更加有趣。

这样,我们便为飞机的移动做好了准备!

转回Unity,将“玩家类”从“项目”面板中拖动到“等级系统”面板的“玩家”上,这样你便将类同游戏对象绑定起来。在“等级系统”中选择“玩家”,查看“检查器”,你会看到出现了名为“玩家类(脚本)”的新带,你还可以看到公共资产。将它的值设定为“12”。

准备好之后,点击播放按钮。你会看到在“场景”和“游戏”面板中,飞机开始移动,当它从右侧移出时会回到屏幕左侧。你还可以在“检查器”中看到飞机位置的X轴数值实时更新,它向你展示的是飞机在特定时刻的位置。而且,飞机每次飞行的速度会随机改变。

享受目前所取得的成果后,不要玩了再次点击播放来暂停游戏。

接下来,我们要为开始为这架飞机制作敌人——一只凶险的鲨鱼!现在,你应当对这个工具的基本使用方法较为熟悉。我们接下来会进展得更快,因为接下来一段时间里我们无需完全重新制作所有东西。

需要休息会儿吗?到目前为止,我们已经教授了许多内容!如果你感到疲惫,可以先休息会儿,只是要注意保存Unity项目。但是,当你再次打开Unity项目时,工具默认会打开空白场景。要加载你正在制作的这个场景,双击“项目”面板中的“LevelScene”,你就可以继续工作了。

添加鲨鱼

下载并解档鲨鱼模型。像你之前处理飞机那样,将文件“shark.obj”拖动到“项目”面板的“模型”文件夹中,将“sharktexture.bmp”放置在“模型/纹理”中。

从菜单上选择“游戏对象/创建其他/胶囊”,将“等级系统”中的“胶囊”对象重命名为“鲨鱼”。在“检查器”中的“网过滤器”带中,点击内部带点的圆圈,在弹出窗口中双击鲨鱼模型。现在,你应当能够在“场景”和“游戏”面板中看到鲨鱼几何。

将“sharktexture”(位于模型/纹理)从“项目”面板拖动到“等级系统”的“鲨鱼”对象中,这会让你的鲨鱼拥有有力的大嘴和邪恶的眼睛!看到这样的鲨鱼,我已经冒出了炸它的念头!

确保“鲨鱼”被选中,在“检查器”中设置如下资产:位置(20,-3,8),范围(1.2,1.2,1.2),这样鲨鱼便被放置在贴近镜头可视范围右侧的位置,它从这里开始向屏幕左侧移动。

现在,因为我们希望鲨鱼能够同我们的炸弹互动,所以我们希望鲨鱼的碰撞器或多或少能同鲨鱼的几何配对。正如你看到的那样,有个绿色的胶囊与屏幕中的鲨鱼粘连。这便是鲨鱼的碰撞器。让我们将其与邪恶的鲨鱼身体配对。

在“检查器”中寻找“胶囊碰撞器”带,设定如下数值:半径设为“1”,高度设为“5”,方向设为“X轴”,中心设为“(0,0,0)”。现在,你会看到胶囊碰撞器已经被调整到与鲨鱼身体相似的样子,比原先好多了!

最后,在“项目”面板“模型”文件夹中选择“鲨鱼”模型,然后在“检查器”中寻找“普通”,选择“计算”,然后下拉点击“应用”按钮。

在“项目”面板“类”文件夹中点击右键,选择“创建/C#脚本”,将新脚本重命名为鱼类。点击右键,选择“同步MonoDevelop项目”。

MonoDevelop将会弹出,打开FishClass.cs文件,输入下列代码:

using UnityEngine;
using System.Collections;
public class FishClass : MonoBehaviour {
    public float speed = 6f;
    // Update is called once per frame
    void Update () {
        if (transform.position.x < -30 || transform.position.x > 30) {
            //turn around
            transform.Rotate(new Vector3(0,180,0));
            transform.Translate( new Vector3(-10, -transform.position.y + Random.Range(-4,-1),0) );
        //get new speed
        speed = Random.Range(6f,10f);
    }
    transform.Translate( new Vector3(-speed*Time.deltaTime,0,0) );
}

}

这些代码同我们上文中针对飞机编写的很相似。我们设立速度资产(以每秒为单位),在更新事件处理器中使用转化。鲨鱼的移动便由此实现。
注意,这次我使用的是:

transform.Translate( new Vector3(x,y,z) );

这样做只是想演示某些使用不同参数的方法,尽管使用独立的3个数值和1个矢量是完全相同的。
现在,让我们看看鲨鱼在到达屏幕边界后会做出何种动作。这次我们设定的鲨鱼移动屏幕边界坐标为-30和30,一段时间内鲨鱼将从屏幕上消失,这样玩家就无法轻易地在其折返时进行伏击。

当鲨鱼到达左右屏幕边界时,它会折返并改变速度,并不断如此往返。
显然,transform.Rotate(new Vector3(x,y,z))的调用可以使对象根据特定坐标值转向,你对transform.Rotate(new Vector3(x,y,z))应当很熟悉了。

这确实是件很简单的事情!转换回Unity,拖动“鱼类”脚本到“等级系统”的“鲨鱼”对象上。现在点击播放:你可以看到鲨鱼往返游动,直到被炸弹击中。太棒了!

添加小丑鱼

让我们再用同样的做法来添加小丑鱼。步骤如下:

  1. 下载并解档小丑鱼模型。
  2. 拖动“mesh_clownfish.obj”到“项目”面板的“模型”文件夹中,将“clownfish.bmp”拖动到“模型/纹理”中。
  3. 选择“游戏对象/创建其他/胶囊”,将“等级系统”中的“胶囊”对象重命名为“小丑鱼”。
  4. 点击“网过滤器”带有点的循环按钮,在弹出窗口中点击小丑鱼几何。
  5. 将“小丑鱼”模型纹理拖动到“等级系统”中的“小丑鱼”对象上。
  6. 确认“小丑鱼”已选中的情况下在“检查器”中修改下列资产:位置设为(-20,-1,7),旋转设为(0,180,0),缩放设为(0.4,0.3,0.3)。
  7. 在选中“小丑鱼”的前提下,在胶囊碰撞器带中修改下列资产:半径设为“4”,高度设为“4”,方向设为“Z轴”,中心设为“(0,0,0)”。
  8. 将“鱼类”从“项目”面板拖动到“等级系统”的“小丑鱼”对象中。这样就把与鲨鱼相同的一般鱼类分配给小丑鱼。
  9. 在“项目”面板“模型”文件夹中选择“mesh_clownfish”模型,然后在“检查器”中找到“普通”,选择“计算”,然后下拉并点击“应用”按钮。

点击播放,现在你可以看到屏幕上已经有两条移动的鱼,而这次我们完全无需另外编写代码!

鱼可以来回游动,飞机也能够飞行,所有内容都运转良好。现在,我们还需要炸弹。

设置炸弹

下载和解档油桶模型。与之前一样,将“colourcan.obj”文件拖动到“项目”面板“模型”文件夹中,将“cantex.bmp”文件放入“模型/纹理”。

从菜单中选择“游戏对象/创建其他/胶囊”,将对象重命名为“炸弹”。在“网过滤器”弹出窗口中双击油桶几何。将“cantex”纹理拖动到“等级系统”中的“炸弹”对象上。在“检查器”中的“胶囊碰撞器”中点击下图按钮打开弹出菜单:

当弹出菜单出现时,选择“重置”,这样碰撞器自动会接受分配的几何大小!

接下来,在“项目”面板“模型”文件夹中选择“colourcan”模型,然后在“检查器”中找到“普通”,选择“计算”,然后下拉并点击“应用”按钮。

接下来,让我们来接触一项新的内容!再次选择炸弹对象,在胶囊碰撞器带中勾选“Is Trigger”选框!勾选这个选框意味着当炸弹同其他对象碰撞时会触发事件。

但是,要使上述情况发生,我们还需要为炸弹分配刚体,因为至少要有一个碰撞对象带有刚体。从菜单中选择“组件/物理/刚体”(此时要确保等级系统中的炸弹被选中)。

完成这个步骤后,“检查器”中应当会显示新带“刚体”。去除“使用万有引力”,然后勾选“Is Kinematic”,这样我们才能程序化地控制刚体。这样,碰撞爆炸实现的所有条件均已达成!

下载炸弹释放的音效,将其保存在硬盘上。

我们要在飞机投放炸弹时播放这个音效,也就是当炸弹首次出现在屏幕上的时候。让我们来实现这个目标!

右键点击“项目”面板,选择“创建/文件夹”,将新文件夹重命名为“音频”。将“bahh1.aif”文件拖动到“音频”文件夹中。接下来,将“bahh1”音效文件从“项目”面板拖动到“等级系统”中的“炸弹”对象上。

无论你是否相信,我们需要做的就只有这么多。音效同炸弹绑定,当炸弹出现在屏幕上时就会播放。现在,你就知道用Unity制作游戏是件很简单的事情。

在“等级系统”中选择“炸弹”对象,在“检查器”中找到“音频来源”带,可以看到“激活时播放”选框已经勾选,这就相当于告诉音频在对象出现在屏幕上时播放。再看看“场景”面板,你会看到现在炸弹上有个扬声器的图标。

预制游戏对象

“等级系统”展示的是当前显示在屏幕上的内容,“项目”包含的是你所拥有的所有对象。这与你在本板块要实现的目标有关,也就是让飞机装载多个炸弹,并根据自己的意愿将其投放到海中。

我们准备要做的事情是,预制游戏对象(即该对象已准备好出现在屏幕上)但不将其添加到屏幕上。
在“项目”面板中点击右键,选择“创建/文件夹”,将其重命名为“预制”。右键点击“预制”,选择“创建/预制”。将新预制重命名为“炸弹预制”。注意,小方块图标是白色的,这表示这是个空白预制。

现在,从等级系统中将“炸弹”拖动到“项目”中的“炸弹预制”上。注意,现在方块图标变为蓝色,这表示这是个满预制,已经做好克隆的准备。看看现在的“等级系统”面板,“炸弹”字体变为蓝色,这意味着现在对象正处于预制状态。

现在,我们已经设置完成,就不需要原本位于屏幕上的炸弹对象。右键点击“等级系统”中的“炸弹”,选择“删除”。

接下来,让我们来编写代码。转向MonoDevelop,打开PlayerClass.cs,在“速度”资产中添加下列代码:

public GameObject bombPrefab;

在这个资产中,我们涉及到了炸弹预制,我们将实现上述设定的目标。注意,资产类型是“游戏对象”,我之前说过,游戏中的所有东西都是游戏对象(很像Cocoa中的NSObject),所以对所有对象设定此种类型是比较安全的做法。
现在,转换回Unity,选择“玩家”。正如你所期望的那样,“检查器”中的“脚本”下出现新资产“炸弹预制”。让我们来设定其数值:将“炸弹预制”从“项目”面板拖动到“检查器”中的“无(游戏对象)”上,现在区域显示它已经为炸弹预制分配了数值。
对于游戏中的炸弹,我们还需要有个C#类,右键点击“项目”中的“类”文件夹,选择“创建/C#脚本”,将其重命名为“炸弹类”。右键点击并选择“同步MonoDevelop项目”,MonoDevelop会弹出。打开BombClass.cs并将内容替换为如下代码:

using UnityEngine;
using System.Collections;
public class BombClass : MonoBehaviour {
    private float ySpeed = -4f;     
    // Update is called once per frame
    void Update () {
        transform.Translate( new Vector3(0f, ySpeed*Time.deltaTime, 0f) );
        if (transform.position.y < -11) {
            Destroy(this.gameObject);
        }
    }
}

这段代码同上文所述代码极为相似,我们每帧转化对象,当移出屏幕边界时做出适当的反应。在炸弹的设置中,我们想要的是炸弹在移除边界后被摧毁,这样我们就能保持从炸弹预制中生成新对象。
在代码中,“this”指C#炸弹类,gameObject资产指屏幕上的对象,代码让我们能够摧毁屏幕上的对象和所有相关组件。有关游戏对象等级系统的内容,我们将在教程的第2部分中讨论。

轰炸鲨鱼

终于到了最后一个部分,轰炸鲨鱼!
打开PlayerClass.cs,在更新方法末端添加:

if (Input.anyKeyDown) {
    GameObject bombObject = (GameObject)Instantiate(bombPrefab);
    bombObject.transform.position = this.gameObject.transform.position;
}

让我们来依次分析这3行代码:

  1. 输入是让你可以使用键盘、鼠标、加速计和触摸的类。当按键被按动后,Input.anyKeyDown值变为真,这种情况一次性只能出现一次。比如,按键首次按动过后,Input.anyKeyDown又会变为假,直到另一个按键被按动。anyKeyDown是手持抽象,当玩家点击鼠标、按动键盘按键或触摸iPhone屏幕的动作被接收到时,它的值会变为真。
  2. (GameObject)Instantiate(bombPrefab)用来从预制中创建实例,将其添加到场景中。
  3. 最后,我们将炸弹的位置设成与飞机相同。

这样,当玩家点击屏幕时,炸弹都会出现,随后开始下落,当离开屏幕时就会自动消失。
让我们来尝试一下!转换回Unity并点击播放,现在如果你在“游戏”面板中点击(模拟触摸操作),就会看到炸弹在飞机所在点生成。
多次点击就会生成多枚炸弹。你应当还能听到炸弹的音效。但是炸弹不会下落!为什么呢?你能不能自己找到问题所在呢?

我希望你能够自己发现问题,问题就是:你还未给炸弹预制分配炸弹类。从“项目”面板“类”文件夹中将“炸弹类”拖动到同面板“预制”文件夹中的“炸弹预制”上。查看“检查器”,看是否能够看到炸弹类脚本带。现在再次点击播放,效果好多了!

但是,仍然不够完美,那些鲨鱼并没有在被炸弹击中后死亡。因为我们已经配置了碰撞器和炸弹的刚体组件,我们只需要添加代码来对碰撞做出反应。转换回MonoDevelop,将下列新方法添加到炸弹类中:

void OnTriggerEnter(Collider obj) {
    if (obj.gameObject.name == “Shark”) {
        //reset shark
        obj.gameObject.transform.rotation = Quaternion.identity;
        obj.gameObject.transform.position = new Vector3(20f, -3f, 8f);
        Destroy(this.gameObject);
    }
}

让我们来逐行解释上述代码:

  1. OnTriggerEnter是当实体同其他实体发生碰撞时被调用的方法,第2个实体被视为参数。
  2. 在这行中,我们检测炸弹击中的对象是否是“鲨鱼”。
  3. 如果被击中的确为鲨鱼,那么首先我们会重置对象旋转。
  4. 其次,我们将鲨鱼重置回其原本的位置。
  5. 最后,我们调用this.gameObject摧毁来让炸弹从屏幕上消失。

依然很简单,不是吗?你只需要这些代码就足够了。转换回Unity并运行游戏!用炸弹击中鲨鱼后它会消失,然后屏幕中会出现新的鲨鱼。

你还可以从菜单中选择“文件/创建&构建”,当Xcode弹出时点击其中的“运行”,这样你就可以在iPhone上运行游戏了!

在本系列教程的第2部分中,我们将增添游戏趣味性,让游戏变得更富挑战和有趣!

标签: unity

?>