查看原文
其他

教程分享 | 使用Unity 2D制作经典游戏《吃豆人》(最终篇+汇总)

2015-12-31 Unity官方平台
在这篇《吃豆人》教程的最终篇里,我们将介绍如何添加怪物敌人。在本文的末尾有《吃豆人》教程汇总,让我们一起动手来做这款经典的复古游戏吧!
怪物
好的吃豆人离不开敌人。所以新建一些怪物。与吃豆人一样,怪物也有四个方向的动画:前后左右。首先是红色怪物,名字叫Blinky:


注:右击图片另存为,将图片保存到Assets/Sprites目录下。在项目视图中选中图片并使用如下导入设置:
创建动画
与上面吃豆人一样将Sprite Mode设为Multiple,在Sprite Editor 中以16x16的Grid切割怪物精灵:
点击Apply后关闭Sprite Editor 。与上面吃豆人一样,将切片拖拽到场景中创建动画。首先将切片0~1拖拽到场景创建向右移动到动画 right.anim,保存在BlinkyAnimation文件夹下。重复以上步骤:
2~3是left,4~5是up,6~7是down
清除多余的内容
与之前一样清除多余的blinky_2,blinky_4 和 blinky_6:
也可从项目视图的BlinkyAnimation文件夹下删除上面的文件:
动画状态机
双击blinky_0打开Animator:
还是与之前吃豆人一样的步骤和设置。拖拽动画、创建参数并设置变换:
从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 UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}

这里不需要Start和Update函数,只要FixedUpdate就好(因为要用到物理特性如移动等):

using UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {

void FixedUpdate () {

}
}

添加一个公共的Transform数组,以便在检视面板中设置路径点:

using UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {
public Transform[] waypoints;

void FixedUpdate () {

}
}

注:数组表示其中不只一个Transform。

还需要索引变量来记录怪物当前走向第几个路径点:

using UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {
public Transform[] waypoints;
int cur = 0;

void FixedUpdate () {

}
}


注:可以通过waypoints[cur]来访问当前路径点。

最后还要一个移动速度变量:

using UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {
public Transform[] waypoints;
int cur = 0;

public float speed = 0.3f;

void FixedUpdate () {

}
}

在FixedUpdate中让怪物向路径点移动,或在到达当前路径点后立即选择下一个路径点:

void FixedUpdate () {
// Waypoint not reached yet? then move closer
if (transform.position != waypoints[cur].position) {
Vector2 p = Vector2.MoveTowards(transform.position,
waypoints[cur].position,
speed);
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也可完成上述需求,但用取余%看起来更优雅。

不要忘记设置动画参数:

void FixedUpdate () {
// Waypoint not reached yet? then move closer
if (transform.position != waypoints[cur].position) {
Vector2 p = Vector2.MoveTowards(transform.position,
waypoints[cur].position,
speed);
GetComponent<Rigidbody2D>().MovePosition(p);
}
// Waypoint reached, select next one
else cur = (cur + 1) % waypoints.Length;

// Animation
Vector2 dir = waypoints[cur].position - transform.position;
GetComponent<Animator>().SetFloat("DirX", dir.x);
GetComponent<Animator>().SetFloat("DirY", dir.y);
}

最后怪物碰到吃豆人时,会吃掉吃豆人:

void OnTriggerEnter2D(Collider2D co) {
if (co.name == "pacman")
Destroy(co.gameObject);
}

注:这里可以减掉吃豆人的生命数或直接结束游戏。
添加路径点
为怪物添加一些路径点。新建游戏对象,重命名为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变量:
点击Play可以看到怪物按照路径点移动:


当然此时的路径相当简单。你可以自己设置复杂的路径比如:


再加几个怪物
再以同样的步骤添加三个怪物,分别是Pinky, Inky and Clyde:
注:为了让游戏更具挑战性,最好为每个怪物设置不同的路径。

点击Play就可以开始玩啦:


总结
本教程在Unity中快速创建了一个很流畅页很简单的2D吃豆人游戏。学习了像素于单位的对应关系,Mecanim, Collider, Rigidbody, Layer Orders以及脚本相关的内容。尽管AI过于简单且是固定的,但游戏还是很有挑战性。下面就是读者自由发挥的时间里。游戏中还可加入很多元素来增加趣味性,例如:

音效,最高分纪录,高级AI,入口,更多关卡,生命,爆发器,更多动画。
《吃豆人》往期教程汇总
教程 (1)教程 (2)教程 (3)


至此,使用Unity制作《吃豆人》的教程就全部结束了,希望大家能试着自己动手开发出这款经典的复古游戏!如想了解更多Unity开发教程,请点击阅读原文,关注Unity中文官方社区!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存