查看原文
其他

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

2017-06-20 Unity官方 Unity官方平台

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


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



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


准备工作

请点击[阅读原文]进入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函数则用于绘制弹子飞行方向的轨迹,根据抛物线原理进行计算。代码如下:



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



结语

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


更多Unity相关技术文章

Unity中可用于VR环境的空间化音效

Unity 5.6中的混合光照

Unity实验预览版支持为macOS开发VR及AR内容

基于Animation Instancing的大规模人群模拟

eaglEEye性能测试平台详解


Unity官方活动


2017年首次Unity官方问卷调查启动,完整填写并提交还有机会获得Unity限量双肩包一份,仅剩最后两天!


2017 Unity技术路演华东站(南京)离开幕仅剩最后两天!在这个夏天,感受来自Unity官方技术团队的热情!


点击“阅读原文”进入Unity官方中文社区

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

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