zoukankan      html  css  js  c++  java
  • (十一)Unity5新特性----实战2D游戏

    孙广东  2015.7.11

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

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

    你能够先下载空的资源项目:起始项目将其解压缩,然后在 Unity 中打开StarterProjectAssetsScenesMain.unity 场景。

    您应该看到例如以下所看到的内容:


    是一个繁星满天的夜晚背景,相机已经设置了。前景包括在原始形状的建筑物。由几个精灵组成

    游戏的目标是你驾驶你的飞船飞过建筑物和轰炸建筑物。

    建筑物命中几个,一座建筑将開始抽烟。当你继续撞向大楼。将会有很多其它的烟从大楼排放。直到整个大厦坍塌。

    若要赢了,你的船必须避开全部导弹并摧毁每一幢楼宇。当大量吸烟瓦砾仅仅只是是这座城市。能够降落在市政厅的废墟和宣布你已经中和平。

    听起来非常easy吗?

    已经为你写了全部的粒子系统和最必要的脚本。你的工作是为了用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。有三个空的游戏对象。


    Screen Shot 2015-03-12 at 12.42.06 PM

    这些墙的作用是会使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.

          new_barrier_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会让你知道。

    Screen Shot 2015-03-12 at 2.12.34 PM

    要做到这一点,在Hierarchy中选择Top Barrier和首先将Box Collider 2D 组件加入到它身上。

    Inspector,请检查这碰撞体是触发器和效应器使用的选项。

    接下来,向它加入Area Effector 2D 。你Top Barrier 应例如以下所看到的:

    Screen Shot 2015-03-12 at 6.39.24 PM

    注意: 您会发现地区效应有一大堆的选项,而且我敢打赌。你想要简要地了解它们。
    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扭矩: 用于创建角运动的力
    Screen Shot 2015-03-12 at 3.08.32 PM

    让导弹仍处于选中状态,设置上图组件,将Force的 Y值设置为20。单击Apply 将此更改保存回预置体。

    如今执行场景,导弹发射,可是当它撞到顶部,反弹下来,仍保持着跳跃。显然刚刚设置的物理定律应该与导弹无关。
    由于顶部壁垒仅仅该影响这艘船。所以要正确的设置一下:

    Hierarchy中选择Spaceship,并单击Add New Layer.


    Screen Shot 2015-03-12 at 3.30.42 PM     Screen Shot 2015-03-12 at 3.32.33 PM

    你会得到提示,是否应用到飞船的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。然后,从你的场景中删除子弹。

    Screen Shot 2015-03-12 at 4.19.33 PM

    如今填写飞船发射子弹的代码:

    打开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 字段 

    Screen Shot 2015-03-12 at 5.17.42 PM


    为飞船爆炸做准备!

    打开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
    最后,选择EditProject Settings Physics 2D,。然后你会看到一大堆的物理选项。

    你在图表底部有兴趣。该值指示layers 层能否够彼此交互。

    取消选择Spaceship Bullet 。以指示这些layers 上的物理对象不应该发生碰撞的交集处的复选框。这些在Unity5之前就有了,但当然值得一提。


    Screen Shot 2015-03-12 at 6.07.03 PM


    销毁的声音:
    首先,加入一个小的背景音乐。在Hierarchy 中选择GameManager 。并向其加入Audio Source组件。从Sounds 目录中,将backgroundMusic拖动到声音源的AudioClip字段。请检查Loop 复选框。

    执行

    Screen Shot 2015-03-12 at 8.39.03 PM

    当您执行场景时,你应该听到的音乐。
    如今。对于一些声音效果。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字段。

    Screen Shot 2015-03-12 at 9.46.26 PM

    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 的目录,然后右键单击它并选择CreateAudio Mixer.。命名新对象Game Mixer.
    若要查看该混合器mixer,请双击它。或者选择WindowAudio Mixer 。使下方的面板上:
    audio_mixer
    默认情况下,全部搅拌机mixers 都在一组称为主组,您一次能够应用effects 到全部的音频源。

    比如,每一个组具有应用于它同意您更改组的大小,甚至在游戏进行过程中的衰减效果。


    搅拌机mixer 伟大的事情之中的一个就是在编辑器中,玩游戏时所做的
    当你停止播放更改保存。

    这同意您调整音频,直到它是完美的,以便您能够恢复它们,当你停下来。

    你要加入几个组。

    单击Groups 加号创建一个新组,并将其命名Music。请再次单击加号button,然后创建一组命名的Sound Effects

    最有可能的是。您的组看起来像那些例如以下所看到的:

    nested_audio_groups

    新创建的组是作为当前所选择的组的子节点children ,当您创建第二个新的组,所以它成为了Music的一个孩子。这不是真正想要的效果。若要修复,仅仅需拖动Sound Effects 组出Music 。并又一次设置其父级为Master 。如今选择Sound Effects组并加入新的子组,命名为崩溃的大厦Collapsing Buildings

    如今,您应该看到三个搅拌器mixers


    如今您须要将搅拌机mixer 组分配给每一个在你的场景中 AudioSources组件上。首先,在Hierarchy中选择GameManager 。然后看看它在Inspector中的Audio Source 组件。

    单击打开右側的输出字段以打开选择 AudioMixerGroup对话框,然后选择对话框里面的Music 

    Screen Shot 2015-03-12 at 11.35.01 PM

    您须要直接音频输出到每一个大厦到Collapsing Buildings组


    Hierarchy 中选择BuildingA 。然后按住 shift 键单击BuildingH  一次选择全部建筑物 (BuildingBBuildingCBuildingDBuildingEBuildingFBuildingG, 和BuildingH))。这一招能够同一时候编辑全部选定对象的公共字段。
    Inspector中设置的Audio Source组件的输出字段为Collapsing Buildings..
    最后,将SoundManager音频源的输出设置为Sound Effects组。


    如今。执行你的场景。你的混频器mixer 将会苏醒过来。


    若要更改级别Level,请单击Audio Mixer面板顶部的Edit in Play Modebutton。请牢记你的场景同一时候要Play

    一旦你按下该button,您能够更改Level。

    假设你将一组的音量调低,这将减少全部的小组音量。


    在音量控制下面有三个button。 S button意味着独奏曲Solo。它沉默全部其它轨道。
    Mbutton静音的代名词,并同意您
    仅仅是沉默那条轨道。按B键代表。它同意您忽略不论什么您已经加入到轨道的音频效果。

    要向组中加入效果,仅仅需单击Add… button以提供一系列的影响。

    要试试它。单击Collapsing Buildings下方的button Add…并加入 Echo 效应。

    Screen Shot 2015-03-13 at 1.28.16 PM

    如今轰炸建筑成灰烬。听到建筑效果

    在这一点上,随时玩你的游戏。并继续完好。在 GameManager,临时最大导弹将值设置为0所以你能够专注于对死亡的恐惧音频。
    你仅仅滑动表面的Unity的新的音频混合器。

    此外能够做事情。比方隐藏组并将其保存为视图可帮助您专注于不同的编辑任务。并拍下快照来保存不同的设置组 — — 进行比較或仅仅是为了不同的情况。


    最后的项目在这里下载。

  • 相关阅读:
    第九次作业
    第八次作业
    第七次作业
    组合数学—递推关系与母函数
    组合数学—排列组合
    三角函数
    OpenCV初步
    计算机视觉如何入门
    GDB调试技巧:总结篇
    PyQt5之窗口类型
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6939679.html
Copyright © 2011-2022 走看看