private PoolObjectSetting addPoolObjectSetting(GameObject objType) { if (_dynamicPool == null) { _dynamicPool = new GameObject("DynamicPool"); _dynamicPool.transform.parent = transform; _dynamicPool.transform.localPosition = Vector3.zero; } var templateObject = Instantiate(objType); templateObject.name = objType.name; templateObject.SetActive(false); templateObject.transform.parent = _dynamicPool.transform; PoolObjectSetting setting = new PoolObjectSetting(); setting.Prefab = templateObject; setting.MaxSize = 0; setting.InitSize = 0; // _dynamicPoolSettings.Add (setting); _poolSettings.Add(objType.name, setting); return(setting); }
// 获取类型的对象池设定 private PoolObjectSetting getPoolObjectSettingByName(string name) { PoolObjectSetting setting = null; // if(PoolSettings!=null && PoolSettings.Length>0) // { // foreach(var ps in PoolSettings) // { // if(ps.Prefab.name == name) // { // setting = ps; // break; // } // } // } // // if(setting==null) // { // foreach(var ps in _dynamicPoolSettings) // { // if(ps.Prefab.name == name) // { // setting = ps; // break; // } // } // } _poolSettings.TryGetValue(name, out setting); return(setting); }
// 返回对象到对象池 (从其父节点移除,并设置active为false) // 若该对象没有配置对象池或者超出配额,则直接删除 public bool ReturnToPool(GameObject obj) { if (obj == null) { return(false); } obj.SetActive(false); // Instantiate 产生的对象,名字自带 (clone) 后缀 PoolObjectSetting setting = getPoolObjectSettingByName(obj.name); if (setting == null) { Destroy(obj); return(false); } bool pooled = false; string poolKey = obj.name; LinkedList <GameObject> objList = getObjectList(poolKey); Debug.AssertFormat(objList != null, "!![ObjectPool] null object list for type: {0}", poolKey); if (_currentSize < MaxSize && (setting.MaxSize <= 0 || objList.Count < setting.MaxSize)) { obj.transform.parent = gameObject.transform; obj.SetActive(false); // #if UNITY_EDITOR // // 编辑器测试时,检测是否有重复 // bool exist = objList.Find(obj)!=null; // Debug.AssertFormat(!exist, "!![Object: {0}] already exist in pool", obj.name); // if(exist) // { // Debug.Log("ERROR"); // exist = false; // } // #endif objList.AddLast(obj); pooled = true; _currentSize++; } else { Destroy(obj); pooled = false; } return(pooled); }
// 根据Prefab类型获取对应的对象 // 如果该对象有对象池设定,则从对象池中获取 // 否则,直接创建一个新对象 public GameObject GetPooledObject(GameObject objType, bool addToPool) { PoolObjectSetting setting = getPoolObjectSettingByName(objType.name); if (setting == null) { if (!addToPool) { return(Instantiate(objType) as GameObject); } else { // 动态添加该类型到对象池 setting = addPoolObjectSetting(objType); } } string poolKey = objType.name; GameObject obj = null; LinkedList <GameObject> objList = getObjectList(poolKey); Debug.AssertFormat(objList != null, "!![ObjectPool] null object list for type: {0}", poolKey); if (objList.Count > 0) { do { obj = objList.Last.Value; objList.RemoveLast(); _currentSize--; Debug.AssertFormat(obj != null, "!![ObjectPool] null object in pool, type: {0}", poolKey); if (obj == null) { Debug.LogError("Null Object in Pool: " + poolKey); } if (objList.Count <= 0) { break; } } while(obj == null); } if (obj != null) { // 先激活再修改状态,否则Animator无法使用 obj.SetActive(true); // Detaches the transform from its parent. obj.transform.parent = null; } else { obj = Instantiate(objType) as GameObject; obj.name = objType.name; // 去除 clone 后缀 } return(obj); }