对象池的几种写法
(1)全局中,这种对象只有一种,使用前只需要配置好一个这种对象。使用时,会根据这个对象模板智能创建。
//本身作为对象存在
//单例 与 自身集合 设置
public static UITxfly Instance;
public static List<UITxfly> List = new List<UITxfly>();
private void Awake()
{
//除了唯一的一个单例,其他的都添加到对象池中
if (Instance == null) Instance = this;
else List.Add(this);
}
//获得一个空闲UITxfly
private UITxfly OnGet()
{
UITxfly fx = null;
//选择一个闲置的特效预制体
if (List.Count > 0)
for (int i = 0; i < List.Count; i++)
if (List[i].gameObject.activeSelf == false)
fx = List[i];
//如果没有闲置的特效预制体
if (fx == null)
fx = Instantiate(Instance, Instance.transform.parent.transform);
fx.gameObject.SetActive(true);
return fx;
}
(2)每个怪物都需要一个血条,场景中那么多怪物,那么这么多血条应该如果创建,赋值。此时,只需要一个血条模板足矣,怪物脚本中定义一个属于自己的血条,使用时,先检查自己的血条是否拥有(NULL),如果没有,那么根据那个通用的血条模板给自己创建一个即可。
//使用血条时,要先检查自己的血条是否可用
//如果不可用,根据传递过来的模板,给自己创建一个
public Text txhp_prefab;
private Text txhp_temp;
private Text txhp
{
get
{
if (txhp_temp == null)
txhp_temp = Instantiate(txhp_prefab, txhp_prefab.transform.parent);
return txhp_temp;
}
}
(3)坦克大战中,坦克发射的炮弹可以进入对象池,因为需要使用的子弹足够多,但是有这样一种情况,每个坦克发射的炮弹种类是不一样的,所以不能仅仅设置一个对象池,此时应该每一个坦克拥有一个对象池。假如功能增加了,每个坦克可以发射多种子弹,那么有几种子弹就需要设置几个对象池了。
//获取一个子弹
public S_Bullet prefabBullet; //子弹的预制体
private Transform bulletParent; //子弹集合的父物体
public List<S_Bullet> bulletList; //子弹集合(对象池)
//获取一个子弹
public S_Bullet Get()
{
if (bulletList == null) bulletList = new List<S_Bullet>();
S_Bullet bullet = null;
//在集合中寻找一个空闲的子弹
for (int i = 0; i < bulletList.Count; i++)
if (bulletList[i].gameObject.activeSelf == false)
bullet = bulletList[i];
//没有空闲的子弹
if (bullet == null)
{
if (bulletParent == null)
bulletParent = new GameObject("BulletList").GetComponent<Transform>();
//创建一个新子弹
bullet = Instantiate(prefabBullet, bulletParent).GetComponent<S_Bullet>();
bulletList.Add(bullet);
}
bullet.gameObject.SetActive(true);
return bullet;
}