[Unity] 手把手教你做一款《愤怒的小鸟》

查看:853 |回复:0 | 2019-11-12 11:03:25

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

x
本帖最后由 kanisen 于 2019-11-12 10:19 编辑

2430004_a03.jpg


使用Unity 2D功能来实现一款类似《愤怒的小鸟》的游戏


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

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



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

准备工作

请访问Asset Store资源商店进入Unity官方中文社区,下载游戏所需的图片资源。

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

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


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

添加弹弓

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


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


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


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


添加拉弓效果

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


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


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


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


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


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


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

var maxPosition = (location - SlingshotMiddleVector).normalized * 1.5f + SlingshotMiddleVector;
当玩家松开弹弓后,需要检测玩家拉拽弹弓的力量,如果力量够大,则弹子起飞,否则弹子将回到起始位置。代码如下:


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


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


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


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








评分

参与人数 1元素币 +10 活跃度 +10 展开 理由
源支始 + 10 + 10

查看全部评分

2019-11-12 11:03:25  
 赞 赞 0

使用道具 登录

0个回答,把该问题分享到群,邀请大神一起回答。

CG 游戏行业专业问题

手机游戏引擎手游引擎Unity3D技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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