有时候需要对某一对象不停的销毁,克隆,比如怪物,子弹,特效等等。但这样反复销毁很耗内存资源。其实我们可以控制游戏对象的Active属性来模拟GameObject的销毁,生成。比如说事先就生成一怪物,将怪物的Active设为false,当要生成该怪物时,设为ture,杀死怪物时设为flase。这就是对象池技术。当然,千万别忘了重新生成时,要将所有属性重置。下面是我写的关于使用对象池做的怪物孵化器。转自蛮牛
public class BabyWalfSpawn : MonoBehaviour
{
public GameObject BabyWalfPrefab;//小狼预设
public int MaxCount = 7;//最大数量
public float ProduceSpeed = 10f;//产生速度
public float RangePos = 10;//产生范围
//
private int _Count = 0;//产生数量
public GameObject[] BayWalfs;//BayWalfs
// Use this for initialization
void Start()
{
BayWalfs = new GameObject[MaxCount];
InvokeRepeating("BirthBabyWalf", ProduceSpeed, ProduceSpeed);
}
void BirthBabyWalf()
{
for (int i = 0; i < BayWalfs.Length; i++)
{
if (BayWalfs[i] == null)
{
BayWalfs[i] = Instantiate(BabyWalfPrefab, GetRandomPositon(), Quaternion.identity) as GameObject;
BayWalfs[i].transform.parent = this.transform;
BayWalfs[i].GetComponent<WolfBaby>().WolfBabyId = i;//设置生成小狼id
break;
}
}
_Count++;
if (_Count == MaxCount)
{
CancelInvoke("BirthBabyWalf");//生成最大数量完毕,关闭生成
InvokeRepeating("UpdateBabyWalf", ProduceSpeed, ProduceSpeed);//判断是否有小狼死亡来是否生成新的小狼
}
}
private void UpdateBabyWalf()
{
for (int i = 0; i < BayWalfs.Length; i++)
{
if (!BayWalfs[i].activeInHierarchy)
{
BayWalfs[i].SetActive(true);
BayWalfs[i].transform.position = GetRandomPositon();//重新定位
break;
}
}
}
private Vector3 GetRandomPositon()
{
return new Vector3(transform.position.x + Random.Range(-RangePos, RangePos), transform.position.y, transform.position.z + Random.Range(-RangePos, RangePos));
}
public void SetBabyWalfsDie(int Walfid)//小狼脚本处理死亡时执行调用该函数,处理对应id小狼死亡
{
BayWalfs[Walfid].SetActive(false);
}
}