1.对象池的作用
使用完不直接删除物体,而是将其放回池子里,需要用的时候再取出来。 对象池模式的出现主要优化两点:
1、防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)
2、对象初始化成本较高
比如游戏中的子弹 怪物 等
2.对象池的简单实现
首先创建一个脚本
public class Object : MonoBehaviour
{
public GameObject Ball;//对象
private List<GameObject> Objects;
private int initpoolsize = 10;//初始化池子大小
private bool isAuto ;//是否自动生成
public static Object Instance;//单例模式
private void Start()
{
Instance = this;
Objects = new List<GameObject>();//赋值
for(int i = 0; i < initpoolsize; i++)
{
GameObject Obj = Instantiate(Ball);
Obj.transform.parent = transform;//设置挂载脚本物体为生成子物体的父物体
Obj.SetActive(false);//不显示
Objects.Add(Obj);//为池子添加对象
}
}
public GameObject GetGameObject()
{
for(int i = 0; i < initpoolsize; i++)
{
//当这个对象不是出于激活状态的时候
if (!Objects[i].activeSelf)
{
Objects[i].SetActive(true);//显示
return Objects[i];
}
}
if (isAuto)
{
GameObject obj = Instantiate(Ball);
Objects .Add(obj);//添加到池中
return obj;
}
return null;
}
}
有些比较难懂的注释大致标明了
然后就是我们给产生的对象写一个很简单很简单的脚本
为了运行观察效果的时候更能容易观察
public class Ball : MonoBehaviour
{
private float timer = 0;
private void OnEnable()//在该物体产生的时候
{
//设置初始位置 否则该物体会出现在上次物体运动的位置
transform.position = Vector3.zero;
timer = 0;
}
private void Update()
{
transform.Translate(Vector3.forward * Time.deltaTime * 20);
//向前运动
if (timer >= 2)
{
timer = 0;
gameObject.SetActive(false);
}
else
{
timer += Time.deltaTime;
}
}
}
然后在给摄像机添加一句
if (Input.GetMouseButtonDown(0))
{
Object .Instance.GetGameObject();//利用单例模式实现
}
然后在unity中床加一个空物体 挂上第一个(Object)脚本
然后创建一个预制体 挂上Ball脚本
在给摄像机挂上最后一句代码
即可实现最简单对象池
效果图
如果你手速比较快的话 我们可以改变池子的大小即可产生多个Sphere