设为首页收藏本站

微软Hololens全息现实网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

一键登录:

查看: 774|回复: 1

Unity教程 | 手把手教你做一款《愤怒的小鸟》(上)

[复制链接]
发表于 2017-7-10 15:58:32 | 显示全部楼层 |阅读模式

今天为大家分享一篇Unity 2D教程,使用Unity 2D功能来实现一款类似《愤怒的小鸟》的游戏。其中用到的背景图片、石头、小鸟等资源均来自Asset Store资源商店的2D Sprites Pack,涉及到的功能包括2D物理、2D碰撞器及LineRenderer等。该游戏最终运行效果如下: 温馨提示,学习本教程需要了解Un...

今天为大家分享一篇Unity 2D教程,使用Unity 2D功能来实现一款类似《愤怒的小鸟》的游戏。其中用到的背景图片、石头、小鸟等资源均来自Asset Store资源商店的2D Sprites Pack,涉及到的功能包括2D物理、2D碰撞器及LineRenderer等。

该游戏最终运行效果如下:


97f807dd367db2f7bf3216313fd1a246.gif


温馨提示,学习本教程需要了解Unity编辑器基本操作及脚本编程概念。本文先为大家分享上半部分,示例工程使用Unity 5.6.1f1,实现内容包括设置背景、地面、弹弓及其与弹子之间的物理交互。



dafda558df0b0eeeedd1326a7b08a60f.jpg


新建Unity 2D项目,并将下载的图片资源导入该项目。将Sprites文件夹下的SkySprite图片拖拽至层级视图作为游戏背景,并将其重命名为“Background”。然后在层级视图新建空游戏对象命名为Floor,将GrassThinSprite图片拖拽至其下方成为子节点并重命名为“Floor1”,调整草地坐标让其位于屏幕下方区域。


为“Floor1”添加Edge Collider 2D组件,调整碰撞器的坐标让其位于草皮与地面交界处,如下图所示:


07fda00323f362f85156da5aa6a1fc49.jpg


在层级视图中选中“Floor1”对象,按下快捷键Ctrl/Cmd + D根据需要复制多个草地对象,并依次调整各自的坐标让这些草地铺满整个屏幕下方。效果如下:


65ff2f32b5561710bc16e81f1b72fd0c.jpg


添加弹弓选中Sprites文件夹下的CatapultSprite图片,将其切割为左右两部分,并分别将切割后的图片锚点移动至弹弓的皮筋所在位置,以便于后面绘制皮筋纹理。



25d3718790e4bc3084c9c3b4f28cd19b.jpg


切割完毕后将两张图片分别添加至场景,放置于草地上的合适位置。然后为场景添加弹子,也就是Sprites文件夹下的AsteroidSprite图片,并将其缩放为合适的大小。


29670d2353b272c178e2977fe8c4201f.jpg


为弹子添加Rigidbody 2D组件,这里希望弹子在空中飞行时不受重力的影响,所以将Rigidbody 2D组件的Body Type设为Kinematic。然后为弹子添加Circle Collider 2D组件,以便于进行物理检测。


b76dba3e096c1984e38e9aa1d7b15ad0.jpg


这里希望弹子在落地后会慢慢停止而非不停朝前运动,所以要为草皮使用物理材质,让草皮拥有一点摩擦力,以阻止弹子前进。新建Physical Material 2D物理材质,并将其Friction设为5。然后将新建的物理材质绑定到所有草地对象的Edge Collider 2D组件中。


8392f24f4a2d92d89dd972561a5bb135.png


添加拉弓效果新建空游戏对象Slingshot作为弹弓的父节点,将之前的两部分弹弓移到该对象下成为其子节点。然后新建两个LineRenderer对象作为弹弓左右两条弓,并新建三个空游戏对象分别标记弹弓两边节点与弹子起始位置。Slingshot对象结构如下图:


d6b22ad7dad57a9b4843a0466dde81f2.jpg


新建C#脚本Slingshot添加到Scripts文件夹下,Slingshot脚本的作用是处理弹子与弹弓之间的物理交互,生成弹弓被弹子拉扯的轨迹,并将弹子飞出。在Start方法中设置所有Line Renderer的Sorting Layer,并计算弹弓两边节点的中点位置。Start方法代码如下:


745b25986471cf84d1f8d57384aada5b.jpg


Update方式实现了一个简易的游戏状态机,当弹弓为空闲状态时,玩家点击屏幕会将弹子放置到待发射位置,并绘制弹弓两边的弦。如果玩家点击并拖拽弹子,则改变弹弓状态为UserPulling。代码如下:


f0b89441d69120aa1be9b3f031b8e300.jpg


当弹弓处于UserPulling状态时,就表示玩家正在拉扯弹弓。此时要计算弹子与弹弓中点之间的距离,如果距离大到一定程度就不允许玩家使劲了,同时绘制出弹弓的两条弦。将允许的最大距离设为1.5f,代码如下:


725a51d9703a6d2430db83f585beb178.jpg


控制弹弓最远拉拽距离的原理如下图,其中B为弹弓两个节点的中点,C为玩家拖拽弹子的位置(超过了设置的最大值1.5f),A是弹子最终可以到达的位置:

5cfc0ab50fbe85a17526164741a78248.png

用笛卡尔坐标系来表示上图,则三者之间的坐标关系如下:
d4f2ab20a000561482bea6e88f89d5fd.jpg

此时可以根据数学公式算出点A的坐标,所以可以得出可以拖拽的最远坐标值为:

  1. var maxPosition = (location - SlingshotMiddleVector).normalized * 1.5f + SlingshotMiddleVector;
复制代码

当玩家松开弹弓后,需要检测玩家拉拽弹弓的力量,如果力量够大,则弹子起飞,否则弹子将回到起始位置。代码如下:


84967cfd783c2601476e999f7942b85b.jpg


其中ThrowBird函数用来让弹子起飞,计算弹子起飞的加速度,并再飞行后为其添加重力作用,最后抛出事件通知脚本弹子已起飞。ThrowBird函数代码如下:


c61ddee0729256e28bb5b023abe92636.jpg


DisplaySlingshotLineRenderers函数用来绘制弹弓的两条弓,SetSlingshotLineRenderersActive则用于设置两条弓是否可见。两个函数代码如下:


7950272571fc3d5dc2d749b129eb5eb9.jpg


DisplayTrajectoryLineRenderer函数则用于绘制弹子飞行方向的轨迹,根据抛物线原理进行计算。代码如下:


82d70cc730ba0e3b0fbbbde4073a7add.jpg


到此弹子与弹弓的交互工程就完成了,此时运行场景,效果如下:


16a85f5b4ae8063e2a472732271633c0.gif


结语本教程上半部分解决了最棘手的弹弓与弹子之间的物理交互问题,在下本部分的教程中,我们将为大家介绍如何为弹子添加拖尾的效果,并加入弹子与障碍物之间的交互,相机跟随效果,以及游戏胜负的判定等。我们还会分享更多实用的Unity教程在Unity官方中文社区(unitychina.cn),请保持关注。


论坛(HoloLens全息现实网): http://hololens8.cn

VR/AR/HoloLens开发者QQ群:220104582
VR/AR资源分享QQ群:281921834
HoloLens/VR/AR交流QQ群:433190386





上一篇:Unity教程|10分钟轻松制作360全景VR应用
下一篇:Unity教程 | 手把手教你做一款《愤怒的小鸟》(下)
发表于 2017-7-10 16:05:26 | 显示全部楼层
这么牛,顶一个
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

注册验证邮件查收提醒:

由于各大邮箱政策原因,

如果没收到邮件提醒,

您的注册验证邮件可能

被投送到您邮箱的垃圾箱,

请注意查收验证哦


QQ|小黑屋|Hololens全息现实网 ( 京ICP备15026232号   点击这里给我发消息

GMT+8, 2018-9-25 19:20 , Processed in 0.581322 second(s), 32 queries .

Powered by Hololens全息现实网 X3.2

© 2001-2017 Hololens全息现实网

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