Пример #1
0
    public bool RegisterPooledObject(string poolId, int count, Action <bool> OnRegisterComplete = null)
    {
        PooledObjectEntry entry;

        if (_objectPool.TryGetValue(poolId, out entry))
        {
            return(true);
        }
        GameObject storedPrefab = AssetManager.Instance.GetAsset(poolId);

        if (storedPrefab == null)
        {
            CustomLogger.Error(nameof(PooledObjectManager), $"Failed to register object with id {poolId}");
            return(false);
        }

        PooledObject pooledObject = storedPrefab.GetComponent <PooledObject>();

        if (pooledObject == null)
        {
            CustomLogger.Error(nameof(PooledObjectManager), $"Asset is not a pooled object!");
            return(false);
        }
        PooledObjectEntry newEntry = new PooledObjectEntry()
        {
            BaseResource     = storedPrefab,
            AvailableObjects = new List <PooledObject>(),
            InUseObjects     = new List <PooledObject>()
        };

        _objectPool.Add(poolId, newEntry);
        CloneToPool(poolId, newEntry.BaseResource, count);
        return(true);
    }
Пример #2
0
    private void CloneToPool(string poolId, GameObject resource, int count)
    {
        PooledObjectEntry entry = _objectPool[poolId];
        int currentCount        = entry.AvailableObjects.Count + entry.InUseObjects.Count;

        if (currentCount + count > MaximumObjectPoolSize)
        {
            CustomLogger.Warn(nameof(PooledObjectManager), $"Max pool size reached for {poolId}");
            count = MaximumObjectPoolSize - currentCount;
        }
        for (int i = 0; i < count; i++)
        {
            GameObject clone = Instantiate(resource, transform);
            clone.name = poolId;
            PooledObject clonePO = clone.GetComponent <PooledObject>();
            _objectPool[poolId].AvailableObjects.Add(clonePO);
            _objectPool[poolId].GameObjects.Add(clonePO, clone);
            clonePO.Despawn(); // hide the object
        }
    }