请选择 进入手机版 | 继续访问电脑版

查看: 8775|回复: 17

Unity的2D案例下载:拯救吃豆人

[复制链接]

845

主题

1484

帖子

1万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
19165
QQ
发表于 2016-1-7 12:35:58 | 显示全部楼层 |阅读模式
前段时间,我们发布了使用Unity的2D功能制作的《吃豆人》系列教程:http://forum.china.unity3d.com/thread-13546-1-1.html

受到了非常大的欢迎,不过,一些动手制作该游戏的朋友,竟然发现自己的吃豆人会被迷宫卡住!还能不能愉快地吃豆了!

我们社区的U小粽同学表示“救不了中国的股市,我要救吃豆人”。于是整合和精简了该教程中的代码,并提供了项目的资源包下载(下载在本帖附件),你可以直接进行下载学习,如果有任何问题,欢迎大家反馈给U小粽同学。

以后,我们也会提供更多项目教程和案例与大家分享。现在让我们来拯救吃豆人吧。 屏幕快照 2016-01-07 下午8.21.05.png

以下二个问题,是原教程中的问题。
问题1:按照教程编写,当Player移动到部分墙体位置,Player便无法移动?
PPP.png


首先先看看在这种请况下,目标点与Player当前的位置关系,我们通过Debug.log进行判断。
PP1.png


以下是所得到的结果:
PP2.png


很明显的发现,目标点位置超出了Player当前位置一个单元格,因此我们可以得出结论,在此处无法移动的原因是:Player由于墙体的拦截无法到达目标点。

(Vector2)transform.position == dest
的判断无法为True,其他方向的移动无法执行。

简单分析其原因,Player在移动过程中,当到达目标点后,不会立即停止移动,而此时脚本已经开始执行替换目标点的代码。由于墙体的拦截,Play的位置与目标位置不等,导致Player无法移动的现象。

故此,我们需要在判断行进路线时考虑这一因素。见下图
PP3.png


自此,该问题得到了解决。

● 问题 2:某些位置时会出现如图现象,Player无法移动。

PP4.png

这个问题是因为射线没有检测到墙体,最简单的方法是将墙的Collider进行稍微扩大。

最后,希望大家用Unity做成更多更棒的2D游戏哦。

吃豆人资源.zip

61.27 KB, 下载次数: 2554

1

主题

25

帖子

225

贡献

初级UU族—3级

Rank: 3Rank: 3

积分
225
发表于 2016-1-7 14:37:51 | 显示全部楼层
程序不完整

845

主题

1484

帖子

1万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
19165
QQ
 楼主| 发表于 2016-1-11 06:08:08 | 显示全部楼层

怎么不完整啦

0

主题

11

帖子

290

贡献

初级UU族—3级

Rank: 3Rank: 3

积分
290
发表于 2016-1-11 06:47:34 | 显示全部楼层
感谢,正在看教程。

0

主题

5

帖子

40

贡献

初级UU族—1级

Rank: 1

积分
40
发表于 2016-2-22 09:46:23 | 显示全部楼层
这个更新的BUG补丁教程貌似并没有解决一开始运行时, pacman的transform.position由坐标(14,14)改变为(14,13.99608)的细微变化,我发现出现这个细微的改变可能和游戏对象Pacman上的 Rigidbody 2D有关, 因为刚体有质量,所以导致Pacman有细微的下沉,使得Y周改变,所以if((Vector2)transform.position == dest)判断条件不成立.  我尝试把Pacman上的Rigidbody 2D 中的Is Kinematic 勾上, 貌似问题就结局了.

0

主题

1

帖子

20

贡献

初级UU族—1级

Rank: 1

积分
20
发表于 2016-5-5 06:38:39 | 显示全部楼层
我用了下面这种解决方法,省的判断了,每次update移动一格。
[C#] 纯文本查看 复制代码
	void FixedUpdate () {

		_nextDir = Vector3.zero;
		if (Input.GetKey (KeyCode.UpArrow) && valid (Vector3.up))
			_nextDir = Vector3.up;
		if (Input.GetKey (KeyCode.DownArrow) && valid (Vector3.down))
			_nextDir = Vector3.down;
		if (Input.GetKey (KeyCode.RightArrow) && valid (Vector3.right))
			_nextDir = Vector3.right;
		if (Input.GetKey (KeyCode.LeftArrow) && valid (Vector3.left))
			_nextDir = Vector3.left;
		this.transform.Translate (_nextDir*speed);

		// Animation Parameters
		GetComponent<Animator>().SetFloat ("DirX", _nextDir.x);
		GetComponent<Animator>().SetFloat ("DirY", _nextDir.y);
	}

1

主题

3

帖子

30

贡献

初级UU族—1级

Rank: 1

积分
30
发表于 2016-6-20 10:43:10 | 显示全部楼层
为什么我在运行的时候移动不了他呢

0

主题

3

帖子

40

贡献

初级UU族—1级

Rank: 1

积分
40
发表于 2016-6-23 16:27:33 | 显示全部楼层
这些豆子只能一个个放过去吗?

0

主题

5

帖子

60

贡献

初级UU族—2级

Rank: 2

积分
60
发表于 2016-8-26 08:25:16 | 显示全部楼层
tljconan 发表于 2016-2-22 09:46
这个更新的BUG补丁教程貌似并没有解决一开始运行时, pacman的transform.position由坐标(14,14)改变为(14,13 ...

这是正解  

0

主题

16

帖子

155

贡献

初级UU族—2级

Rank: 2

积分
155
发表于 2016-12-11 07:02:17 | 显示全部楼层
发生的方式发多少
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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