开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:590

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 1007|回复: 4

[外文翻译] Unity 2D 吃豆人教程(下)

[复制链接]  [移动端链接]
排名
5679
昨日变化
1

18

主题

26

帖子

439

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
124522
好友
6
蛮牛币
496
威望
0
注册时间
2015-10-3
在线时间
91 小时
最后登录
2017-11-17

蛮牛译员

发表于 2016-12-31 23:28:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 Raffles 于 2016-12-31 23:52 编辑

幽灵

一个好的吃豆人克隆游戏需要一些敌人,所以来加上一些幽灵吧。

红色精灵图像

与之前一样,我们将以绘制一个带有所有动画的幽灵 Sprite 开始。每一行包含一个动画:


第一个是红色幽灵,同样被称为 Blinky


提示:右键单击图片,选择 Save As... 然后将其存放在工程的 Assets/Sprites文件夹中。

Project Area 中选中它,然后在 Inspector 中修改 ImportSettings


创建动画

Sprite Mode 再次设置成 Multiple 是很重要的,因为我们的 Sprite 包括了一些切片。点击 Sprite Editor 按钮将其切割成 16 x 16 的网格:


然后可以关闭 Sprite Editor 并按下 Apply。现在是时候通过将切片拖拽进场景中来创建动画了,就像我们为吃豆人做的一样。

首先要把切片 0 1 拖拽到场景中并把动画以 right.anim 的名字保存在新的 Blinky文件夹中。

然后为如下动画重复这一过程:

切片 23 作为 left
切片 45 作为 up
切片 67 作为 down

Unity 后清理
现在可以通过删除 blinky_2blinky_4 blinky_6 的GameObject 来清理 Hierarchy 了:


还可以从 Project Area 中的 BlinkyAnimation 文件夹里删除 blinky_2blinky_4 blinky_6


动画状态机

双击 blinky_0 文件以打开 Animator:


我们将创建一个同之前为吃豆人所做的一模一样的动画状态机。所要做的就是拖拽进动画,创建 Parameter 然后设置 Transition:

Any Stateright 带有条件 DirX >0.1
Any Stateleft 带有条件 DirX <-0.1
Any Stateup 带有条件 DirY >0.1
Any Statedown 带有条件 DirY <-0.1

这里是 Animator 中动画状态机的最终样子:


重命名并且定位 Blinky
来确保维持所有目标的整洁。在 Hierarchy 中选中 blinky_0 GameObject 并将其命名为 blinky


还要在 Inspector 改变坐标以使 Blinky 在地图的正中间:


幽灵物理

好了,Blinky 又该成为物理世界的一员了。在 Inspector 中选择 AddComponent->Physics 2D->CircleCollider 2D 来添加如下属性:


提示:由于 Blinky 是一个幽灵,而幽灵是可以穿透物体的,所以我们取消选中 Is Trigger

Blinky 还应该围绕迷宫移动,这也就意味着将给他添加一个 Rigidbody。选择 Add Component->Physics 2D->Rigidbody2D


Blinky 置于前景
就像吃豆人一样,我们希望 Blinky 被绘制在前景中,在 Pac-Dot 们前面。



幽灵运动

我们并不清楚原始吃豆人游戏中的 AI 是如何工作的,除了知道它是确定性的(就是一个意为“非随机”的好听些的叫法)。它同样显示出一些幽灵会更关注绕着迷宫移动,而另一些会更关注跟随吃豆人,或者可能是试图将它们自己定位在吃豆人前面。

在本教程中,我们将采取最简单的 AI 选项:绕着迷宫运动。我们将创建一个航路点运动脚本来使 Blinky 沿特定轨迹跑动。听起来有点太简单了,但实际上对于我们的 AI 问题来说是个非常好的解决办法。轨迹越长、越复杂,玩家躲避 Blinky 就越困难。

选择 Add Component->New Script,将其命名为 GhostMove,选择 CSharp ,然后将其移到 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 方法,取而代之,我们使用 FixdUpdate 方法(由于它是为如运动这种物理现象设计的):

using UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {

    void FixedUpdate() {

    }
}

添加一个 public Transform 数组来让我们可以稍后在 Inspector 中设置航路点:

using UnityEngine;
using System.Collections;

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

    void FixedUpdate() {

    }
}

提示:一个数组代表多于一个 Transform

同样还需要一些类似索引的变量来能追踪到 Blinky 当前正朝向哪里移动:

using UnityEngine;
using System.Collections;

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

    void FixedUpdate() {

    }
}

提示:当前航路点可以一直由 waypoints[cur] 而可通行。

还有当然了,一个移动速度变量:


using UnityEngine;
using System.Collections;

public class GhostMove : MonoBehaviour {
    publicTransform[] 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。可以使用如 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);
}


太好了,就只需再向我们的脚本里添加最后一件东西了。幽灵应该会在撞到吃豆人后销毁他:


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


提示:愿意的话可以选择减少吃豆人的命或者在此时显示 Game Over

添加航路点

好了,来为 Blinky 添加一些航路点吧。我们将由从顶部菜单选择 GameObject->Create Empty 开始。为其命名为 Blinky_Waypoint0 并注册给 Gizmo,这样让我们也可以更容易在场景中看到它:


提示:一个 Gizmo 就是一个视觉帮助器,在它帮助游戏进程的时候我们并不能看见。同样把它置于 (15, 20)。这是它在场景中的显示效果:


现在我们可以复制航路点了,将其重命名为 Blinky_Waypoint1并置于 (10, 20)


Blinky_Waypoint2 置于 (10, 14)


Blinky_Waypoint3 置于 (19, 14)


最后把 Blinky_Waypoint4 置于 (19, 20)


并且由于我们的移动脚本会在抵达最后一个航路点后继续向着第一个航路点前进,我们也就拥有了一个完美的循环。再次在 Hierarchy 中选择 blinky 并将航路点一个个拖拽进 GhostMove 脚本里的 Waypoints 槽里:


如果我们按下 Play 那么我们就可以看到 Blinky 是怎么演着航路点移动的:


当然,当前的航路点还比较简单。所以愿意的话可以来创建一个像下面这样更复杂的:


PinkyInky Clyde
我们不希望 Blinky 感到孤单,所以来重复流程制作出 PinkyInky Clyde吧:


提示:为每个幽灵使用不同的航路点和移动速度以使游戏更有挑战性是很重要的。


如果我们按下 Play 就可以好好玩上一把吃豆人了:


总结


我们刚刚用 Unity 创建了一个稳定、快速并简单的2D 吃豆人仿照版游戏。学习了 Pixels 到Units、Mecanim、Colliders、Rigidbodies、LayerOrders 和 Scripting。而且尽管 AI 还是非常简单、确定性的,游戏仍然很具有挑战性。


现在就交给读者们来使游戏变得更加有趣了。这里有一些可以添加的素材:


音效
高分
高级的 AI
传送门
更多的关卡
生命值
能量棒
更多动画


下载源代码 & 工程文件

本Unity 2D 吃豆人教程的源代码和工程文件可供 Premium成员下载。

原文链接:https://noobtuts.com/unity/-pacman-game

回复

使用道具 举报

排名
53168
昨日变化
21

0

主题

4

帖子

11

积分

Rank: 1

UID
198840
好友
0
蛮牛币
15
威望
0
注册时间
2017-1-4
在线时间
5 小时
最后登录
2017-1-7
发表于 2017-1-7 16:12:02 | 显示全部楼层
谢谢分享,学习一下

回复 支持 反对

使用道具 举报

5熟悉之中
501/1000
排名
3762
昨日变化
23

0

主题

24

帖子

501

积分

Rank: 5Rank: 5

UID
90338
好友
0
蛮牛币
834
威望
0
注册时间
2015-4-8
在线时间
171 小时
最后登录
2017-11-20
发表于 2017-1-9 10:11:56 | 显示全部楼层
大致看完了,试着做一下了

回复 支持 反对

使用道具 举报

4四处流浪
328/500
排名
7745
昨日变化
3

2

主题

114

帖子

328

积分

Rank: 4

UID
131971
好友
4
蛮牛币
1621
威望
0
注册时间
2015-12-17
在线时间
84 小时
最后登录
2017-3-28
发表于 2017-2-9 14:59:16 | 显示全部楼层
没有素材呀

回复

使用道具 举报

4四处流浪
328/500
排名
7745
昨日变化
3

2

主题

114

帖子

328

积分

Rank: 4

UID
131971
好友
4
蛮牛币
1621
威望
0
注册时间
2015-12-17
在线时间
84 小时
最后登录
2017-3-28
发表于 2017-2-9 15:03:02 | 显示全部楼层
原文链接是这个:https://noobtuts.com/unity/2d-pacman-game

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表