码迷,mamicode.com
首页 > 编程语言 > 详细

Unity5新特性----实战2D游戏

时间:2015-07-12 11:22:33      阅读:509      评论:0      收藏:0      [点我收藏+]

标签:3d   unity3d   unity   c#   ugui   

孙广东  2015.7.11

在本教程中,将了解到U5新功能,你通过本教程,您将了解以下内容:

  • Changes in Component Access
  • Physics Effectors
  • Adding Constant Force
  • Audio Mixer

你可以先下载空的资源项目:起始项目将其解压缩,然后在 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 变量拥有多少力值,您将使用它来移动该船。
您可能想知道为什么你需要一个变量来保存Rigidbody 2D组件。毕竟,在以前版本,您需要访问该组件是使用Unity的变量来访问它rigidbody2D即可。如果有一个刚体,附加到该对象,将对其变量进行填充。如果对象没有被附加,它将为 null。

但是在Unity 5 发生大的变化。  
简而言之,Unity开发人员认为这些访问器不太一致。更重要的是,这些访问器创建依赖关系遍及各个子系统,因此,为了保持发展灵活、 除了transform组件, Unity
废弃的所有访问者。这意味着现在要创建所有组件的变量,除了transform

不幸的是,Unity依然使用旧名称,所以如果你的变量的名字命名和访问器相同了,你会得到一个警告你的本地变量隐藏继承的.

当然了Unity5提供了脚本升级的功能,从之前的旧脚本升级为现在的新脚本:automatic script updating.

继续,在Start():方法中添加:

shipRigidbody = GetComponent<Rigidbody2D>();
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吗?
  • 或者应该向左飞行超出后从右边出现吗?
为了本教程中,您将实现中间的选项,因为它有反作用的越来越严重的挑战。
Unity 5 点之前,在墙上需要大量的代码,从而使反弹流畅和自然。但是到了Unity5,你只需要做是添加新的组件称为effector.
用鼠标右键单击Hierarchy 中,从下拉中选择Create Empty。有三个空的游戏对象。

技术分享

这些墙的作用是会使Player反弹回来。您将创建三面墙。一是顶部和另外左右。你也可以放一个在屏幕的底部,但建筑物将最终阻止Player。当玩家已摧毁所有建筑物,确实会发生的问题。在这种情况下,他们将会穿越地面。要解决此问题,您可以添加盒碰撞器,可能使Player发生爆炸的。怎么弄都可以的!

选择您创建的第一个空的游戏对象。单击其Hierarchy 中的名称,重命名为Top Barrier。在Inspector中设置其位置为以下: X2.3 Y8.21 Z:0.对于其Scale,指定下列值:X:48.27 Y2.33 Z2.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 Y1.23 Z0.和设置Scale为X2.33 Y30.17 Z2.33. 从Tag 下拉选择 Barrier.

同样选择第三个空的GameObject重名名为:Right Barrier. 在面板Inspector设置位置为:X15.6 Y1.23 Z0和设置Scale 为:X2.33 Y30.17 Z2.33. 设置TagBarrier.

祝贺你弄完了, 现在应该是看看反弹的效果了effector.


effector效果的事情
在Unity5 effector是总是应用在精灵上。你有四个种类的effector可供您使用。
  • Surface Effector:表面效应: 沿碰撞器的表面施力,允许您创建像表面的东西移动。
  • Point Effector:点效应: 定义点,可以吸引或排斥的使用force
  • Area Effector地区效应: 适用于特定区域内的定向force
  • Platform Effector平台效应: 可帮助您创建平台式游戏平台,完成与单向碰撞和设置的选项,来控制摩擦和弹力的平台边缘。
    Unity提供了很好地突出了一切你可以用效应器的图像:
技术分享
为你的障碍,您将使用区域效应,所以,当这艘船飞进效应器这基本上会把这艘船反弹回去。
为了使效应器工作,相应的游戏物体需要附加到它的碰撞体。碰撞体必须是一个触发器,并且碰撞体必须标记为要使用的效应。如果这些条件得不到满足效应器是不工作的,并且Unity会让你知道。

技术分享

要做到这一点,在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力: 取某个值并将其应用相对于世界坐标
  • Relative Force:相对力量: 定义相对于该对象的本地坐标系统的力
  • Torque扭矩: 用于创建角运动的力
技术分享

让导弹仍处于选中状态,设置上图组件,将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);
    }
}
这段代码,宇宙飞船开始发射一枚炸弹,每次玩家按下空格键时,前提飞船没有被摧毁。
Hierarchy中选择宇宙飞船,并在Inspector中的Ship Controller (脚本)组件,您将看到的Launcher Bullet 的字段。
飞船有一个子游戏物体命名Launcher。将此子对象拖动到飞船的Launcher 字段。此外,子弹从Prefab 文件夹拖动bullet到飞船的Bullet 字段 

技术分享


为飞船爆炸做准备!

打开ShipController.cs和向类中添加以下实例变量:

private SpriteRenderer spriteRenderer;
private ParticleSystem explosion;
既然你需要船爆炸,你需要访问的 SpriteRenderer 和 ParticleSystem 的组件。
在Start(),请添加以下内容:

explosion = GetComponent<ParticleSystem>();
spriteRenderer = GetComponent<SpriteRenderer>();
这使您能够访问您的代码中的组件。接下来,添加下面的方法:
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的速度为零。这样在太空中由此产生的爆炸会保持固定。
接下来,您禁用 SpriteRenderer组件,有效地隐藏在视图中的飞船。然后你开始爆炸粒子系统,以标示这艘船已经牺牲。最后,您标记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添加。
接下来添加以下Start():
collapseSound = GetComponent<AudioSource>();
这获取到AudioSource的引用,所以您可以在代码中调用它。
接下来,用以下内容替换Update()的内容:
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 是否播放。如果不是,就可以开始播放,然后移动大厦离屏。
保存该脚本并回到Unity。运行场景,当你摧毁一个建筑,你应该听到崩溃的声音。
接下来,打开ShipController.cs在 MonoDevelop中,并向类中添加以下实例变量:
public SoundManager soundManager;
在Update(),添加下面的行,上方的行调用Instantiate:
soundManager.DropBomb();
现在将以下行添加到之前设置shipRigidbody.velocity OnTriggerEnter2D(),:
soundManager.ExplodeShip();
当这艘船爆炸的时候,那应该添加声音很好听。
Hierarchy中选择的Spaceship 。现在,您会看到一个Sound Manager字段。将Hierarchy SoundManager的游戏对象拖到Sound Manager字段。

技术分享

Scripts 文件夹中,在 MonoDevelop 中打开Bullet.cs 。当你做过,添加一个实例变量来存储组件的引用:

private SoundManager soundManager;
Start():函数中添加代码:

GameObject gameObject = GameObject.Find("SoundManager");
soundManager = gameObject.GetComponent<SoundManager>();
通过将以下行添加到OnTriggerEnter2D(),只是在调用explosion.Play():
soundManager.HitBuilding();

Unity5 的音频混音器
在以前版本的Unity,你将不得不调整level 的每个AudioSource,而在Unity 5,您可以调整它们从一个中央位置调整Audio Mixer
你可以在你的项目中,有几个mixers 
选择您Sounds 的文件夹,然后右键单击它并选择Create\Audio Mixer.。命名新对象Game Mixer.
若要查看该混合器mixer,请双击它,或者选择Window\Audio Mixer ,使下方的面板上:
技术分享
默认情况下,所有搅拌机mixers 都在一组称为主组,您一次可以应用effects 到所有的音频源。

例如,每个组具有应用于它允许您更改组的大小,甚至在游戏进行过程中的衰减效果。
搅拌机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  一次选择所有建筑物 (BuildingBBuildingCBuildingDBuildingEBuildingFBuildingG, 和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的新的音频混合器。此外可以做事情,比如隐藏组并将其保存为视图可帮助您专注于不同的编辑任务,并拍下快照来保存不同的设置组 — — 进行比较或只是为了不同的情况。
最后的项目在这里下载。

Unity5新特性----实战2D游戏

标签:3d   unity3d   unity   c#   ugui   

原文地址:http://blog.csdn.net/u010019717/article/details/46333209

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!