前言


这篇教程讲解如何在Unity中制作《吃豆人》游戏。该游戏最初发布于1980年10月,并很快风靡全球直至现在。Unity也用到了其中的形象作为UI:



本篇教程将使用Unity强大的2D功能,仅用62行代码来制做一个仿版《吃豆人》游戏。游戏会尽可能的简单,只关注迷宫、怪物、豆豆以及主角吃豆人。在今天的文章中,我们将先为大家介绍如何创建游戏迷宫。

让我们来看看游戏最终效果:



我们将该项目命名为pacman,选取项目存储的目录如C:\,项目类型选择2D,然后点击Create Project:


在层次面板(Hierarchy)中选中Main Camera ,将背景色(Background Color)设为黑色。并如下图所示调整大小和位置:


迷宫
● 迷宫精灵

让我们模仿原始游戏来制作一个类似的典型迷宫。


注意:您可以点击鼠标右键,选择另存为,把该图片保存到项目目录Assets -> Sprites文件夹下。保存在项目目录中文件,可以在项目视图(Project)中查看。我们选中刚保存的图片:



然后在检视面板(Inspector)中修改导入设置:


注意:Pixels Per Unit 值为8表示游戏世界的每个单位会填充8x8像素。我们会将该数值用于所有纹理。选择8是因为两个豆豆之间的距离是8像素,并且我们希望这是游戏中的一个单位。将锚点(Pivot)设为左上是便于后续使用。

现在将迷宫精灵从项目视图拖拽到场景视图(Scene):


查看检视面板,并将迷宫坐标设为(0,0):



● 迷宫物理

此时迷宫还只是一张图。不具有物理性质,所以吃豆人也无法在墙间游走。现在就为迷宫的每道墙都添加一个Collider。在检视面板中依次选择Add Component->Physics 2D->Box Collider 2D:


查看场景视图会发现Unity将Collider的范围覆盖了整个迷宫,这显然不是我们想要的:


我们希望每道墙都有单独的Collider。有两种办法可以实现。第一种是写个算法基于迷宫图片来生成Collider,第二种就是简单的手动添加。

在检视面板中点击Edit Collider 按钮:

注意:只有Unity 4.6及以上版本才有上面的按钮。

现在就可以在场景中使用绿色的点来调整Collider了:


这里的诀窍就是设置Collider的大小和中心点时注意值都是1.25、1.5、1.75或2.00这样,而非1.24687或1.25788。示例如下:

注意:如果后面吃豆人被困在迷宫或无法移动,就是因为迷宫的Collider没有完全设置好。

最终结果如下:


注意:调整所有Collider可能要些时间。

在昨天的教程中,我们分享了创建《吃豆人》迷宫的方法,今天我们将告诉大家如何添加游戏主角 - 吃豆人的动画!

添加吃豆人

● 吃豆人精灵


现在该游戏主角——吃豆人出场了! "上下左右“每个方向的移动都需要一个动画,将所有动画放在一张图中,一行就是一个方向的动画:
 
注:右击图片选择另存为,存到项目目录Assets/Sprites文件夹下。
导入设置如下:
 
 切割吃豆人精灵

将Sprite Mode设为Multiple很重要,这会告诉Unity其中包含了多个吃豆人精灵。点击按钮打开Sprite Editor:
 
现在就让Unity对吃豆人精灵进行切片。选择Slice将Grid设为16x16,然后点击下面的Slice按钮:
 
精灵切割完成后关闭Sprite Editor。如果Unity提示Unapplied Import Settings,选择Apply。现在项目视图中吃豆人精灵下有12个子精灵:
 
● 创建吃豆人动画

现在可以创建4个方向的动画了。再提一下,我们需要的动画如下:右(切片0,1,2),左(切片3,4,5)上(切片6,7,8),下(切片9,10,11)
先创建向右的动画。在项目视图中选中前三个切片精灵:
 
然后将它们拖拽到场景中:
 
现在同时拖拽几个精灵到场景中,Unity就会知道我们想创建动画,并自动询问动画保存的位置。将动画命名为right.anim并保存到新建的PacmanAnimation目录。Unity会自动在场景中加入游戏对象pacman_0,并在项目视图中新增两个文件:
 
第一个文件是动画状态机,用于设置动画速度和混合树等。第二个的动画文件。对余下的动画重复以上步骤。
现在层次面板看起来如下:
 
● 清除Unity自动添加的内容

Unity为每个动画都新建了游戏对象,但我们这里只需要一个。选中其余三个并删除:
 
在项目视图中也一样。动画和状态机各有4个:
 
同样删除其它多余的三个:
 
● 吃豆人动画状态机

现在有4个动画文件,但Unity并不知道要播放哪个动画。所以我们需要一个具有4种状态的动画状态机:right, left, up, down
还要添加变换让Unity知道何时切换动画。注:Unity会在处于right状态时重复播放right动画。它依靠Transition来判断何时切换状态。这些都是Unity自动完成的,我们要做的就是在后面的脚本中告知它吃豆人的移动方向。
在项目视图中双击pacman_0动画状态机:
 
现在可在Animator查看状态机:
 
● 创建其它状态

状态机中已经包含right状态了,将项目视图中ShipAnimation文件夹下的left.anim文件拖拽到Animator中新建left状态:
 
对剩下的两个状态重复以上步骤:
 
Mecanim最大的优点是它会完全自动管理动画状态。我们要做的就是告诉Mecanim注意吃豆人的移动方向。Mecanim会自动切换动画状态,不需我们操心。

● 创建参数

下面就来告诉Mecanim主意吃豆人的移动方向。移动方向参数类型是Vector2,下图展示了几种可能的移动方向:
 
本例中吃豆人只有4个移动方向。也就是说在动画状态机中仅需4种状态变换:
DirY>0则向上移动,DirY<0则向下移动DirX>0则向右移动,DirX<0则向左移动
在Animator界面中选择Parameters标签页:
 
点击右边的+添加一个Float类型的参数命名为DirX,再添加一个Float参数命名为DirY:
 
后面可以在脚本中设置参数,代码如下:
GetComponent<Animator>().SetFloat("DirX", 0);
GetComponent<Animator>().SetFloat("DirY", 0);

● 创建变换

我们希望Unity基于这些参数自动切换动画状态。变换就是用于实现这点的。例如,新建一个从left到right的变换,条件是DirX > 0。但要考虑到最完美的变换也会存在细微误差,因为浮点数的比较并不太完美,因此我们会使用DirX>0.1来判断。从其它任何状态切换为right都会用到DirX > 0.1。所以借助Unity的Any State来节省一些工作量。Any State几乎表示任何状态。所以创建一个从Any State到right的变换就相当于同时创建了left,up和down到right的变换。
右击Any State 选择Make Transition。然后将白色箭头拖拽到right状态:
 
点击白色箭头后在检视面板中设置变换的条件(即何时切换状态)为DirX > 0.1:
 
注:点击右下角的+新增条件。
禁用Settings中的Can Transition To Self :
 
注:这样可以避免出现按下某个方向键时动画会一直重新开始的情况。
因此,当吃豆人向右移动时(DirX > 0.1),状态机会切换到right状态播放向右移动的动画。同样的步骤新建另外3个变换:Any State到left,条件为DirX < -0.1,Any State 到up,条件为DirY > 0.1Any State 到down,条件为 DirY < -0.1
现在Animator如下:
 
动画状态机就差不多完成了。还要进行最后一个调整,选中所有状态并在检视面板中修改Speed以便动画看起来不会太快:
 
点击Play就可以看到right动画:
 
● 吃豆人命名及摆放

在层次面板中选中pacman_0并重命名为pacman(右击选择重命名,或按F2):
 
将其坐标设为 (14, 14) 这样就不会位于迷宫外了:
 

Unity制作《吃豆人》游戏视频教程地址请点击此链接 http://www.insideria.cn/course/342​

锐亚教育 锐亚科技 unity unity教程