Esempio n. 1
0
        /// <summary>
        /// 以游戏物体或预设为模板,从对象池中获取闲置对象
        /// </summary>
        public GameObject FromPool(int poolName, ref GameObject template, OnGameObjectPoolItem onInit = null, bool visible = true)
        {
            GameObject result = null;
            bool       flag   = CheckPoolResult(poolName, ref mPool, ref result);

            if (result == null)
            {
                result = Object.Instantiate(template);
            }
            else
            {
                if (flag && (PoolContainer != null))
                {
                    PoolContainer.Get(result);
                }
                else
                {
                }
            }

            result.SetActive(visible);
            onInit?.Invoke(result);

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// 以脚本类型为模板,从对象池中获取闲置对象
        /// </summary>
        public T FromComponentPool <T>(int poolName, ref T template, OnComponentPoolItem <T> onInit = null, bool visible = true) where T : Component
        {
            Tester.Instance.Log(TesterBaseApp.Instance, TesterBaseApp.LOG, template == null, "error: template is null, the type is ".Append(typeof(T).ToString()));

            Component tempResult = null;
            bool      flag       = CheckPoolResult(poolName, ref mCompPool, ref tempResult);

            if (tempResult == null)
            {
                tempResult = Object.Instantiate(template);
            }
            else
            {
                if (flag && (PoolContainer != null))
                {
                    PoolContainer.Get(tempResult.gameObject);
                }
            }

            T result = (T)tempResult;

            result.gameObject.SetActive(visible);
            onInit?.Invoke(result);

            return(result);
        }
Esempio n. 3
0
 void PoolContainerDestroyed(PoolContainer poolContainer)
 {
     if (ParentPoolContainer == null || poolContainer == ParentPoolContainer)
     {
         DestroyImmediate(gameObject);
     }
 }
Esempio n. 4
0
        private void Initialize()
        {
            if (_initialized)
            {
                return;
            }

            _initialized = true;

            if (_tempContainer == null)
            {
                _tempContainer = new GameObject(TEMP_CONTAINER_NAME).AddComponent <PoolContainer>();
            }

            _tempContainer.RegisterOnDestroy(SceneTransitioning);

            if (_persistedContainer == null)
            {
                _persistedContainer = new GameObject(PERSISTED_CONTAINER_NAME).AddComponent <PoolContainer>();
                _persistedContainer.SetAsPersisted();
            }

            if (persistAcrossScenes)
            {
                _persistedContainer.RegisterOnLevelWasLoaded(Reregister);
            }
        }
Esempio n. 5
0
 public static void Main(string[] args)
 {
     using (PoolContainer<IComplexContruct> poolContainer = new PoolContainer<IComplexContruct>(PoolSize, VideoFactory))
     {
         int concurrentThreads = 3;
         int remaining = concurrentThreads;
         List<Task> taskList = new List<Task>();
         for (int index = 0; index < concurrentThreads; index++)
         {
             int threadIndex = index;
             taskList.Add(Task.Factory.StartNew(() =>
             {
                 Thread.CurrentThread.Name = string.Format("Thread No: {0}", threadIndex);
                 for (int j = 0; j < 2; j++)
                 {
                     using (IComplexContruct complexConstruct = poolContainer.Acquire())
                     {
                         using (IComplexContruct complexConstructNew = poolContainer.Acquire())
                         {
                             complexConstruct.Test();
                             complexConstructNew.Test();
                         }
                     }
                 }
             }));
         }
         Task.WaitAll(taskList.ToArray());
         Console.WriteLine("Multi-Threaded pooling test finished!\n");
     }
     Console.ReadLine();
 }
 public GamePool()
 {
     Bullet     = PoolContainer.CreatePool <PoolObject>(StaticPrm.PoolPath.PATH_BULLET);
     TankGreen  = PoolContainer.CreatePool <PoolObject>(StaticPrm.PoolPath.PATH_TANK_GREEN);
     TankRed    = PoolContainer.CreatePool <PoolObject>(StaticPrm.PoolPath.PATH_TANK_RED);
     TankPurple = PoolContainer.CreatePool <PoolObject>(StaticPrm.PoolPath.PATH_TANK_PURPLE);
 }
Esempio n. 7
0
    public void Reward(PoolContainer pooler, Vector3 spawnPosition)
    {
        PoolObject po = pooler.SpawnTargetObject(reward.thisPoolObject, 2);

        po.transform.position = spawnPosition;
        rewarded = true;
        questUpdateEvent.Raise();
    }
Esempio n. 8
0
        private void Reregister()
        {
            if (_tempContainer == null)
            {
                _tempContainer = new GameObject(TEMP_CONTAINER_NAME).AddComponent <PoolContainer>();
            }

            _tempContainer.RegisterOnDestroy(SceneTransitioning);
        }
Esempio n. 9
0
 public void Initialize()
 {
     _player         = _playerFilter.Components1[0];
     _map            = _world.CreateEntityWith <MapComponent>();
     _map.LastCoords = new CubeCoords(0, 0);
     _map.PoolB      = PoolContainer.CreatePool(Utils.BackPrefabPath);
     _map.PoolF      = PoolContainer.CreatePool(Utils.ForePrefabPath);
     MapGenRandomNeighbours.GenerateMap(out _map.MapB, out _map.MapF, MapSize, MapSeed);
     RenderFull(new CubeCoords(0, 0), Fow);
 }
Esempio n. 10
0
 public void Destroy()
 {
     _poolContainers = null;
     _zombiePool     = null;
     _coinsPool      = null;
     _path.Clear();
     _path = null;
     _alreadyEnergy.Clear();
     _alreadyEnergy = null;
     _alreadyCoins.Clear();
     _alreadyCoins         = null;
     m_AllLevels           = null;
     m_EasyLevelsPrefabs   = null;
     m_NormalLevelsPrefabs = null;
     m_HardLevelsPrefabs   = null;
 }
Esempio n. 11
0
    public T GetClone <T>(T prefab) where T : Component
    {
        if (_pool.ContainsKey(prefab))
        {
            var tempList = _pool[prefab];

            foreach (var item in tempList)
            {
                if (!item)
                {
                    continue;
                }
                if (!item.gameObject.activeSelf)
                {
                    item.gameObject.SetActive(true);
                    item.transform.parent = null;
                    return(item as T);
                }
            }

            var tempInstance = MonoBehaviour.Instantiate(prefab) as T;
            tempList.Add(tempInstance);
            return(tempInstance);
        }
        else
        {
            if (!_poolContainer)
            {
                var temp = new GameObject("PoolWrapper");
                _poolContainer = temp.AddComponent <PoolContainer>();
                if (_poolContainer)
                {
                    _poolContainer.OnDestroyWrapper  += PoolContainerOnDestroy;
                    _poolContainer.transform.position = Vector3.zero;
                    _poolContainer.gameObject.SetActive(false);
                }
            }

            var component = prefab as Component;
            _pool.Add(component, new List <Component>());

            return(GetClone <T>(prefab));
        }
    }
Esempio n. 12
0
        public void ToPool(int poolName, GameObject target, OnGameObjectPoolItem onRevert = null, bool visible = false)
        {
            if (target == null || mIsDispose)
            {
                return;
            }
            else
            {
            }

            onRevert?.Invoke(target);

            if (mPool.IsContainsKey(poolName))
            {
                int elmMax = (mPoolElmMax.IsContainsKey(poolName)) ? mPoolElmMax[poolName] : int.MaxValue;
                Stack <GameObject> pool = mPool[poolName];
                if (pool.Count < elmMax)
                {
                    pool.Push(target);

                    if (PoolContainer != default)
                    {
                        PoolContainer.Collect(target, visible);
                    }
                    else
                    {
                        target.SetActive(visible);
                    }
                }
                else
                {
                    Debug.Log(target);
                    Object.DestroyImmediate(target);
                }
            }
            else
            {
                Stack <GameObject> pool = new Stack <GameObject>();
                mPool[poolName] = pool;

                ToPool(poolName, target, onRevert);
            }
        }
Esempio n. 13
0
    public GameObject getPoolObject(GameObjectType type_obj)
    {
        GameObject result = null;

        if (!poolObjects.ContainsKey(type_obj))
        {
            poolObjects[type_obj] = new PoolContainer();
        }
        else
        {
            result = poolObjects[type_obj].getEmptyObject();
        }
        if (result == null)
        {
            result = InstanceObject(type_obj);
        }

        return(result);
    }
Esempio n. 14
0
        public void ToPool <T>(int poolName, T target, OnComponentPoolItem <T> onRevert = null, bool visible = false) where T : Component
        {
            if (target == null || mIsDispose)
            {
                return;
            }
            else
            {
            }

            onRevert?.Invoke(target);

            if (mCompPool.IsContainsKey(poolName))
            {
                int elmMax             = mCompPoolElmMax.IsContainsKey(poolName) ? mCompPoolElmMax[poolName] : int.MaxValue;
                Stack <Component> pool = mCompPool[poolName];
                if (pool.Count < elmMax)
                {
                    pool.Push(target);

                    if (PoolContainer != null)
                    {
                        PoolContainer.Collect(target.gameObject, visible);
                    }
                    else
                    {
                        target.gameObject.SetActive(visible);
                    }
                }
                else
                {
                    Object.DestroyImmediate(target.gameObject);
                }
            }
            else
            {
                Stack <Component> pool = new Stack <Component>();
                mCompPool[poolName] = pool;

                ToPool(poolName, target, onRevert);
            }
        }
 public void InstantiatePoolItem()
 {
     foreach (PoolContainer container in containerList)
     {
         if (container != null)
         {
             PoolContainer poolContainer = Instantiate(container) as PoolContainer;
             ObjectPoolManager.Instance.poolContainedList.Add(poolContainer);
             ObjectPoolManager.Instance.SetObjectPool(
                 poolContainer.PoolList,
                 poolContainer.poolSize,
                 poolContainer.itemPrefab,
                 this.transform);
         }
         else
         {
             Debug.LogWarning("containerPrefab missing : " + container);
         }
     }
 }
Esempio n. 16
0
 public void GetInstanceFromContainer(GetInstanceFromPoolEvent e, Node any, [JoinAll] Optional <MapWithContainer> map)
 {
     if (!map.IsPresent())
     {
         e.Instance = Object.Instantiate <GameObject>(e.Prefab).transform;
         if (e.AutoRecycleTime > 0f)
         {
             Object.Destroy(e.Instance.gameObject, e.AutoRecycleTime);
         }
     }
     else
     {
         PoolContainer container;
         MainPoolContainerComponent mainPoolContainer = map.Get().mainPoolContainer;
         if (!mainPoolContainer.PrefabToPoolDict.TryGetValue(e.Prefab, out container))
         {
             Transform transform = new GameObject(e.Prefab.name + "_PoolContainer").transform;
             transform.SetParent(mainPoolContainer.MainContainerTransform);
             PoolContainer container2 = transform.gameObject.AddComponent <PoolContainer>();
             container2.ItemsRoot    = transform;
             container2.CustomPrefab = e.Prefab;
             container = container2;
             mainPoolContainer.PrefabToPoolDict.Add(e.Prefab, container2);
         }
         Transform poolTransform = container.Get().PoolTransform;
         e.Instance = poolTransform;
         if (e.AutoRecycleTime > 0f)
         {
             RecycleAfterTime component = poolTransform.gameObject.GetComponent <RecycleAfterTime>();
             if (component)
             {
                 component.Timeout = e.AutoRecycleTime;
             }
             else
             {
                 poolTransform.gameObject.AddComponent <RecycleAfterTime>().Timeout = e.AutoRecycleTime;
             }
         }
     }
 }
Esempio n. 17
0
        private void InitPoolAndSpawnFirst()
        {
            var parent = GameObject.FindGameObjectWithTag(Tag.FieldPool).transform;

            //create zombie pool
            _zombiePool = PoolContainer.CreatePool(ZombiePrefabs[0], parent);

            //create coin pool
            _coinsPool = PoolContainer.CreatePool(CoinPrefab, parent);

            //create fields pool
            _poolContainers = new PoolContainer[m_EasyLevelsPrefabs.Count
                                                + m_NormalLevelsPrefabs.Count
                                                + m_HardLevelsPrefabs.Count];
            m_AllLevels = new List <GameObject>();
            m_AllLevels.AddRange(m_EasyLevelsPrefabs);
            m_AllLevels.AddRange(m_NormalLevelsPrefabs);
            m_AllLevels.AddRange(m_HardLevelsPrefabs);
            for (int i = 0; i < _poolContainers.Length; i++)
            {
                _poolContainers[i] = PoolContainer.CreatePool(new List <GameObject>(m_AllLevels)[i], parent);
            }

            // spawn zombies for default level
            SpawnZombie(0, m_DefaultLevelTransform);

            //init ground size
            //            _groundSize = firstObject.PoolTransform.FindRecursiveByTag(Tag.Ground).localScale.y;
            _groundSize = 30f;

            // add any level, it won't be generated, because level0 is already presented
            _path.Add(new Field(0));

            // -1 and 0 fields are already on scene so spawn some more fields forward
            for (int i = 0; i < ForwardSpawnCount; i++)
            {
                PopOrSpawnById(i + 1);
            }
        }
    public GameObject GetItemFromPool(string poolName)
    {
        PoolContainer poolContainer = poolContainers.Find((x) => { return(x.IsPoolOf(poolName)); });

        return(poolContainer.GetItemFromPool());
    }
Esempio n. 19
0
 public PoolsObject()
 {
     Bullets = PoolContainer.CreatePool <PoolObjectExt>(pathBullet);
     Mobs    = PoolContainer.CreatePool <PoolObjectExt>(pathMob);
 }
Esempio n. 20
0
 /// <summary>
 /// Video factory.
 /// </summary>
 /// <param name="poolContainer">The pool container.</param>
 /// <returns></returns>
 public static IComplexContruct VideoFactory(PoolContainer<IComplexContruct> poolContainer)
 {
     return new PooledConstruct<VideoFrame>(poolContainer, new VideoFrame());
 }
Esempio n. 21
0
 public void SetPool(PoolContainer pool)
 {
     Pool = pool;
 }
 public PoolsObject()
 {
     Blocks = PoolContainer.CreatePool <PoolObject>(pathBlock);
     Booms  = PoolContainer.CreatePool <PoolObjectBoom>(pathBoom);
 }
    public void ReturnItemToPool(PoolItem poolItem)
    {
        PoolContainer poolContainer = poolContainers.Find((x) => { return(x.IsPoolOf(poolItem.PoolName)); });

        poolContainer.ReturnItemToPool(poolItem);
    }
Esempio n. 24
0
 public PoolsObject()
 {
     Enemies = PoolContainer.CreatePool <PoolObjectExt>(pathEnemy);
 }