对象池在怪物孵化器中的应用

来源:互联网 发布:触摸屏软件开发公司 编辑:程序博客网 时间:2024/06/10 12:31

有时候需要对某一对象不停的销毁,克隆,比如怪物,子弹,特效等等。但这样反复销毁很耗内存资源。其实我们可以控制游戏对象的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);    }}