《土豆荣耀》重构笔记(十四)随机生成更多的怪物
前言
  到目前为止,我们的游戏场景里面只有两个怪物。为了让游戏更有挑战,我们需要在游戏运行时每隔一段时间就随机生成一个新的怪物。接下来,我们开始实现随机生成更多怪物的功能。
制作Generator
  为了能在场景中随机生成更多的怪物,我们需要有一个Generator在场景中不断实例化我们已经做好的怪物Prefab。首先,我们在Assets\Scripts\Utility文件夹下创建一个名为Generator的C#脚本,然后编辑Generator.cs如下:
1 | |
代码说明:
  这里,我们使用MonoBehaviour提供的静态方法InvokeRepeating来实现等待一段时间后每隔一定时间重复调用某个函数的功能。如果我们只想实现等待一段时间后调用一次某个函数的功能,我们可以使用MonoBehaviour提供的静态方法Invoke来实现。
  接着,我们还需要修改Assets\Scripts\Enemy下的Wander.cs如下:
1 | |
代码说明:
  这里,我们将FacingRight的可见性变为public,且在Filp方法中,我们动态地更新FacingRight字段的值。这是为了在生成预设时,我们能动态地决定预设被实例化之后要往那边运动。
  编辑完成之后,我们删除场景中的AlienSlug和AlienShip物体,然后新建一个名为Generator的Empty GameObject。接着,我们为Generator物体创建一个名为EnemyGenerator的Empty GameObject,并将Generator.cs添加到EnemyGenerator物体上。最后,我们将Prefab Orientation设置为Random,并将Assets\Prefabs\Character下的AlienShip和AlienSlug拖拽到Prefabs的赋值框,再运行游戏,我们可以看到场景中不断有随机朝向的怪物在EnemyGenerator的位置处产生。

添加粒子特效
  此时,怪物是在场景中凭空出现,为了在随机生成怪物时增加提示,我们为EnemyGenerator增加粒子特效。首先,我们为EnemyGenerator物体添加Particle System组件。
EnemyGenerator物体的Particle System组件设置:
- Main Module:
Looping: falseStart Lifetime: 0.7Start Speed: 0Start Size(Random Between Two Constants): (0.9, 1)Start Rotation(Random Between Two Constants): (0, 360)Start Color: (173, 173, 173, 255)Scaling Mode: ShapePlay On Awake: false
- Emission:
Rate Over Time: 0Brusts:Element1: Time(0.000), Count(1), Cycles(1), Interval(0.010)
- Shape:
Shape: SphereRadius: 0.01
- Color over Lifetime:
Color(Gradient):- 左上角:Aplha(255), Location(78.8%)
- 右上角:Aplha(0), Location(100%)
- 左下角:Color(90, 90, 90), Location(0%)
- 右下角:Color(90, 90, 90), Location(100%)

- Size over Lifetime:
Size(Random Between Two Curves):- 上面是从
(0, 0.32)到(1, 1)的曲线 - 下面是从
(0, 0.25)到(1, 0.85)的曲线 - 纵坐标的最大值为
10 - 曲线的走势可以根据自己喜好调整

- 上面是从
- Render
Material:Assets\Materials下的part_starMax Particle Size: 10Sorting Layer: CharacterOrder In Layer: 5
  设置完毕之后再次运行游戏,可以看到当怪物随机生成时,会出现发光的粒子效果。至此,我们已经完成EnemyGenerator的制作。
给场景添加多个EnemyGenerator
  EnemyGenerator制作完毕之后,我们要在场景里面加入多个EnemyGenerator。我们可以直接复制现有的EnemyGenerator,但如果后面我们需要对EnemyGenerator进行修改,那么我们就需要对所有的EnemyGenerator物体修改一遍,效率低下,且容易出错。
  而前面提到,当我们修改Prefab的时候,Prefab在场景中的所有实例对象都会被修改,因此,我们选择将EnemyGenerator制作为Prefab。首先,我们在Assets\Prefabs下创建一个名为Generators的文件夹,然后将EnemyGenerator物体拖拽至Assets\Prefabs\Generators下将其制作为Prefab。接着,我们将EnemyGenerator的Prefab往场景里面拖拽两次,创建两个EnemyGenerator的Prefab实例对象。最后,我们在Generator物体下创建一个名为EnemyGenerators的Empty GameObject,将EnemyGenerator、EnemyGenerator(1)和EnemyGenerator(2)拖拽至EnemyGenerators下成为其子物体。

  当然,我们不能让怪物在场景中间生成,所以我们需要调整EnemyGenerator、EnemyGenerator(1)和EnemyGenerator(2)的位置。
它们的位置信息如下:
EnemyGenerator: Position(-15.5, 15, 0)EnemyGenerator(1): Position(0, 15, 0)EnemyGenerator(2): Position(15.5, 15, 0)
  调整完成之后,运行游戏,可以看到空中不断落下随机生成的怪物。
后言
  至此,我们已完成实现随机生成更多怪物的所有工作。本篇文章涉及到的一些数值参数,大家可以根据自己的喜好进行修改。最后,本篇文章所做的修改,可以在PotatoGloryTutorial这个仓库的essay12分支下看到,读者可以clone这个仓库到本地进行查看。