《土豆荣耀》重构笔记(十五)实现角色和怪物掉入河中被销毁的功能
前言
  我们在上篇文章中已经实现随机生成更多怪物的功能,但怪物和角色死亡时,并不会被销毁。当生成的怪物增多时,这会占用大量游戏内存。为了节约内存,我们需要实现角色和怪物掉入河中就会在游戏场景中被销毁的功能。
制作浪花溅起的动画
  角色和怪物掉入河中之后,应该溅起浪花,所以我们需要先制作浪花溅起的动画。
制作
浪花溅起的动画的步骤:
- 同时选中
Assets\Sprites\FX下splash切割出来的所有图片,然后将他们拖拽到Hierarchy窗口 - 将新创建的动画保存至
Assets\Animation\Environment,并将其命名为SplashingSpray.anim - 将
Assets\Animation\Environment文件夹下的splash_0.controller重命名为Splash.controller,并将其移至Assets\Animator\Environment文件夹 - 将场景中的
splash_0物体重命名为Splash,并为其添加Assets\Scripts\Utility文件夹下的Destroyer.cs - 打开
Animation Editor,选中Hierarchy窗口中的Splash物体,然后在最后一帧处添加一个Animation Event,选择调用的函数为DestroyGameObject - 将
Splash物体上Sprite Renderer组件的Sorting Layer设置为Foreground - 为
Splash物体添加一个AudioSource组件,然后设置AudioClip为Assets\Audio\FX下的waterSplash - 在
Assets\Prefabs文件夹下新建一个名为Environment的文件夹,然后将Splash物体拖拽至Assets\Prefabs\Environment下,将其做成Prefab - 删除场景中的
Splash物体
  至此,我们浪花溅起的动画就制作好了。

制作RiverTrigger
  接下来,我们开始实现角色和怪物掉入河中被销毁,并溅起浪花的功能。首先,我们创建一个名为RiverTrigger的Empty GameObject。接着,我们在Assets\Scripts\Utility下创建一个名为Remover的C#脚本,并编辑Remover.cs如下:
1 | |
  编辑完Remover.cs之后,我们将Remover.cs添加到RiverTrigger物体上,可以看到Unity自动帮我们添加了一个BoxCollider2D组件。
RiverTrigger的组件设置如下:
Transform:Position: (0, -19.6, 0)
Remover.cs:Splash Prefab:Assets\Prefabs\Environment下Splash物体的Prefab
BoxCollider2D:Is Trigger: trueSize: (100, 10)
  设置完成之后,保存场景,运行游戏,可以看到此时怪物掉进河中会从场景中被销毁,且会产生浪花溅起的动画,并播放浪花溅起的音效。

一些小调整
  此时,我们发现摄像机位置太靠上,只能看到河流的一小部分,基本看不到怪物和角色掉入河中时产生的浪花。我们需要增大摄像机的可移动范围,其调整的步骤如下:
增大摄像机的可移动范围的步骤:
- 选中场景中的
SceneBounds物体 - 修改其
BoxCollider2D组件的Offset为(0, -2.5) - 修改其
BoxCollider2D组件的Size为(48, 32)
  此外,在游戏运行的过程中,我们发现当AlienSlug和AlieShip重合或者AlienSlug和AlienSlug重合时,会出现AlienSlug的眼球被AlienSlug遮挡的问题,我们需要调整AlieShip的子物体char_enemy_alienShip上Sprite Renderer组件的Order In Layer组件属性设置为2。
  最后,因为导弹在爆炸时,爆炸的特效被建筑物遮挡了,我们需要将Assets\Prefabs\Weapons下MissileExplosion的Prefab上Sprite Renderer组件的Sorting Layer设置为Weapons。
后言
  调整好之后,运行游戏,可以看到此时问题都被修复了。至此,我们已经完成了实现角色和怪物掉入河中被销毁的功能。最后,本篇文章所做的修改,可以在PotatoGloryTutorial这个仓库的essay13分支下看到,读者可以clone这个仓库到本地进行查看。