基础概念
Bullet Storm在游戏中管理数量巨大的物体们的发射、移动,改变它们的行为方式,甚至规定它们何时销毁。这些在游戏空间中运动的物体被称为子弹(Bullet)。在您的游戏中,一般不会让子弹凭空出现,而是从某处被以一定的初速度发射出来,发射子弹的物体称作发射器(Emitter)。下面我们将围绕这两者,来介绍Bullet Storm中的所有核心概念:
Bullet System(子弹系统)
子弹系统是用于管理无数同一类型子弹的物体,就像在使用Unity制作特效时,没有人会一个个粒子单独去做,而是使用一个粒子系统来创建一类粒子。一个子弹系统定义了一类子弹,并且在这个子弹系统中来为这种子弹设置它们的模型、材质以及一些行为方式(比如会追踪某物体)。由于所有子弹都是通过子弹系统定义的,在这篇文档中也会将子弹系统简称为子弹。
Bullet Emit Param(子弹发射参数)
一颗子弹在被发射时,往往会具有一定的初速度。子弹发射时的初始状态会以一个参数进行描述,这即是子弹的发射参数。
每颗子弹都有自己的发射参数,每个发射参数由四个量组成:位置(position)、速度(velocity)、颜色(color)、大小(size)。通过设置这四个量,您从同一个子弹系统可以发射出各异样式的子弹。
- API:
BulletEmitParam
Shape(形状)
一个形状本质上是许多发射参数的集合。在弹幕游戏中,敌方boss可以一次性发射出大量的子弹,这些子弹往往排列成规则的图案,在屏幕上绘制出华丽的弹幕效果。形状是一个用于管理大量发射参数的工具。形状只与发射参数有关,而不需要指定具体的子弹,因此您可以将制作好的形状储存起来,在发射时重复使用。
- API:
Shape
Emitter(发射器)
子弹需要从游戏世界的各个地方被发射出来,仅有发射参数中定义的位置参数是不够的。发射器为发射参数提供了一个参照物,所有发射参数都是相对于发射器所在的位置而言的。发射器就是发射子弹的中心,Bullet Storm提供了多种发射器适应不同的需要,您可以在游戏中使用这些物体,也可以根据具体需要编写自己的发射器脚本。
- API:
Emitter
AutoBulletEmtter
Storm(风暴)
风暴是Bullet Storm中另一个核心概念。各式各样的发射器可以完成弹幕编辑的基本需求,但如果您想要制作更大体量的弹幕工程,比如在2D弹幕游戏《东方project》中,boss会使用名为【符卡】的弹幕群。一个【符卡】往往包含了许多种不同的子弹,它们在特定的时间和位置被发射。使用多个发射器也可以达到这样的效果,但是您将会需要自己编写脚本来安排这些发射器的发射顺序和移动方式,并且可能会使项目变得复杂而难以管理。风暴可以将这些工作放到一个文件里,通过定义好的时间序列,有条不紊地发射各种子弹。
风暴的另一个作用在于,发射器只能用于发射子弹,而子弹自身的功能是对子弹从发射到销毁的整个过程而言的,比如追踪功能一旦开启,子弹直至销毁都会追踪目标物体。子弹功能更像是子弹自身具有的特性,而风暴可以在运行过程中动态地改变子弹的行为。举个例子,您如果希望boss召唤数十支长枪,它们被召唤后在空中排成一个环等待,当圆环集满后,集体转向朝玩家发射过去,风暴可以很方便地实现您需要的功能。
- API:
StormInfo
Storm Event(风暴事件/风暴指令)
由于需要在在运行时管理子弹的状态,风暴是由一系列指令堆积而成的,这些指令被称作风暴事件。编写风暴事件就像编写脚本一样,如果您熟悉BulletML,会发现它们很相似,但风暴比BulletML更强大,对于子弹的操作要更加灵活,甚至允许进行运行时条件判断和循环等。
Storm Action(风暴行为)
风暴行为是一类特殊的风暴指令,它们管理与子弹行为相关的操作,包括发射、改变位置和速度、销毁等。风暴行为是对于特定的一类子弹而言的,在编写时通过名字来指定对应的子弹种类。