淘先锋技术网

首页 1 2 3 4 5 6 7

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 > )
        {
            ArrayList list = pool[key];
            o = list[] as Object;
            list.RemoveAt();

            //重新初始化相关状态  开始干活
            (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(f);
        ObjectPool.insatance.Return(this.gameObject);
    }
}

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