Esempio n. 1
0
    void Awake()
    {
        // Create pool and loop over all prefabs.
        pool = new List <GameObject> [Prefabs.Length];
        for (int i = 0; i < Prefabs.Length; i++)
        {
            PooledPrefab pp = Prefabs[i];
            // If no poolable script found and prefab hasn't confirmed this fact: print an error.
            if (!pp.ConfirmedNotPoolable && pp.Prefab.GetComponent <Poolable>() == null)
            {
                Debug.LogError("Game object \"" + pp.Prefab.name + "\" isn't poolable.");
            }

            // Make sure the original object isn't active.
            pp.Prefab.SetActive(false);

            // Create a pool parent (to keep inspector clean)
            GameObject poolParent = new GameObject(pp.Prefab.name + " pool");

            pool[i] = new List <GameObject>();
            // Fill the prefab's pool with the assigned amount of instances and put in the pool parent.
            for (int j = 0; j < pp.PoolSize; j++)
            {
                GameObject go = Instantiate(pp.Prefab);
                go.transform.SetParent(poolParent.transform);
                go.name = pp.Prefab.name;
                pool[i].Add(go);
            }
        }
    }
            private PooledPrefab CreatePrefab()
            {
                GameObject   gameObject = Instantiate(_prefab, this.transform);
                PooledPrefab prefab     = gameObject.AddComponent <PooledPrefab>();

                prefab.SetParentPool(this);
                gameObject.SetActive(false);
                return(prefab);
            }
Esempio n. 3
0
 public static void DestroyChildPrefabs(Transform parent)
 {
     for (int i = 0; i < parent.childCount;)
     {
         PooledPrefab prefab = parent.GetChild(i).GetComponent <PooledPrefab>();
         if (prefab == null || !prefab._parentPool.Destroy(prefab.gameObject))
         {
             i++;
         }
     }
 }
            public static void DestroyChildPrefabs(Transform parent, bool instant = true)
            {
                for (int i = 0; i < parent.childCount; i++)
                {
                    PooledPrefab prefab = parent.GetChild(i).GetComponent <PooledPrefab>();

                    if (prefab != null)
                    {
                        prefab._parentPool.Destroy(prefab.gameObject, instant);
                    }
                }
            }
            private PooledPrefab CreatePrefab()
            {
#if DEBUG
                if (_prefab == null)
                {
                    UnityEngine.Debug.LogError("PrefabInstancePool " + GameObjectUtils.GetGameObjectPath(this.gameObject) + " is missing it's prefab!");
                    return(null);
                }
#endif
                GameObject   gameObject = Instantiate(_prefab, this.transform);
                PooledPrefab prefab     = gameObject.AddComponent <PooledPrefab>();
                prefab._parentPool = this;
                prefab._isFree     = true;
                gameObject.SetActive(false);
                return(prefab);
            }
            public GameObject Instantiate(Transform parent = null)
            {
                Init();

                GameObject newInstance = null;

                for (int i = 0; i < _instances.Length; i++)
                {
                    if (_instances[i]._isFree)
                    {
                        newInstance           = _instances[i].gameObject;
                        _instances[i]._isFree = false;
                        break;
                    }
                }

                if (newInstance == null)
                {
                    PooledPrefab[] newItems = new PooledPrefab[Mathf.Max(1, _growAmount)];
                    for (int i = 0; i < newItems.Length; i++)
                    {
                        newItems[i]         = CreatePrefab();
                        newItems[i]._isFree = true;
                    }
                    ArrayUtils.Concat(ref _instances, newItems);

                    newInstance         = newItems[0].gameObject;
                    newItems[0]._isFree = false;
                }

                if (parent != null && parent != newInstance.transform.parent)
                {
                    newInstance.transform.SetParent(parent, false);
                }

                newInstance.transform.localPosition = _prefab.transform.localPosition;
                newInstance.transform.localRotation = _prefab.transform.localRotation;
                newInstance.transform.localScale    = _prefab.transform.localScale;
                newInstance.SetActive(true);

                return(newInstance);
            }