Unity对象池使用

来源:互联网 发布:网络男主播 编辑:程序博客网 时间:2024/05/21 22:47

1.Unity对象池使用

对象池适用于场景中需要大量重复构造实例的时候
最直接的比如 发射的炮弹

思路构造出一个存储对象的池子 来存入或者取出池子中的对象 用的时候取出来 不用的时候放回去
此处池子中的对象就是炮弹
核心代码分析
利用一个字典结构来充当这个池子 ArrayList相当于池子中的每个小房间 Key相当于房间的名字 表示房间里边是什么东西 每个小房间用来存储的同一类的东西
private static Dictionary这里写图片描述string, ArrayList> pool = new Dictionary这里写图片描述string, ArrayList>();
按照正常思路思考 先要从对象池中取出一个炮弹,如果有炮弹 则取出 如果没有则实例化一个炮弹出来

 public Object Get(string prefabName,Vector3 positon,Quaternion rotation)    {        string key = prefabName + "(Clone)";        Object o;         //判断这个池子是否已经有这个键(存储炮弹的房间)  并且房间里边有炮弹        if (pool.ContainsKey(key) && pool[key].Count > 0)        {            ArrayList list = pool[key];            o = list[0] as Object;            list.RemoveAt(0);            //重新初始化相关状态  开始干活            (o as GameObject).SetActive(true);            (o as GameObject).transform.position=positon;            (o as GameObject).transform.rotation=rotation;        }        //没有存储炮弹的房间  实例化出一个新的炮弹        else        {            o = Instantiate(Resources.Load(prefabName), positon, rotation);        }        DelayDestory dd = (o as GameObject).GetComponent<DelayDestory>();        dd.Init();//开启携程 两秒后销毁 回到房间        return o;    }
    //放进去炮弹 (什么时机放进去呢 不用的时候就放进去就是你要销毁的时候)  public Object Return(GameObject o)    {        string key = o.name;        print("return:"+key);        //判断这个池子是否已经有这个键(存储炮弹的房间名字)        if (pool.ContainsKey(key))        {            //已经有炮弹房间            ArrayList list = pool[key];             //添加一个新的            list.Add(o);        }        else        {        //如果不存在炮弹房间 先开房 开房当然有第一个客人 o            pool[key] = new ArrayList() { o };        }         //回房间休息状态        o.SetActive(false);        return o;    }
//对象的延迟销毁脚本public class DelayDestory : MonoBehaviour {    // Use this for initialization    void Start () {        //Destroy(this.gameObject,2f);    }    public void Init()    {        StartCoroutine(ReturnToPool());    }    IEnumerator ReturnToPool()    {        yield return new WaitForSeconds(2f);        ObjectPool.insatance.Return(this.gameObject);    }}

完整Unity工程:链接: https://pan.baidu.com/s/1pLBSl7P 密码: ttjc

原创粉丝点击