[!NOTE] 对象池
应用场合:这种做法常用于子弹这种会大量产生的对象 ,目的是减少性能的损耗
基本思路:产生的对象是有限的,并且加入到"对象池"的数组中不进行销毁,当需要使用时,再从对象池中提取对象循环利用,以达到有限的对象无限的调用的结果(这使我想到了庞加莱回归)
(这里的对象池是一种抽象的说法,它实际上在场景中一个玩家看不到的位置,只不过程序上来说这个对象在对象池的数组中)
制作思路
- 要实现子弹的对象池,需要做以下三件事
- 创建一个游戏实例(游戏实例在虚幻引擎中的生命周期是最长的,不会受到关卡的切换而受到影响)
- 创建子弹类(具体生成的实例的类,这个类为了可以复用,需要可以定制化)
- 创建对象管理器(这个类用于处理玩家蓝图中发射子弹指令并管理关卡中生成的实例,以及实例生成的规则)
- 调用关系
玩家蓝图——>对象管理器——>游戏实例&子弹类
详细制作案例
制作一个可以自定义的子弹类,玩家按鼠标右键可以朝光标位置发射,发射这个子弹时使用对象池的方式对其进行处理
1. 创建游戏实例
创建游戏实例并应用
#### 应用该游戏实例
#### 游戏实例可被调用
游戏实例需要有引入两个变量
#### 在公用函数库中编写一个游戏实例的调用函数方便后续调用
2.子弹类
创建一个枚举变量用于管理子弹类的状态
#### 创建子弹类
制作子弹类的生成函数
该函数需要可定制化制作
##### 制作子弹回收函数(被生成函数调用)
这个函数就是子弹的生命周期结束后,把子弹加入对象池并把对象移到一个看不见的地方(对玩家来说这颗子弹就相当于被销毁了)
### 3.对象管理器
创建一个蓝图类作为对象管理器
初始化函数需要获取游戏实例并设置对象管理器为当前游戏实例
#### 创建一个子弹的对象池管理函数(重点)
这个函数用于管理子弹的对象池,由玩家蓝图进行调用
- 每次对象是否处于回收的状态(可以理解为子弹是否在子弹池中)
- 每次循环结束都判断一下子弹是否有效
- 如果无效(说明场上没有子弹),就生成一个子弹并将其加入子弹池数组,设置其参数和生成位置
- 如果有效(说明场上有子弹,子弹池中有子弹),就直接设置其参数和生成位置
### 4.玩家蓝图的输入事件
1.创建发射子弹的按键映射(略)
2.创建发射函数
这个函数的功能
- 调用了对象管理器中的子弹池管理函数并设置了子弹的参数
- 获取了光标所在的位置并将位置参数传给子弹池管理函数
##### Tips
- 需要在玩家控制器中显示鼠标光标
- 对象管理器需要放置在场景中实例化才能被正确调用
- 注意场景的碰撞通道中的可视化通道是否被忽略了,因为光标的获取需要可视化的通道是是阻挡