在手把手教你做一款《愤怒的小鸟》(上)这篇教程中,我们实现了弹弓与弹子之间的物理交互。今天这篇文章将继续讲解下半部分内容,为弹子添加拖尾效果,加入弹子与障碍物的交互,加入相机跟随效果及游戏胜负判定。

最终游戏效果如下:
170035rco79no6o9n8q9j9.gif

添加弹子拖尾效果
在层级窗口选中弹子对象,在检视窗口中为其添加Trail Renderer组件:
170034p3kz3k3rt55334zz.png

新建C#脚本命名为Bird,将该脚本添加到弹子对象上。在Start函数中设置弹子的初始状态,放大弹子的碰撞器以方便玩家点击,并控制拖尾效果是否显示。BirdState是用来标志弹子状态的枚举,共有飞行前及飞行中两种状态。Start函数代码如下:
170034mrk8zjs3svsrv3oo.png

在脚本中添加FixedUpdate函数,来检测弹子是否已被弹弓射出,如果已被射出且弹子速度非常小,就表示弹子已经落地。落地两秒后从场景中移除弹子对象。代码如下:
170033ilxra5ceqc5aczlr.png

最后是供弹弓脚本调用的OnThrow函数,在弹子被射出时将其碰撞器设为原始大小,为其加上重力作用并显示拖尾效果。代码如下:
170033pwdmadq3psbme8ar.png

弹子射出后的拖尾效果如下:
170032yje2f8ew1wohdg7e.png

显示弹子飞行轨迹

在层级窗口中选中弹弓对象,为其新建空游戏对象命名为trajectoryLineRenderer,并将该对象赋给SlingShot脚本的TrajectoryLineRenderer字段。在trajectoryLineRenderer对象上添加LinerRenderer组件。现在弹弓对象的层级结构如下:
170032xzhofzqrkct0f0zc.png

SlingShot脚本中的DisplayTrajectoryLineRenderer函数用于绘制弹子飞行轨迹。拉拽弹弓时,会预先显示弹子的飞行轨迹,效果如下:
170031ot6e1j2f23tjxepj.png

添加障碍物
新建空游戏对象作为障碍物父节点,然后将Sprites文件夹下的PlankSprite拖拽至该对象下方,设置Tag为“Brick”,并为该图片添加Box Collider 2D及Rigidbody 2D组件。新建C#脚本命名为Brick,该脚本用于检测弹子与障碍物的碰撞,并在碰撞发生后减去相应的生命值,减至0时从场景中移除障碍物。脚本代码如下:
170031yxdcmbobmi2xdexb.png

将新建的Brick脚本添加到障碍物子对象上,并在层级视图中复制多个障碍物,调整各个障碍物的坐标。摆成如下图的形式:
170030nsaooooclfgslgf1.png

添加目标
障碍物建好之后,下面来添加射击目标。将Sprites文件夹下的BirdEnemyIdleSprite添加到障碍物父节点下,与障碍物为同一层级,将游戏对象重命名为Pig,设置其Tag为“Pig”。并为其添加Circle Collider 2D与Rigidbody 2D组件。新建Pig脚本用于检测碰撞,如果目标与弹子发生碰撞,则直接死亡。如果目标是与对象发生碰撞,则计算伤害,并在伤害减至0时从场景中移除目标。脚本代码如下:
170029cw0s6xqv0ggq0iy4.png

将Pig脚本添加到目标对象上,然后复制两个目标,调整目标的坐标位置如下:
170029c9qd79076k7uo6qt.png

将Sprites文件夹下的BirdEnemyDeathSprite图片分别赋给3个Pig脚本的SpriteShowWhenHurt字段,在目标被射中时会更换图标表示受伤。

设定游戏边界
在场景中新建3个Quad对象,分别作为游戏的左、右及上方边界,位于背景图后面。将其材质设置为半透明,并为其添加Box Collider 2D组件,勾选碰撞器的Is Trigger属性。
170028a9sf9sfhho1o9xbx.png

新建脚本Destroyer用于在任意对象碰撞到边界时销毁对象,脚本代码如下:
170027ujchheqcblic0ec1.png

当弹子飞出边界后会被直接销毁。

添加相机跟随
新建脚本CameraFollow,用于跟随弹子射出时移动相机,并限定相机移动范围,以避免移出游戏边界。将该脚本添加到场景中的主相机上,脚本代码如下:
170027re0uu0e0u97iit0l.png


添加游戏胜负判定
用游戏管理器来管理游戏状态,控制弹弓状态,触发弹弓发射事件,并更改相机是否跟随的状态,最后负责游戏胜负的判定。在Start函数中,游戏管理器会获取所有类型的对象,并设置游戏与弹弓的初始状态。新建脚本GameManager,代码如下:
170026wln53hw34orrh3h3.png

在Update函数中管理游戏状态,控制游戏开始、进行中与游戏结束后的操作。游戏开始前,玩家点击屏幕后将第一个弹子移动到弹弓初始位置就位,然后等待玩家拉拽弹弓后射出弹子。Update函数代码如下:
170025ls81eltltwt5v7ep.png

AllPigsDestroyed函数用于检测是否所有目标都被销毁,代码如下:
170025a2hkhwxvxprxievi.png

AnimateCameraToStartPosition函数用于移动相机位置,相机在跟随射出的弹子移动到屏幕右侧后,对目标进行判断,如果所有目标被摧毁,则玩家胜利且游戏结束。否则就将相机移动至起始位置,继续下一次射击。如果没有可供射击的弹子,则玩家失败。函数代码如下:
170024lczby6x7fgss1psw.png

AnimateBirdToSlingshot函数用于将弹子移动到弹弓的起始拉拽位置,弹子就位后将弹弓改为激活状态,可以绘制弹弓两边的弦。代码如下:
170024s29yqcz6g5zneq4v.png

Slingshot_BirdThrown是BirdThrown事件的回调函数,用于告诉相机需要跟随的弹子。函数代码如下:
170023o02igh5obg8mg7gi.png

最后的OnGUI函数用于在游戏界面上显示一些游戏状态相关的文字信息,代码如下:
170023vifpya72yy77y0ff.png

最后是项目中定义的常量与枚举,常量主要包括弹子的最小速度、弹子的最小及最大半径,这些也可以直接在Bird脚本中定义。单独列出来以方便后面进行维护,新建Constants脚本,代码如下:
170022vd7p11j8mby8ondp.png

枚举则用来定义弹弓状态、弹子状态以及游戏状态,新建Enums脚本,代码如下:
170022tq5k4hf9qfl9llhl.png

到此整个教程就结束了,在场景中另外添加两个弹子。运行游戏,效果如下:
170021xkdkbkk2dpebevxw.png

结语
本教程为大家介绍了如何在Unity中实现一款类似《愤怒的小鸟》的简单游戏,设计了一个关卡,添加了胜负判断条件。大家还可以在此基础上继续完善,设计多个不同的关卡,为目标受伤添加音效,添加关卡时间限制等等。希望这篇教程对正在学习Unity的初学者有帮助,我们还会分享更多Unity实例教程在Unity官方中文社区(unitychina.cn),请保持关注! 教程, 小鸟

25.png(39.05 KB, 下载次数: 4)

 

165715d3q3ll7p303ufpur.png

24.png(109.8 KB, 下载次数: 1)

 

165715xan8ncpdnd9pjaic.png

23.png(117.12 KB, 下载次数: 1)

 

165716dr977m79hsee6nqk.png

22.png(116.67 KB, 下载次数: 1)

 

165716rzls202s2ko1gzzw.png

21.png(90.16 KB, 下载次数: 1)

 

165717wbahe4hdhx5u2h0d.png

20.png(193.03 KB, 下载次数: 1)

 

165717k2b0b9gwgy5zufim.png

19.png(174.86 KB, 下载次数: 1)

 

165718l354obu9zkf4f99u.png

18.png(73.71 KB, 下载次数: 1)

 

165718p4ha1hvf1he612f6.png

17.png(235.11 KB, 下载次数: 1)

 

165718ah8thbstt9ophhhf.png

16.png(189.4 KB, 下载次数: 1)

 

165719q5rgdo5s8pczezxx.png

15.png(204.93 KB, 下载次数: 1)

 

165720nakz736e63aezd4e.png

14.png(86.22 KB, 下载次数: 1)

 

165720c4bsnhsyllhr5s87.png

13.png(94.31 KB, 下载次数: 1)

 

165720rekr0kk3sjcr1rc3.png

12.png(164.69 KB, 下载次数: 1)

 

165721joul1a400xp1u14h.png

11.png(205.87 KB, 下载次数: 1)

 

165721vtindhgk00f0iv9c.png

10.png(157.71 KB, 下载次数: 1)

 

165721za6p2popftfaqqio.png

09.png(114.85 KB, 下载次数: 1)

 

165722e0cmsz0082gujhhm.png

08.png(33.46 KB, 下载次数: 1)

 

165722qx4g5x44wju15u16.png

07.png(53.05 KB, 下载次数: 1)

 

165723g9fqaiabsalt3d9x.png

06.png(111.22 KB, 下载次数: 1)

 

165723ephpn58djpht0ndd.png

05.png(94.96 KB, 下载次数: 1)

 

165724z4klx6xx7y7xjwss.png

04.png(165.96 KB, 下载次数: 1)

 

165725ko3rsouyrxo831yx.png

03.png(131.52 KB, 下载次数: 1)

 

165725ee96pv28mv098x80.png

02.png(130.42 KB, 下载次数: 1)

 

165725ba6cvfi103d2x96c.png

01.gif(212.21 KB, 下载次数: 1)

 

165726la7z7y7i7u7pvq7u.gif锐亚教育

锐亚教育 锐亚科技 unity unity教程