下面是一个简单的对象池脚本
可以直接复制使用
对象池
- 对象池:从字面理解就是一池子的物体,在我们需要使用的时候就拿出来一个,然后包装成我想用的样子。用完之后清空放回到池子里。
为什么要有对象池
- 因为有系统通常会有需要频繁出现然后消失的物体,如果我们频繁使用 Instantiate 和 Destroy 来生成后销毁,那么会占用大量的系统内存,甚至导致系统崩溃。
- 所以我们可以利用对象池的设计模式概念,在游戏的一开始就制作若干个数量的物体,将他们设置 SetActive(false) 当我们需要它们的时候,只要把它们设置成 SetActive(true) 就好了,用完了再次设置为false。以此方法来循环使用,以达到优化系统的作用。
using System.Collections.Generic;
using UnityEngine;
public class ShadowPool : MonoBehaviour
{
public static ShadowPool Instance;
public GameObject shadowPrefab; //预制体
public int shadowCount; //默认生成数量
private Queue<GameObject> availableObjects = new Queue<GameObject>(); //队列
private void Awake()
{
Instance = this;
//初始化对象池
FillPool();
}
public void FillPool()
{
for (int i = 0; i < shadowCount; i++)
{
//初始化并设置父物体
var newShadow = Instantiate(shadowPrefab, transform);
//取消启用返回对象池
ReturnPool(newShadow);
}
}
public void ReturnPool(GameObject gameObject)
{
gameObject.SetActive(false);
availableObjects.Enqueue(gameObject);
}
/// <summary>
/// 在对象池拿去物体
/// </summary>
/// <returns></returns>
public GameObject GetFormPool()
{
if (availableObjects.Count == 0) //如果对象池物体不够再次创建相同数量的物体
{
FillPool();
}
var outShadow = availableObjects.Dequeue();
outShadow.SetActive(true);
return outShadow;
}
}
为什么使用队列(Queue)
- 因为(Queue)是一个先进先出的对象集合