实体与对象池是游戏开发中的常见概念。例如,我们可以为子弹设计实体,为玩家设计实体,甚至为爆炸效果设计实体。而对象池就是方便我们管理多个重复实体,而不必频繁创建和销毁的一种设计。
一、Entity实体
这里的实体不是指看得见摸得着的意思。任何经过实例化的对象都可以称为实体。
每一个实体,如果要播放动画效果,我们常常给它加上一个状态机。虽然有些实体(例如爆炸效果),只有一种状态,但是利用模块化的状态机可以很方便的制作动画效果。关于状态机的概念我在上节已经讲过了。
实体简单来说就是对象,但有一定的区别。我们的DataManager.Instance是DataManager类的单例对象,但它不能称为实体。实体可以动态创建,也就是说,可以通过prefab在游戏中动态生成。
上节我们讲了动态创建DynamicCreation。基本思路为,先把我们需要的资源名称存在一个枚举中,然后用一张map来维护资源名称和资源路径的映射关系。然后在游戏初始化的时候通过资源路径来把对应的prefab加载到另一张map中,和资源名称建立另一个映射关系。
那么我们如何管理创建好的实体呢?每一个实体都应该具有自己唯一的编码Id,而且也应该建立一个映射关系,让我们可以通过这个编码id找到实体。
比如我们希望给每一个子弹编码,然后建立一个map来维护所有子弹,可以编写如下代码
//DataManager.ts
bulletMap: Map<number, BulletManager> = new Map();//建立映射关系,每个子弹都由它对应的BulletManager管理
//DataManager.ts的applyInput方法中的一个分支
case InputTypeEnum.WeaponShoot: {
const { owner, position, direction } = input;
const bullet: IBullet = {
id: this.state.nextBulletId++,
owner,