Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    // 获取类型的对象池设定
    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);
    }
Esempio n. 3
0
    // 返回对象到对象池 (从其父节点移除,并设置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);
    }
Esempio n. 4
0
    // 根据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);
    }