Exemple #1
0
    /// <summary>
    /// Call this method to despawn a prefab using Pool Boss. All the Spawners and Killable use this method.
    /// </summary>
    /// <param name="transToDespawn">Transform to despawn</param>
    public static void Despawn(Transform transToDespawn)
    {
        if (!_isReady)
        {
            LevelSettings.LogIfNew(NotInitError);
            return;
        }

        // ReSharper disable once ConditionIsAlwaysTrueOrFalse
        // ReSharper disable HeuristicUnreachableCode
        if (transToDespawn == null)
        {
            LevelSettings.LogIfNew("No Transform passed to Despawn method.");
            return;
        }
        // ReSharper restore HeuristicUnreachableCode

        if (Instance == null)
        {
            // Scene changing, do nothing.
            return;
        }

        if (!SpawnUtility.IsActive(transToDespawn.gameObject))
        {
            return; // already sent to despawn
        }

        var itemName = GetPrefabName(transToDespawn);

        if (!PoolItemsByName.ContainsKey(itemName))
        {
            if (Instance.autoAddMissingPoolItems)
            {
                CreateMissingPoolItem(transToDespawn, itemName, false);
            }
            else
            {
                LevelSettings.LogIfNew("The Transform '" + itemName + "' passed to Despawn is not in Pool Boss. Not despawning.");
                return;
            }
        }

        transToDespawn.BroadcastMessage(DespawnedMessageName, SendMessageOptions.DontRequireReceiver);

        var cloneList = PoolItemsByName[itemName];

        SetParent(transToDespawn, Trans);

        SpawnUtility.SetActive(transToDespawn.gameObject, false);
        Instance._changes++;

        if (Instance.logMessages || cloneList.LogMessages)
        {
            Debug.Log("Pool Boss despawned '" + itemName + "' at " + Time.time);
        }

        cloneList.SpawnedClones.Remove(transToDespawn);
        cloneList.DespawnedClones.Add(transToDespawn);
    }
Exemple #2
0
    private static Transform InstantiateForPool(Transform prefabTrans, int cloneNumber)
    {
        var createdObjTransform = Instantiate(prefabTrans, Trans.position, prefabTrans.rotation) as Transform;

        // ReSharper disable once PossibleNullReferenceException
        createdObjTransform.name = prefabTrans.name + " (Clone " + cloneNumber + ")"; // don't want the "(Clone)" suffix.

        SetParent(createdObjTransform, Trans);

        SpawnUtility.SetActive(createdObjTransform.gameObject, false);

        return(createdObjTransform);
    }
Exemple #3
0
    /// <summary>
    /// Call this method to spawn a prefab using Pool Boss. All the Spawners and Killable use this method.
    /// </summary>
    /// <param name="itemName">Name of the transform to spawn</param>
    /// <param name="position">The position to spawn it at</param>
    /// <param name="rotation">The rotation to use</param>
    /// <param name="parentTransform">The parent Transform to use, if any (optional)</param>
    /// <returns>The Transform of the spawned object. It can be null if spawning failed from limits you have set.</returns>
    public static Transform Spawn(string itemName, Vector3 position, Quaternion rotation,
                                  Transform parentTransform)
    {
        var itemSettings = PoolItemsByName[itemName];

        Transform cloneToSpawn = null;

        if (itemSettings.DespawnedClones.Count == 0)
        {
            if (!itemSettings.AllowInstantiateMore)
            {
                if (itemSettings.AllowRecycle)
                {
                    cloneToSpawn = itemSettings.SpawnedClones[0];
                }
                else
                {
                    LevelSettings.LogIfNew("The Transform '" + itemName + "' has no available clones left to Spawn in Pool Boss. Please increase your Preload Qty, turn on Allow Instantiate More or turn on Recycle Oldest (Recycle is only for non-essential things like decals).", true);
                    return(null);
                }
            }
            else
            {
                // Instantiate a new one
                var curCount = NumberOfClones(itemSettings);
                if (curCount >= itemSettings.ItemHardLimit)
                {
                    LevelSettings.LogIfNew("The Transform '" + itemName + "' has reached its item limit in Pool Boss. Please increase your Preload Qty or Item Limit.", true);
                    return(null);
                }

                var createdObjTransform = InstantiateForPool(itemSettings.SourceTrans, curCount + 1);
                itemSettings.DespawnedClones.Add(createdObjTransform);

                if (Instance.logMessages || itemSettings.LogMessages)
                {
                    Debug.LogWarning("Pool Boss Instantiated an extra '" + itemName + "' at " + Time.time + " because there were none left in the Pool.");
                }
            }
        }

        if (cloneToSpawn == null)
        {
            var randomIndex = Random.Range(0, itemSettings.DespawnedClones.Count);
            cloneToSpawn = itemSettings.DespawnedClones[randomIndex];
        }
        else     // recycling
        {
            cloneToSpawn.BroadcastMessage(DespawnedMessageName, SendMessageOptions.DontRequireReceiver);
        }

        if (cloneToSpawn == null)
        {
            LevelSettings.LogIfNew("One or more of the prefab '" + itemName + "' in Pool Boss has been destroyed. You should never destroy objects in the Pool. Despawn instead. Not spawning anything for this call.");
            return(null);
        }

        cloneToSpawn.position = position;
        cloneToSpawn.rotation = rotation;
        SpawnUtility.SetActive(cloneToSpawn.gameObject, true);
        Instance._changes++;

        if (Instance.logMessages || itemSettings.LogMessages)
        {
            Debug.Log("Pool Boss spawned '" + itemName + "' at " + Time.time);
        }

        if (parentTransform != null)
        {
            SetParent(cloneToSpawn, parentTransform);
        }

        cloneToSpawn.BroadcastMessage(SpawnedMessageName, SendMessageOptions.DontRequireReceiver);

        itemSettings.DespawnedClones.Remove(cloneToSpawn);
        itemSettings.SpawnedClones.Add(cloneToSpawn);

        return(cloneToSpawn);
    }