在开发游戏,经常会需要创建一些对象,如果对象少还可以,如果创建的对象数量很多 ,那对于对于系统的开销就很大,如果这些对象对于游戏有持续性的作用也无可厚非,但是有一些,创建过后几秒,可能就没有任何意义,比如跑步游戏中吃的金币,射击游戏中发射的子弹。
正常我们会把这些物体销毁,或者隐藏,这就会导致占用了一部分不需要的系统开销或者导致大量非活跃的对像保存在游戏场景中。
为了解决这种大量创建重复且非持续性保持作用的对象对游戏中内存造成的损耗问题,我们就一使用对象池方式来解决。
***一:创建对象池
二:回收对象到对象池中
三:从对象池中获取对象***
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class objPool{
private static objPool instanse;//单例
public objPool _instance()
{
if (instanse==null)
{
instanse = new objPool();
}
return instanse;
}
private Dictionary<string, List<GameObject>> pool;//存储对象池的名字和对应的池子
public void RecycleObj(GameObject obj) // 对象池的创建和回收
{
//判断是否有该对象的对象池
if (pool.ContainsKey(obj.name))
{
//放置到该对象池
pool[obj.name].Add(obj);
}
else
{
//创建该类型的池子,并将对象放入
pool.Add(obj.name, new List<GameObject>() { obj });
}
//设置为非激活
obj.SetActive(false);
}
public GameObject GetObj(string objName) // 从对象池中获取对象
{
GameObject result = null;
//判断是否有该名字的对象池
if (pool.ContainsKey(objName))
{
//判断该物体对象池里是否有对象
if (pool[objName].Count > 0)
{
//获取结果
result = pool[objName][0];
//激活对象
result.SetActive(true);
//从池中移除该对象
pool[objName].Remove(result);
//返回结果
return result;
}
Debug.LogError("请往该对象池先添加对象:"+objName);
return null;
}
Debug.LogError("请先创建该物体对象池:"+objName);
return null;
}
}
这个写的比较简单,实际上企业运用的上复杂些,大概就是这么一个池的思想