在这篇《吃豆人》教程的最终篇里,我们将介绍如何添加怪物敌人。在本文的末尾有《吃豆人》教程汇总,让我们一起动手来做这款经典的复古游戏吧!好的吃豆人离不开敌人。所以新建一些怪物。与吃豆人一样,怪物也有四个方向的动画:前后左右。首先是红色怪物,名字叫Blinky:注:右击图片另存为,将图片保存到Assets/Sprites目录下。在项目视图中选中图片并使用如下导入设置:与上面吃豆人一样将Sprite Mode设为Multiple,在Sprite Editor 中以16x16的Grid切割怪物精灵:点击Apply后关闭Sprite Editor 。与上面吃豆人一样,将切片拖拽到场景中创建动画。首先将切片0~1拖拽到场景创建向右移动到动画 right.anim,保存在BlinkyAnimation文件夹下。重复以上步骤:与之前一样清除多余的blinky_2,blinky_4 和 blinky_6:也可从项目视图的BlinkyAnimation文件夹下删除上面的文件:还是与之前吃豆人一样的步骤和设置。拖拽动画、创建参数并设置变换:从Any State到right的变换,条件是DirX > 0.1从Any State到left的变换,条件是DirX < -0.1从Any State到up的变换,条件是DirY > 0.1从Any State到down的变换,条件是DirY < -0.1为了整个项目看起来更简洁,在层次面板中选中blinky_0重命名为blinky:在检视面板中设置blinky坐标让其显示在迷宫中间:怪物也需具有物理特性。同样在检视面板中依次点击Add Component->Physics 2D->Circle Collider 2D并设置以下属性:注:启用Is Trigger是因为怪物可以穿过物体。怪物也可在迷宫中移动,所以要添加Rigidbody。依次点击Add Component->Physics 2D->Rigidbody 2D:与吃豆人一样,怪物也要在其它物体上层,所以同样将怪物的Order in Layer设为1:这里我们不清楚原作的AI机制,只是其中一些专注于四处移动,而另一些则专注于跟着吃豆人,或者还有些专门负责出现在吃豆人面前。本教程中我们选用最简单的AI:在迷宫中四处移动。新建一个按路径点移动的脚本,让怪物按照路径移动。听起来很简单,但确实能很好的解决AI问题。路径越复杂,万件就越难躲避怪物。新建C#脚本GhostMove,放在Scripts文件夹下。然后双击打开它:using System.Collections;
public class GhostMove : MonoBehaviour {
// Use this for initialization
// Update is called once per frame
这里不需要Start和Update函数,只要FixedUpdate就好(因为要用到物理特性如移动等):using System.Collections;
public class GhostMove : MonoBehaviour {
添加一个公共的Transform数组,以便在检视面板中设置路径点:using System.Collections;
public class GhostMove : MonoBehaviour {
public Transform[] waypoints;
using System.Collections;
public class GhostMove : MonoBehaviour {
public Transform[] waypoints;
注:可以通过waypoints[cur]来访问当前路径点。using System.Collections;
public class GhostMove : MonoBehaviour {
public Transform[] waypoints;
public float speed = 0.3f;
在FixedUpdate中让怪物向路径点移动,或在到达当前路径点后立即选择下一个路径点: // Waypoint not reached yet? then move closer
if (transform.position != waypoints[cur].position) {
Vector2 p = Vector2.MoveTowards(transform.position,
GetComponent<Rigidbody2D>().MovePosition(p);
// Waypoint reached, select next one
else cur = (cur + 1) % waypoints.Length;
注:上面用到Vector2.MoveTowards 函数来计算离路径点更近的点。然后用rigidbody2D.MovePosition来设置怪物的位置。到达路径点后将cur加1。如果cur超出数组长度则设为0。使用if (cur == waypoints.Length) cur = 0也可完成上述需求,但用取余%看起来更优雅。 // Waypoint not reached yet? then move closer
if (transform.position != waypoints[cur].position) {
Vector2 p = Vector2.MoveTowards(transform.position,
GetComponent<Rigidbody2D>().MovePosition(p);
// Waypoint reached, select next one
else cur = (cur + 1) % waypoints.Length;
Vector2 dir = waypoints[cur].position - transform.position;
GetComponent<Animator>().SetFloat("DirX", dir.x);
GetComponent<Animator>().SetFloat("DirY", dir.y);
void OnTriggerEnter2D(Collider2D co) {
为怪物添加一些路径点。新建游戏对象,重命名为Blinky_Waypoint0并为其设置Gizmo便于在场景中观察:注:Gizmo只是一个可视化的辅助工具,运行时不可见。将其坐标设为(15, 20),在场景中看起来如下:复制路径点并依次设置坐标,Blinky_Waypoint1是(10, 20):Blinky_Waypoint2是(10, 14):Blinky_Waypoint3是 (19, 14):最后Blinky_Waypoint4是 (19, 20):因为移动脚本会在到达最后点路径点之后从第一个路径点开始,所以我们要设置循环。在层次面板中选中blinky, 将路径点依次拖拽到GhostMove的Waypoints变量:当然此时的路径相当简单。你可以自己设置复杂的路径比如:再以同样的步骤添加三个怪物,分别是Pinky, Inky and Clyde:注:为了让游戏更具挑战性,最好为每个怪物设置不同的路径。本教程在Unity中快速创建了一个很流畅页很简单的2D吃豆人游戏。学习了像素于单位的对应关系,Mecanim, Collider, Rigidbody, Layer Orders以及脚本相关的内容。尽管AI过于简单且是固定的,但游戏还是很有挑战性。下面就是读者自由发挥的时间里。游戏中还可加入很多元素来增加趣味性,例如:音效,最高分纪录,高级AI,入口,更多关卡,生命,爆发器,更多动画。
至此,使用Unity制作《吃豆人》的教程就全部结束了,希望大家能试着自己动手开发出这款经典的复古游戏!如想了解更多Unity开发教程,请点击阅读原文,关注Unity中文官方社区!