在游戏开发过程中,我们可能会遇到某个游戏物体会频繁创建和销毁的操作,像坦克大战中的炮弹,会涉及到炮弹的频繁创建和销毁。我们正常的处理逻辑,应该是在发射炮弹是创建一个新的炮弹对象,并进行相应初始化,炮弹炸毁后,直接调用Destroy()将炮弹对象销毁。这种处理方式可以实现功能需求,但是游戏对象的创建销毁会有一些时间的开销,对性能产生一定的影响。对于这样的问题,我们可以考虑使用对象池。
所谓对象池,就是创建一个存储游戏对象的池子,当需要创建游戏对象时,先在池子中寻找,如果池子中没有符合条件的对象,再进行创建新对象,同样,当游戏对象需要销毁时,不做真正的销毁,而是将其SetActive(false),并存入池子中。这样就避免了大量游戏对象的创建。具体实现如下:
public class ObjectPool : SingleToneMonoBehaviour<ObjectPool>
{
private readonly List<GameObject> _objPool = new List<GameObject>();
public GameObject GetGameObject()
{
if (_objPool.Count > 0)
{
lock (_objPool)
{
var obj = _objPool[1];
_objPool.RemoveAt(1);
/**
* 在这里可以加