《土豆荣耀》重构笔记(十四)随机生成更多的怪物
前言
  到目前为止,我们的游戏场景里面只有两个怪物。为了让游戏更有挑战,我们需要在游戏运行时每隔一段时间
就随机生成一个新的怪物。接下来,我们开始实现随机生成更多怪物的功能。
制作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_star
Max 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这个仓库到本地进行查看。