前言

  我们在上篇文章中已经实现随机生成更多怪物的功能,但怪物和角色死亡时,并不会被销毁。当生成的怪物增多时,这会占用大量游戏内存。为了节约内存,我们需要实现角色和怪物掉入河中就会在游戏场景中被销毁的功能。


制作浪花溅起的动画

  角色和怪物掉入河中之后,应该溅起浪花,所以我们需要先制作浪花溅起的动画。

制作浪花溅起的动画的步骤:

  1. 同时选中Assets\Sprites\FXsplash切割出来的所有图片,然后将他们拖拽到Hierarchy窗口
  2. 将新创建的动画保存至Assets\Animation\Environment,并将其命名为SplashingSpray.anim
  3. Assets\Animation\Environment文件夹下的splash_0.controller重命名为Splash.controller,并将其移至Assets\Animator\Environment文件夹
  4. 将场景中的splash_0物体重命名为Splash,并为其添加Assets\Scripts\Utility文件夹下的Destroyer.cs
  5. 打开Animation Editor,选中Hierarchy窗口中的Splash物体,然后在最后一帧处添加一个Animation Event,选择调用的函数为DestroyGameObject
  6. Splash物体上Sprite Renderer组件的Sorting Layer设置为Foreground
  7. Splash物体添加一个AudioSource组件,然后设置AudioClipAssets\Audio\FX下的waterSplash
  8. Assets\Prefabs文件夹下新建一个名为Environment的文件夹,然后将Splash物体拖拽至Assets\Prefabs\Environment下,将其做成Prefab
  9. 删除场景中的Splash物体

  至此,我们浪花溅起的动画就制作好了。

Splash的组件
Splash的组件

制作RiverTrigger

  接下来,我们开始实现角色和怪物掉入河中被销毁,并溅起浪花的功能。首先,我们创建一个名为RiverTriggerEmpty GameObject。接着,我们在Assets\Scripts\Utility下创建一个名为Remover的C#脚本,并编辑Remover.cs如下:

Remover.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(BoxCollider2D))]
public class Remover : MonoBehaviour {
[Tooltip("浪花预设")]
public GameObject SplashPrefab;

private BoxCollider2D m_Trigger;

private void Awake() {
// 获取引用
m_Trigger = GetComponent<BoxCollider2D>();
// 确保已经被设置为Trigger
m_Trigger.isTrigger = true;
}

private void OnTriggerEnter2D(Collider2D collision) {
// 实例化水花对象,水花对象会自动播放声音和动画
Instantiate(SplashPrefab, collision.transform.position, transform.rotation);
// 销毁掉下去的物体
Destroy(collision.gameObject);
}
}

  编辑完Remover.cs之后,我们将Remover.cs添加到RiverTrigger物体上,可以看到Unity自动帮我们添加了一个BoxCollider2D组件。

RiverTrigger的组件设置如下:

  • Transform:
    • Position: (0, -19.6, 0)
  • Remover.cs:
    • Splash Prefab: Assets\Prefabs\EnvironmentSplash物体的Prefab
  • BoxCollider2D:
    • Is Trigger: true
    • Size: (100, 10)

  设置完成之后,保存场景,运行游戏,可以看到此时怪物掉进河中会从场景中被销毁,且会产生浪花溅起的动画,并播放浪花溅起的音效。

RiverTrigger的组件
RiverTrigger的组件

一些小调整

  此时,我们发现摄像机位置太靠上,只能看到河流的一小部分,基本看不到怪物和角色掉入河中时产生的浪花。我们需要增大摄像机的可移动范围,其调整的步骤如下:

增大摄像机的可移动范围的步骤:

  1. 选中场景中的SceneBounds物体
  2. 修改其BoxCollider2D组件的Offset(0, -2.5)
  3. 修改其BoxCollider2D组件的Size(48, 32)

  此外,在游戏运行的过程中,我们发现当AlienSlugAlieShip重合或者AlienSlugAlienSlug重合时,会出现AlienSlug的眼球被AlienSlug遮挡的问题,我们需要调整AlieShip的子物体char_enemy_alienShipSprite Renderer组件的Order In Layer组件属性设置为2

  最后,因为导弹在爆炸时,爆炸的特效被建筑物遮挡了,我们需要将Assets\Prefabs\WeaponsMissileExplosion的Prefab上Sprite Renderer组件的Sorting Layer设置为Weapons


后言

  调整好之后,运行游戏,可以看到此时问题都被修复了。至此,我们已经完成了实现角色和怪物掉入河中被销毁的功能。最后,本篇文章所做的修改,可以在PotatoGloryTutorial这个仓库的essay13分支下看到,读者可以clone这个仓库到本地进行查看。