《土豆荣耀》重构笔记(十五)实现角色和怪物掉入河中被销毁的功能
前言
  我们在上篇文章中已经实现随机生成更多怪物的功能,但怪物和角色死亡时,并不会被销毁。当生成的怪物增多时,这会占用大量游戏内存。为了节约内存,我们需要实现角色和怪物掉入河中就会在游戏场景中被销毁的功能。
制作浪花溅起的动画
  角色和怪物掉入河中之后,应该溅起浪花,所以我们需要先制作浪花溅起
的动画。
制作
浪花溅起
的动画的步骤:
- 同时选中
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这个仓库到本地进行查看。