孙广东 2015.7.11
在本教程中,将了解到U5新功能,你通过本教程,您将了解以下内容:
你可以先下载空的资源项目:起始项目。将其解压缩,然后在 Unity 中打开StarterProject\Assets\Scenes\Main.unity 场景。您应该看到如下所示内容:
是一个繁星满天的夜晚背景,相机已经设置了。前景包含在原始形状的建筑物,由几个精灵组成
游戏的目标是你驾驶你的飞船飞过建筑物和轰炸建筑物。建筑物命中几个后,一座建筑将开始抽烟。当你继续撞向大楼,将会有更多的烟从大楼排放,直到整个大厦坍塌。
若要赢了,你的船必须避开所有导弹并摧毁每一幢楼宇。当大量吸烟瓦砾只不过是这座城市,可以降落在市政厅的废墟和宣布你已经中和平。听起来很容易吗?
已经为你写了所有的粒子系统和最必要的脚本。你的工作是为了用Unity5 最新和最好的功能完成游戏。
首先说使用Force!
运行游戏,你会看到。首先,选择Hierarchy 中的Spaceship ,向它添加New Script组件。使它命名为ShipController的C#脚本.,还记得如何添加新的脚本吗?
打开这个脚本,添加下面两个变量:
private Rigidbody2D shipRigidbody;
private float force = 150.0f;
shipRigidBody 代表
Rigidbody 2D中的force
变量拥有多少力值,您将使用它来移动该船。
但是在Unity 5 发生大的变化。
简而言之,Unity开发人员认为这些访问器不太一致。更重要的是,这些访问器创建依赖关系遍及各个子系统,因此,为了保持发展灵活、 除了transform组件, Unity废弃的所有访问者。这意味着你现在要创建所有组件的变量,除了transform。
不幸的是,Unity依然使用旧名称,所以如果你的变量的名字命名和访问器相同了,你会得到一个警告你的本地变量隐藏继承的.
当然了Unity5提供了脚本升级的功能,从之前的旧脚本升级为现在的新脚本:automatic script updating.
继续,在Start()
:方法中添加:
shipRigidbody = GetComponent();
在
Update()
:中添加如下:
if (Input.GetKeyDown(KeyCode.RightArrow)) {
shipRigidbody.AddForce(new Vector2(force, 0));
}
if (Input.GetKeyDown(KeyCode.LeftArrow)) {
shipRigidbody.AddForce(new Vector2(-force, 0));
}
if (Input.GetKeyDown(KeyCode.UpArrow)) {
shipRigidbody.AddForce(new Vector2(0, force));
}
if (Input.GetKeyDown(KeyCode.DownArrow)) {
shipRigidbody.AddForce(new Vector2(0, -force));
}
到现在为止你就可以控制飞船了:如下图
添加墙:
无形的墙会影响到游戏效果和玩家的船。这导致了一些关于无形墙应该如何表现的问题:
这些墙的作用是会使Player反弹回来。您将创建三面墙。一是顶部和另外左右。你也可以放一个在屏幕的底部,但建筑物将最终阻止Player。当玩家已摧毁所有建筑物,确实会发生的问题。在这种情况下,他们将会穿越地面。要解决此问题,您可以添加盒碰撞器,可能使Player发生爆炸的。怎么弄都可以的!
选择您创建的第一个空的游戏对象。单击其Hierarchy 中的名称,重命名为Top Barrier。在Inspector中设置其位置为以下: X: 2.3 Y: 8.21 Z:0.对于其Scale,指定下列值:X:48.27 Y: 2.33 Z: 2.33.
这些都是由统一使用的基本单位。在 3D 空间中,在Unity的一个单位对应一米,在现实生活中。采用Unity 2D、 你可以对应到实际像素单位。若要了解更多关于这,
注:在 2D 游戏中,Unity忽略 Z scale 和所有碰撞器碰撞有无限的 z 深度,所以无所谓什么 Z 值。
接下来,在Tag 标签下拉列表中,选择添加标签.Add Tag.
ags and Layers对话框应出现与扩大的标签部分。单击加上签名,然后将名称添加:Barrier。当你工作的碰撞时,在教程的后面这将是重要。
一旦你添加了新的标签,在Hierarchy 中选择Top Barrier,从标签下拉列表,选择的Barrier。看起来应该类似于以下内容:
在Hierarchy选择第二个空的GameObject 重命名为:Left Barrier.
在 Inspector设置位置为:X: -14.68 Y: 1.23 Z: 0.和设置Scale为:X: 2.33 Y: 30.17 Z: 2.33. 从Tag 下拉选择 Barrier.
同样选择第三个空的GameObject重名名为:Right Barrier. 在面板Inspector设置位置为:X: 15.6 Y: 1.23 Z: 0和设置Scale 为:X: 2.33 Y: 30.17 Z: 2.33. 设置Tag为Barrier.
祝贺你弄完了, 现在应该是看看反弹的效果了effector.
要做到这一点,在Hierarchy中选择Top Barrier和首先将Box Collider 2D 组件添加到它身上。在Inspector,请检查这碰撞体是触发器和效应器使用的选项。接下来,向它添加Area Effector 2D 。你Top Barrier 应如下所示:
注意: 您会发现地区效应有一大堆的选项,并且我敢打赌,你想要简要地了解它们。
Collider Mask确定那些层将会受到影响,当对象进入该地区。现在,将保持选中所有对象。
Force Direction确定力的角度方向。值的范围从-359.99 到 359.99,它真的只是定义一个圆顺时针或逆时针的方向移动。下面的图像显示,作为零指向移动逆时针沿圆 ;负值表示顺时针移动。
Force Magnitude允许您设置该地区的力量强度,虽然力变化允许您定义一个范围,以提供一些随机分配到force 的每一次碰撞。
、角阻力的选项允许您进一步自定义该地区的影响。事实上,你可以使用仅拖动值和没有力值创建减缓输入的任何对象的面积。
Force Target确定在哪个对象上的点力获取应用。当设置为刚体,forces 适用对象的重心,而将它设置为碰撞体适用在碰撞点处的force。
现在回到创造这个游戏。
选择Top Barrier,设置它的 Force Direction为 270。这意味着该force 将向下推。接下来,将力的大小Force Magnitude 设置为45。这将压低这艘船,但不是很难的玩家会失去控制。
运行场景和飞起来了。你会发现当你撞到天花板你被反弹回来后。
现在做相同Left Barrier 和Right Barrier。
实现你的防御
让我们面对现实吧,如果你有了外星人的宇宙飞船,威胁你的城市,你想要它离开。对付外星人的威胁是用一连串的导弹射击打它。
我已经创建了导弹与相关联的粒子系统。你的工作是为了让它飞。有很多方式做到这一点,但Unity5 有更简单的方法去做。
从Prefab 的文件夹中,将导弹missile 拖到场景。把它放在建筑物附近所以你可以看到它的起飞。
若要使这种导弹飞,您将添加一些不小的力量。Unity使这成为可能与推出的Constant Force 2D组件,超出你的预料: 它不断地适用特定数量的force。
在Hierarchy中选定missile ,添加一个Constant Force 2D组件。
你有三个选项:
让导弹仍处于选中状态,设置上图组件,将Force的 Y值设置为20。单击Apply 将此更改保存回预置体。
现在运行场景,导弹发射,但是当它撞到顶部,反弹下来,仍保持着跳跃。显然刚刚设置的物理定律应该与导弹无关。
因为顶部壁垒只该影响这艘船,所以要正确的设置一下:
在Hierarchy中选择Spaceship,并单击Add New Layer.
你会得到提示,是否应用到飞船的child。单击是的改变child。这意味着层值将应用于任何此对象的子对象。
接下来选择Hierarchy面板上的 Top Barrier 在组件Area Effector 2D 上, 单击 Collider Mask. 取消一切,只选择Spaceship。(最快的方式做到这一点是首先选择Nothing,然后选择Spaceship.)
现在,效应器将只是在船上工作的。
一个单一的导弹对飞船是足够的警告,但是如果你想要打下来外来入侵者,你会需要更大的火箭显示。为你已经准备了一个GameManager对象。
在Hierarchy中选择GameManager ,你会看到几个字段。
Game Manager中的Missile 字段引用着missile prefab ,当运行时创建火箭. 从Prefab 文件夹, 拖拽missile 到这个字段。
Max Missiles字段确定多少导弹一次显示在屏幕上。默认值是 10,但感觉自由地增加它,如果你感觉有点虐待狂 ;当你在处理未知的情报时,10 是有点保守。
最后,Max Time Between Missiles是你想要每一次导弹发射之间传递时间总量。默认值为 5 秒,但再一次,如果你正渴望对外星人的惩罚吧就降低的价值。
导弹的地方,选择Hierarchy 中的导弹并从您的场景删除它。
运行场景。马上,事情变得有趣。当然,你有导弹到处飞,但外星人在某种程度上毫发无伤。
还有没有碰撞检测,所以入侵者都是从你微不足道的进攻性措施有效免疫。
此外,如果继续看,你会发现有一些导弹是从左翼到右翼的曲线运动。这是故意的还是代码中的错误?
不要太紧张,导弹明显是受到力的作用了,这是因为我们还没有设置Left Barrier和 RightBarrier 的Collider Mask中的area effectors 。 在前面我们只是设置了 Top Barrier。 它是一个意外惊喜。它提供随机的难易的程度,因此玩家必须考虑飞亦可垂直飞行的导弹和随机从左到右。
为飞船配置炸弹:
对于此任务,需要一颗子弹发射器配在外星人的飞船。在你Prefab 的文件夹中查找并拖动bullet 到您的场景的子弹。你想要你的子弹飞下来。
为子弹bullet添加组件Constant Force 2D,并将其Force’s 的 Y值设置为-20。点击Inspector 上面的Apply。然后,从你的场景中删除子弹。
现在填写飞船发射子弹的代码:
打开ShipController.cs脚本, 添加实例变量船发射子弹的代码:
public GameObject launcher;
public GameObject bullet;
private bool isAlive = true;
launcher存储子弹的起始点。通过使用一个游戏对象,你可以直观地确定要射的子弹的位置。bullet包含对子弹的预置体的引用。最后, isAlive是一个简单的标志,指示Player是否活着还是死了。
接下来,在Update(),添加以下内容:
if (Input.GetKeyDown(KeyCode.Space)) {
if (isAlive) {
Instantiate(bullet,launcher.transform.position, Quaternion.identity);
}
}
这段代码,宇宙飞船开始发射一枚炸弹,每次玩家按下空格键时,前提飞船没有被摧毁。
打开ShipController.cs和向类中添加以下实例变量:
private SpriteRenderer spriteRenderer;
private ParticleSystem explosion;
既然你需要船爆炸,你需要访问的 SpriteRenderer 和 ParticleSystem 的组件。
explosion = GetComponent();
spriteRenderer = GetComponent();
这使您能够访问您的代码中的组件。接下来,添加下面的方法:
void OnTriggerEnter2D(Collider2D collider) {
if (isAlive && collider.gameObject.tag != "Barrier") {
shipRigidbody.velocity = Vector3.zero;
spriteRenderer.enabled = false;
explosion.Play();
isAlive = false;
}
}
由于所有的碰撞体都是触发器,则使用OnTriggerEnter2D。首先,你检查Player是否还活着,该触发器不是一个障碍
barrier。如果玩家不是活着的,设置Player的速度为零。这样
在太空中由此产生的爆炸会保持固定。
出现尴尬的一幕,飞船被自己的子弹击中,解决问题吧1
要解决此问题,请选择Prefab 文件夹中的子弹。
像你早些时候一样的,在Inspector 中,创建一个Add Layer。名称的为Bullet,然后将这个新的图层分配给bullet prefab。
最后,选择Edit\Project Settings\ Physics 2D,,然后你会看到一大堆的物理选项。你在图表底部有兴趣,该值指示layers 层是否可以彼此交互。
取消选择Spaceship 和Bullet ,以指示这些layers 上的物理对象不应该发生碰撞的交集处的复选框。这些在Unity5之前就有了,但当然值得一提。
销毁的声音:
首先,添加一个小的背景音乐。在Hierarchy 中选择GameManager ,并向其添加Audio Source组件。从Sounds 文件夹中,将backgroundMusic拖动到声音源的AudioClip字段。请检查Loop 复选框。运行
当您运行场景时,你应该听到的音乐。
现在,对于一些声音效果。Audio Sources已添加到必需的对象和他们的 AudioClips 已经到位。
首先,添加当建筑倒塌的声音。在Scripts 文件夹中,找到Building.cs ,在 MonoDevelop 中打开它。
将下面的实例变量添加到Building类:
private AudioSource collapseSound;
您将使用collapseSound来存储对该建筑的AudioSource组件的引用。已经列入的起始项目的建筑有其AudioSource添加。
collapseSound = GetComponent();
这获取到AudioSource的引用,所以您可以在代码中调用它。
if (isDestroyed && onScreen()) {
transform.position = new Vector3( transform.position.x,
transform.position.y - Time.deltaTime * speed,
transform.position.z);
if (!collapseSound.isPlaying) {
collapseSound.Play();
}
} else if (isDestroyed && !onScreen()) {
collapseSound.Stop();
}
如果该建筑是在屏幕上,指定为销毁,这段代码检查以看collapseSound 是否播放。如果不是,就可以开始播放,然后移动大厦离屏。
public SoundManager soundManager;
在Update(),添加下面的行,上方的行调用Instantiate:
soundManager.DropBomb();
现在将以下行添加到之前设置shipRigidbody.velocity OnTriggerEnter2D(),:
soundManager.ExplodeShip();
当这艘船爆炸的时候,那应该添加声音很好听。
从Scripts 文件夹中,在 MonoDevelop 中打开Bullet.cs 。当你做过,添加一个实例变量来存储组件的引用:
private SoundManager soundManager;
在
Start()
:函数中添加代码:
GameObject gameObject = GameObject.Find("SoundManager");
soundManager = gameObject.GetComponent();
通过将以下行添加到OnTriggerEnter2D(),只是在调用explosion.Play():
soundManager.HitBuilding();
例如,每个组具有应用于它允许您更改组的大小,甚至在游戏进行过程中的衰减效果。
搅拌机mixer 伟大的事情之一就是在编辑器中,玩游戏时所做的当你停止播放将更改保存。这允许您调整音频,直到它是完美的,以便您可以恢复它们,当你停下来。
你要添加几个组。单击Groups的 加号创建一个新组,并将其命名Music。请再次单击加号按钮,然后创建一组命名的Sound Effects。最有可能的是,您的组看起来像那些如下所示:
新创建的组是作为当前所选择的组的子节点children ,当您创建第二个新的组,所以它成为了Music的一个孩子。这不是真正想要的效果,若要修复,只需拖动Sound Effects 组出Music ,并重新设置其父级为Master 。现在选择Sound Effects组并添加新的子组,命名为崩溃的大厦Collapsing Buildings。现在,您应该看到三个搅拌器mixers:
现在您需要将搅拌机mixer 组分配给每个在你的场景中 AudioSources组件上。首先,在Hierarchy中选择GameManager ,然后看看它在Inspector中的Audio Source 组件。单击打开右侧圆的输出字段以打开选择 AudioMixerGroup对话框,然后选择对话框里面的Music 。
您需要直接音频输出到每个大厦到Collapsing Buildings组。
在Hierarchy 中选择BuildingA ,然后按住 shift 键单击BuildingH 一次选择所有建筑物 (BuildingB, BuildingC, BuildingD, BuildingE, BuildingF, BuildingG, 和BuildingH))。这一招可以同时编辑所有选定对象的公共字段。
在Inspector中设置的Audio Source组件的输出字段为Collapsing Buildings..
最后,将SoundManager音频源的输出设置为Sound Effects组。
现在,运行你的场景。你的混频器mixer 将会苏醒过来。
若要更改级别Level,请单击Audio Mixer面板顶部的Edit in Play Mode按钮。请牢记你的场景同时要Play。一旦你按下该按钮,您可以更改Level。如果你将一组的音量调低,这将降低所有的小组音量。
在音量控制下面有三个按钮。 S 按钮意味着独奏曲Solo。它沉默所有其他轨道。
M按钮静音的代名词,并允许您只是沉默那条轨道。按B键代表,它允许您忽略任何您已经添加到轨道的音频效果。
要向组中添加效果,只需单击Add… 按钮以提供一系列的影响。要试试它,单击Collapsing Buildings下方的按钮 Add…并添加 Echo 效应。
现在轰炸建筑成灰烬,听到建筑的效果。
在这一点上,随时玩你的游戏,并继续完善。在 GameManager,暂时最大导弹将值设置为0所以你可以专注于对死亡的恐惧音频。
你只滑动表面的Unity的新的音频混合器。此外可以做事情,比如隐藏组并将其保存为视图可帮助您专注于不同的编辑任务,并拍下快照来保存不同的设置组 — — 进行比较或只是为了不同的情况。
最后的项目在这里下载。