【Unity】2D太空登录小游戏开发入门教程(下)

Unity 是一款非常流行且用途广泛的游戏引擎,拥有一长串受支持的平台和设备。3D 游戏可能是您谈到 Unity 时的第一个想法。该引擎甚至曾经被称为Unity 3D!但是,大部分移动、主机和桌面游戏都是以 2D 形式呈现的,因此了解 Unity 为构建 2D 游戏提供的功能非常重要。

在本教程中,您将构建一个 2D 太空着陆器游戏,并在此过程中学习以下技能:

  • 如何使用精灵和相机。
  • 所有关于_物理2D_组件以及如何处理碰撞和游戏玩法。
  • 如何设置 2D 动画和状态。
  • 图层和精灵排序如何影响 2D 游戏。

本教程的材料是在 Unity 版本 2020.3 中构建的。

[沿续上文]【Unity】2D太空登录小游戏开发入门教程(上)

二维对撞机和物理

Unity 允许您像在 2D 游戏中一样调整物理 3D 系统的重力。Unity 对新项目的默认重力设置与地球重力相同:根据定义,9.80665 m/s2。但是你把你的宇宙飞船降落在月球上,而不是地球上,月球上的重力大约是地球的16.6%,即1.62519米/秒2。

注意:初学者项目中的重力设置为 -1,以便于飞行并立即测试游戏。

要修改游戏的重力,请点击_“编辑”图标 ▸ 项目设置_ 然后选择物理 2D 选项卡并使用_物理 2D_ 面板将_重力的_ Y 值从 -1 更改为 -1.62519

在物理设置中调整重力

事情要变得沉重了!

单击_“开始_”以运行游戏;飞一圈,看看重力如何改变飞船的运动:

重力上升一小步,推进器动力需要一个巨大的飞跃!

扫描二维码关注公众号,回复: 16915420 查看本文章

重力需要一小步,推进器动力需要一个巨大的飞跃!

与对象碰撞

如果你已经尝试过在场景中导航_着陆器_,你可能已经撞到了一两块石头。这是Unity的2D碰撞系统在工作。

每个应与重力和其他物理对象交互的对象都需要一个 Collider 2D 组件和一个 Rigidbody 2D 组件。

在层次结构中选择_着陆器_游戏对象。

刚体和碰撞体设置

您将看到附加了刚体 2D 和多边形碰撞体 2D 组件。将刚体 2D 组件添加到精灵中,使其受 Unity 的 2D 物理系统的控制。

物理组件快速课程

就其本身而言,刚体 2D 组件意味着重力会影响它所附加到的游戏对象。它还允许您使用对实体施加力的 Physics2D 相关方法从脚本中控制实体。

但是,如果您希望精灵与其他对象交互和碰撞,则还需要一个_碰撞体 2D_ 组件。添加适当的碰撞体组件会使精灵响应与其他精灵的碰撞。

多边形 2D 碰撞体比其他简单碰撞体(如箱形或圆形碰撞体 2D 组件)性能更重,但它们使对象之间的物理交互更加精确。始终使用游戏中可以侥幸逃脱的最简单的碰撞体形状,以确保获得最佳性能。

碰撞面

通过选择层次结构中的_着陆器_游戏对象并单击多边形 2D 碰撞体上的编辑碰撞体来探索宇宙飞船上的_碰撞_体:

“编辑碰撞体”按钮

将鼠标光标悬停在场景视图中的碰撞体边缘上。手柄允许您移动碰撞体点,您还可以创建或删除点以修改碰撞体的形状:

编辑 2D 多边形碰撞体

暂时保持_着陆器_对撞机的形状不变。

: 附加到 Lander 游戏对象的 Lander.cs 脚本中的代码用于处理与游戏场景中其他对象的碰撞。如果碰撞力的大小超过某个阈值,着陆器将被摧毁。OnCollisionEnter2D

您的着陆垫还需要一个对撞机;否则当你试图着陆时,你的飞船会直接掉下来!

在层次结构中,双击 LanderObjective 游戏对象以将焦点放在着陆台上。使用检查器,单击添加_组件_并选择_箱形碰撞体 2D_ 组件:

着陆器箱式对撞机-2D

Unity 将_箱形碰撞体 2D_ 组件添加到 LanderObjective 游戏对象中,并自动调整碰撞体的大小以匹配精灵大小。

着陆器箱式对撞机着陆平台

凉!

其他一些事情

关于刚体和 2D 碰撞体组件,还有其他一些事项需要记住:

  • 当您想要通过变换组件移动物理实体而不是仅让重力影响它们时,将刚体更改为使用_运动体_类型。要让它们处于 Unity 重力的控制之下,请使用_动态_。如果它们根本不会移动,请将它们设置为_静态_。
  • 您还可以修改_刚_体构件的质量、_线性_拖动、_角度拖动_和其他物理属性。
  • 碰撞体可以在_触发_模式下使用;它们不会与其他物理对象发生物理碰撞。相反,它们允许代码使用所有 MonoBehavior 脚本上提供的方法对事件做出反应。OnTriggerEnter2D
  • 要处理脚本代码中的冲突事件,请使用 ,这在所有 MonoBehavior 脚本上都可用。OnCollisionEnter2D
  • 您可以将可选的 Physics2D 材质 2D 参考分配给碰撞体,以控制弹力或摩擦力等属性。

注意:当游戏中只有几个对象时,您可能不会注意到这一点,但是当您的屏幕上有数百个对象时,所有对象都涉及物理交互,使用更简单的碰撞体形状将提高游戏的性能。

如果有很多物体碰撞,您可能需要重新考虑使用多边形碰撞体 2D 组件的策略!

如果有很多物体碰撞,您可能需要重新考虑使用多边形碰撞体 2D 组件的策略!

着陆器动画

如果没有可见的推进器来对抗重力,你的着陆器将是不完整的。现在,推进器可以工作,但没有视觉反馈告诉你它们正在发射。

Unity动画 101

要将动画分配给场景中的游戏对象,请将动画器组件附加到要进行_动画_处理的游戏_对象_。此组件需要对动画控制器的引用,该控制器定义要使用的动画剪辑以及如何控制这些剪辑,以及其他“更高级”的效果,例如_动画_的混合和过渡。

推进器的动画控制器

在层次结构中,展开_着陆器_游戏对象以显示其他四个嵌套的游戏对象。选择_推进器主_游戏对象;您将看到它已经附加了一个动画器组件,但它没有引用_动画_控制器:

兰德-动画师-组件-无控制器-参考

在推进_器主游戏对象_仍处于选中状态的情况下,单击_动画_编辑器选项卡。如果您在编辑器的主窗口中没有看到此选项卡,请选择_窗口_ ▸ 动画 ▸ 动画 来打开它:

动画窗口

当您在层次结构中选择了游戏对象时(您确实如此!),动画窗口将显示与该游戏对象相关的动画 - 就像检查器显示与该游戏对象相关的组件一样。单击“_创建”ThrusterMain 创建_动画剪辑

创建动画剪辑

输入名称 ThrusterAnim 并将其放在_“资源/动画_”文件夹中。

现在,您应该在“项目”窗口的“动画”文件夹中看到两个新的动画资源。ThrusterAnim 是动画剪辑,它将保存推进器效果的动画,ThrusterMain 是将控制动画的动画器控制器:

创建的着陆器动画资产

您将在动画窗口中看到动画时间轴;在这里,您可以放置和订购各个推进器精灵框架。

单击_添加属性_,然后选择_精灵渲染器/精灵_作为要动画的属性类型:

动画添加属性 Unity2D

兰德-精灵-属性-动画

您的编辑器现在应如下所示:

兰德-精灵动画-时间线

处理时间线的时间

处理时间线

在“项目”窗口中,单击“精灵”文件夹并展开_推进器-精灵表.png_精灵。突出显示四个切片的推进器精灵,并将它们拖到_动画_编辑器中的_推进器主:精灵_时间轴上。

精灵帧最终在时间轴上聚集在一起;你可以自己解决这个问题。从最右边的精灵开始;单击精灵,将其拖到右侧,将其与相邻的精灵间隔大约 0:05:

Lander-assign-sprite-frames-to-animation

选择 1:00 标记处的最后一帧,然后按 Delete 将其删除。

删除最后一帧

单击动画窗口中_的预览_,然后单击_播放_。在场景视图中聚焦着陆器飞船,查看您的工作预览!

因此,图斯特斯预览

队长准备好了!

ThrusterMain 仍处于选中状态的情况下,您还可以在精灵_渲染器_组件中看到_精灵_的变化:

精灵动画

滴答作响:]

现在是时候配置动画控制器了。

配置动画控制器

_着陆器.cs_脚本当前将动画参数设置为 或,具体取决于玩家是否发射推进器。动画控制器将评估这些参数,并允许进入或退出某些状态。true``false

在“项目”窗口中,单击_“动画_”子文件夹。然后,双击_ThrusterMain.controller_。这将打开动画编辑器,您将在其中看到在推进器主游戏对象上创建动画剪辑时为您添加的控制器 Unity:

着陆器动画师启动

现在,推进器动画正在连续运行。从逻辑上讲,推进器动画应仅在玩家当前正在发射推进器时运行。

右键单击_动画编辑器_的网格区域,然后单击_创建状态/空_:

创建状态为空

使用检查器将新状态命名为 NoThrust。这是没有玩家输入时动画的默认状态:

着陆器无推力状态

Entry 开始,动画师应直接流向 NoThrust 并停留在那里,直到_布尔_参数变为 。若要发生动画状态更改,需要使用_过渡_添加连接。true

右键单击无_推力_,然后单击_设置为图层默认状态_。NoThrust 现在应显示为橙色,如下所示,Entry 中的箭头现在指向 No Thrust

动画控制器进行过渡

橙色表示该状态将是第一个状态运行。

使用_动画编辑器_,单击_参数选项卡中的_ + 以创建新的参数类型 Bool。将其命名_为应用推力_:

着陆器创建应用推力参数

右键单击“NoThrust”,单击“进行过渡”,然后单击“推进器动画”。这将创建一个转换,允许在两个状态之间更改状态。现在执行相同的步骤集,但这次创建从 ThrusterAnimNoThrust 的过渡:

着陆器推进器动画状态连接

点按“NoThrusterto ThrusterAnim”过渡线,然后在检查器中点按 + 以添加“条件”。这将选择唯一可用的条件:应用推力

确保在下拉列表中选择 true。这表示_“应用推力_”必须为 true,动画才能移动到“推进器动画”状态。

着陆器应用推力条件为真

现在编辑从 ThrusterAnimNoThrust 的过渡线,以使用相同的 ApplyingThrust 条件。但是,这次您正在检查_错误_条件:

应用推力错误

您可以在动画编辑器中调整动画播放速度以适应。单击“推进器动画”状态,然后在检查器中,将“速度”属性更改为 1.5

着陆器推进器动画速度

推进器动画应快速响应,以反映玩家的发触发反应,以显示响应。单击两条过渡线(NoThrustThrusterAnim 之间的转场线),然后使用检查器将与_过渡_相关的设置更改为 0。取消选中_也有退出时间和__固定持续时间_:

推进器的着陆器过渡设置

最后,将相同的动画和控制器应用于左右推进器。从层次结构中选择 ThrusterLeftThrusterRight,然后将 ThrusterMain.controller 从“项目”窗口中的“动画”文件夹拖放到_动画器_组件的_“控制器_”属性中:

拖动推进器控制器

单击_“开始_”以运行游戏;使用_WASD_或_箭头键_试用您的新推进器:

推进器播放

休斯顿,我们已经升空了!:]

精灵排序和图层

没有精灵排序能力,任何 2D 引擎都是不完整的。Unity 允许您使用图层和_图层排序_系统对精灵进行排序和排序。

单击编辑器中的_“播放_”以再次运行游戏;使用你最差的驾驶能力将着陆器撞到附近的岩石上。当“重新启动”按钮出现时,请查看编辑器中的“Scene ”视图。您可能会注意到一些岩石已经消失在背景图像后面:

着陆器错误排序

甚至可能是您打开了初学者项目,_只能_看到背景图像。如果是这样的话,干得好!

发生这种情况的原因是渲染引擎无法确定精灵的分层顺序。除飞船外,所有精灵当前都设置为使用渲染顺序为 -1 的默认排序层。您的显卡将获得所有绘制调用,但没有告诉它们绘制的顺序!

要解决此问题,您可以使用“图层”和_“图层顺序”_系统来分隔精灵。Unity 将按照定义的图层顺序在这些图层上渲染精灵。对于每个单独的图层,Unity 将使用每个精灵上的精灵在层中的顺序编号来确定它应该按哪个顺序渲染每个精灵。

您可以将其视为有序列表:

  1. A层

    1. 序列 0
    2. 序列 1
  2. B层

是时候添加一些图层了

点按Edit ▸ Project Settings,然后选择Tags and Layers。展开Sorting Layers部分。

单击 + 添加三个新图层:

  • Background
  • Rocks
  • Player

单击并拖动每个图层旁边的控点,以确保它们按上面列出的顺序排列。此处图层的顺序决定了 Unity 在这些图层上渲染精灵的顺序:

着陆层排序

就像洋葱一样,空间也是由层组成的!

单击层次结构中的_背景_;在 Sprite renderer_组件上,单击_排序图层_下拉列表,然后从列表中选择_背景

背景排序后 unity2d

现在岩石肯定会在背景后面,因为它们仍然在_默认_图层上!

展开岩石游戏对象并突出显示所有子_岩石_游戏对象。使用检查器将对象更改为使用_岩石_排序图层,如下所示:

岩石-排序层-Unity2D

由于场景中的岩石往往相互重叠,因此它们有助于演示“图层中的顺序”属性如何适用于特定_图层_上的精灵。

如果您没有为岩石图层中的每块_岩石_提供单独的排序值,您会注意到在游戏过程中随机“弹出”其他岩石。这是因为 Unity 不会始终如一地以相同的顺序渲染岩石,因为它们目前在图层中都具有相同的顺序。

查找重叠的岩石,并为前面的岩石分配比它们后面的岩石更高的图层顺序值:

重叠岩石按图层排序

单击层次结构中的 Lander,将其精灵渲染器及其所有子游戏对象精_灵渲染器_组件的排序层属性更改为_玩家__排序层_。

对层次结构中_拾取_下的燃料游戏对象执行相同的操作。这将确保它们在所有内容之前呈现。

微调层

但是,有一个问题。推进器动画的精灵(以及通常隐藏在着陆器后面的着陆器的脚)呢?如果您没有为这些和_着陆器_本身设置特定的_图层编号_顺序,您会看到一些奇怪的渲染问题!

层内着陆器顺序冲突问题

将_着陆器_本身的_图层顺序_属性更改为 2。选择每个_推进器_子游戏对象以及 LanderFeet 游戏对象,并将其图层_顺序_值设置为 1

当着陆器降落在着陆垫上时,着陆垫会向下沉一点,以表明您已经着陆。着陆台和岩石精灵相互重叠,因此为了使效果看起来正确,您必须在岩石后面订购着陆台。

LanderObjective 精灵更改为使用_岩石_图层,并为其分配图层_顺序_值 0。将岩石设置在_着陆点物镜_下方,以使用_图层阶值_ 1

兰德目标和摇滚下面

最后,单击预制件文件夹中的_分解__预制件_,并将其_排序层_更改为_播放器_:

设置爆炸预制件分拣层

酷的人不看爆炸。但我们做到了!

单击_播放_并通过拾取燃料供应并降落在着陆台上来测试您的驾驶技能。只是要注意不要在任何一个方向上施加太大的推力,以免避开岩石!

完成着陆

搞定了!:]

通过足够的练习,您将像Space X一样擅长着陆火箭!:]

                                    完结!!!

【Unity】2D太空登录小游戏开发入门教程(上)

搜索关注公众号unity小游戏工坊回复“002”获取本教程的材料

猜你喜欢

转载自blog.csdn.net/weixin_72715182/article/details/130509197