分享

Unity 2D 吃豆人教程(上)

 冲凉的蜘猪侠 2017-01-04

Unity 2D 吃豆人教程(上)

前言

来用制作一款类吃豆人的游戏吧。最初版的吃豆人游戏发布于1980年的十二月并很快成为有史以来最热门的街机游戏。这款游戏如此流行,以至于Unity甚至在它的游戏引擎里放置了该游戏的一小部分。

Unity 2D 吃豆人教程(上)

在本教程中,我们将通过Unity强大的2D特性,只用62行代码复制出一款吃豆人游戏。我们会尽量保持简单并关注于迷宫、幽灵、食物以及,当然了,吃豆人。

照例,所有内容都尽量解释得简单以便所有人都能理解。

这里有一个最终游戏效果的预览:

要求

背景知识

我们的教程没有任何特别的技能要求。如果你已了解Unity并且之前就听过GameObject,Prefab和Transform,那么你已经准备好了。如果你并不了解这些,也不用太担心。

还可以阅读我们之间的Unity教程,如Unity 2D Pong Game,以便先来感受一下这个引擎。

Unity版本

我们的吃豆人教程是利用.04开发的。更新的版本也同样没问题,之前的版本也许不能支持。现在Unity 5的免费版随之附带了所有的引擎属性,这也使得它成为推荐的版本。

工程设置

现在开始。启动Unity并创建New Project:

Unity 2D 吃豆人教程(上)

我们将其命名为pacman,选择任意路径,如C:\,选择2D模式并点击Create Project:

Unity 2D 吃豆人教程(上)

在Hierarchy里选中Main Camera并将其背景颜色设置为黑色。还需如下图所示调整其Size和Position。

迷宫

迷宫精灵

来创建吃豆人风格的迷宫吧。我们将绘制的迷宫基于原版,但不完全一致:

Unity 2D 吃豆人教程(上)

提示:右键单击图片,选择Save As...,到项目的Assets 文件夹下并将其存放于新建的Sprites文件夹中。

保存于我们的项目目录后,我们就可以在Project Area选中它了。

Unity 2D 吃豆人教程(上)

然后在Inspector中修改Import Settings。

提示:一个 Pixels Per Unit 等于 8 意味着游戏世界里一个单元中有 8 x 8 个像素。我们将为所有贴图赋予这个值。选择8是因为两个 Pac-Dot(食物)间永远相隔 8 个像素,同时我们也希望这个间距为游戏中的1单元。为 Pivot 选择 Bottom-Left 是由于它会使之后的对齐工作更简单。

现在我们可以从 Project Area 将地图 Sprite 拖拽到 Scene 中:

Unity 2D 吃豆人教程(上)

再来检查一下 Inspector 并且将地图的坐标设置成 (0, 0) 以保持清晰:

Unity 2D 吃豆人教程(上)

地图物理

此时的地图还只是一张图片而已。它并不属于整个物理世界,物体不会与它碰撞并且吃豆人还是能穿墙的。所以来给地图中的每面墙加上 Collider 吧。

在 Inspector 中选择 Add Component->Physics 2D->Box Collider 2D:

Unity 2D 吃豆人教程(上)

如果我们往 Scene 里看一下就会发现 Unity 用 Collider 将整个地图给包裹住了,我们可不希望这样:

Unity 2D 吃豆人教程(上)

我们真正想要的是地图中的每面墙由一个 Collider 包裹。实现它有两种做法。我们可以创建一个算法来读取迷宫图片然后生成一系列基于它的 Collider,或者全部手动添加。

点击 Inspector 中的 Edit Collider 按钮:

Unity 2D 吃豆人教程(上)

提示:这个按钮是 Unity 4.6 中新添加的,所以若你看不到这个按钮请确保使用了最新版本。

这允许我们在场景中使用绿点修改Collider:

我们将为迷宫中的每一堵墙重复这一过程。需要做的就是选择 Add Component->Physics 2D->Box Collider 2D,点击 EditCollider 按钮并在 Scene 中修改它直到适合相邻的那堵墙。

每个Collider的精确是很重要的。举例来说,如果我们放大来看,这些绿线应该完美包裹蓝色的方块:

Unity 2D 吃豆人教程(上)

实现的技巧是选择 Collider 中的 Center 和 Size 属性,那样它们就一直是 1.25、 1.5、 1.75 或 2.00,永远不会出现像 1.24687 或 1.25788 这样的数字。这里有一些例子:

Unity 2D 吃豆人教程(上)

提示:如果稍后你的吃豆人在迷宫中卡住或者移动有困难,那就是由于 Maze Collider 没有被完美放置。

下面是最终效果:

Unity 2D 吃豆人教程(上)

提示:校准所有的 Collider 可能得花上一些时间。

添加吃豆人

吃豆人Sprite

现在到了我们游戏中最重要的部分了:吃豆人。我们将需要每个移动方向的不同动画:

- 右

- 左

- 上

- 下

来把所有动画画在一张图里,同一方向的动画位于位于图中的一行:

Unity 2D 吃豆人教程(上)

提示:右键单击图片,选择 Save As... 并保存在项目 Assets/Sprites的文件夹里。

我们将为它使用下面的 Import Settings:

Unity 2D 吃豆人教程(上)

切割 Pac-Man Sprite

将 Sprite Mode 设置成 Multiple 是很重要的,那将告诉 Unity 在我们的 Sprite 里哪里有多于一个的吃豆人。来通过点击按钮打开 Sprite Editor:

Unity 2D 吃豆人教程(上)

现在我们可以告知 Unity 哪些地方的吃豆人动画切片是定位在我们的 Sprite 中的。我们将选择 Slice,然后将其切割成 16 x 16 Grid 并在之后按下 Slice 按钮:

Unity 2D 吃豆人教程(上)

一旦Sprite 被切割好,我们就可以再次关闭 Sprite Editor 了。如果 Unity 询问 Unapplied Import Settings,那就点击 Apply。

结果就是我们现在在 Project Area 的Pac-Man Sprite 之下有了 12 片:

Unity 2D 吃豆人教程(上)

创建吃豆人动画

好了,现在我们有了动画的切片,可以用它来创建 4 个动画。

right (Slice 0, 1 and 2)

右(切片 0、1 和 2)

left (Slice 3, 4 and 5)

左(切片 3、4 和 5)

up (Slice 6, 7 and 8)

上(切片 6、7 和 8)

down (Slice 9, 10 and 11)

下(切片 9、10 和 11)

来创建一个 right 动画吧。

Unity 2D 吃豆人教程(上)

然后将它们拖拽到 Scene 中:

Unity 2D 吃豆人教程(上)

现在我们无论何时将一些切片拖入到场景中,Unity 都将会知道我们希望通过它们创建一个动画,因此它会自动询问我们存放动画的位置。来将它以right.anim 的名字存放于一个新建的 PacmanAnimation 文件夹中。Unity 就为场景添加了一个 pacman_0 GameObject 并在 Project Area 添加了两个文件:

Unity 2D 吃豆人教程(上)

第一个文件是可以具体说明如动画速度以及混合树等的动画状态机。第二个是动画本身。接下来为剩下的动画(切片 3、4、5 作为左;切片 6、7、8 作为上以及切片 9、10、11 作为下)重复上述过程。

这里是 Hierarchy 在操作后的样子:

Unity 2D 吃豆人教程(上)

Unity 后清理

Unity 为每个动画都创建了一个GameObject,但我们只需要第一个,很快就能知晓原因。所以来选中剩余三个,右键单击并删除它们:

Unity 2D 吃豆人教程(上)

在 Project Area 里一个相似的情况发生了。我们现在有了 4 个动画以及 4 个动画状态机:

Unity 2D 吃豆人教程(上)

再一次的,我们只需要一个动画状态机即可,所以删除其它三个:

Unity 2D 吃豆人教程(上)

吃豆人动画状态机

此时我们拥有了 4 个动画文件,但 Unity 还并不知道该在何时播放哪个动画。解决方法一部分靠 Unity 自身惊人、强大的 Mecanim 动画系统。我们将需要一个拥有 4 种状态的动画状态机:

同样还需要添加一些 Transition 来让 Unity 知道何时从一个动画状态切换到另一个。

提示:Unity 会在处于 right 状态时一直循环播放 right 动画。它将需要使用 Transitions 来知道何时切换到另一个状态。Unity 会全部自动完成,我们需要做的只需用稍后的一段代码来通知它吃豆人的运动方向。

好了,来双击 Project Area 里的 pacman_0 动画状态机文件:

现在我们可以在 Animator 中看到状态机了:

Unity 2D 吃豆人教程(上)

创建其它状态

right 状态已经在 Animator 中了,所以就简单将 left.anim 文件从 PacmanAnimation文件夹中拖拽到 Animator 里来添加状态:

Unity 2D 吃豆人教程(上)

为另外两个状态重复这一过程:

Unity 2D 吃豆人教程(上)

Mecanim 特别厉害的一点是它将自动管理所有的动画状态。我们所要做的就是告诉 Mecanim 来注意吃豆人的运动方向,不需要做别的了。Mecanim 将会靠自己来在各个动画状态间转换,不需要我们的指引。

创建参数

所以让我们来告知 Mecanim 需要注意吃豆人的运动方向吧。一个运动方向是一个 Vector2 类型,下面的图片展示了一些可能的运动方向:

Unity 2D 吃豆人教程(上)

我们的吃豆人将只需要 4 个运动方向(上、下、左、右)。这就意味着动画状态机里只需要一下 4 种 Transitions:

如果 DirY > 0 那么就 up(like DirY=1,DirY=2,DirY=3 等等)

如果 DirY < 0 那么就 down(like DirY=-1,DirY=-2,DirY=-3 等等)

如果 DirX > 0 那么就 right(like DirX=1,DirX=2,DirX=3 等等)

如果 DirX < 0 那么就 left (like DirX=-1,DirX=-2,DirX=-3 and so on)

再来看一下 Animator 的左侧区域并且选择 Parameters 标签:

Unity 2D 吃豆人教程(上)

这里我们要点击右侧的 并添加一个名为 DirX 的 Float 类型参数,再添加一个名为 DirY 的 Float 类型参数:

Unity 2D 吃豆人教程(上)

之后我们就可以通过如下代码设置这些参数:

GetComponent<Animator>().SetFloat('DirX', 0);

GetComponent<Animator>().SetFloat('DirY', 0);

创建 Transitions

我们希望 Unity 能基于参数自转换动画状态。这些Transition 是被用于实现这一效果的。举例来说,我们可以添加一个从 left 到 right 的 Transition 带有一个 DirX > 0 的条件。

不管怎样最好还是要有一个小的容差,因为浮点值不总是准确的,这就是为什么我们取而代之使用 DirX >0.1。

现在我们也必须为其它到 right 的状态使用 DirX > 0.1 Transition。想要省点力气,可以使用 Unity 的 Any State。

Any State 确实代表了任意的状态。所以如果我们创建了一个从 Any State 到 right 的 Transition 就等同于从 left、up 和 down 到 right 的。

右键单击 Any State 并选中 MakeTransition。之后我们可以将白色箭头拖拽到 right 状态上:

Unity 2D 吃豆人教程(上)

现在我们可以点击白色尖头并且看一下 Inspector,在那里我们可以修改 Transition 的 Condition(换句话说,转换状态的时机)。我们将把它设置成 DirX > 0.1:

Unity 2D 吃豆人教程(上)

提示:按下底部右侧的 以添加一个 Condition。

同样在 Settings 里关闭 Can Transition To Self:

Unity 2D 吃豆人教程(上)

提示:这避免了异常状况的发生,比如一个动画可能会在按下一个移动键的时候一直重启。

结果,无论何时吃豆人都向右走(DirX > 0.1),animator将会转换到 right 状态并播放动画。

再添加 3 个 Transition:

Any State 到 left 伴有 Condition DirX< -0.1

Any State 到 up 伴有 Condition DirY> 0.1

Any State 到 down 伴有 Condition DirY< -0.1

以下是 Animator 现在的样子:

Unity 2D 吃豆人教程(上)

我们基本上完成了动画状态机。这里还有最后一个要校准的内容,所以选中所有状态然后在 Inspector 里修改它们的 Speed 来使动画看起来不太快:

Unity 2D 吃豆人教程(上)

如果我们按下 Play,就可以看到 right 动画:

Unity 2D 吃豆人教程(上)

原文链接:https:///unity/-pacman-game

译文版:http://www./thread-98978-1-1.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多