示例#1
0
 public static void SafeOnSpawned(this ISpawnableObject spawnableObject)
 {
     if (spawnableObject != null)
     {
         spawnableObject.OnAfterSpawn();
     }
 }
示例#2
0
 public static void SafeBeforeDespawned(this ISpawnableObject spawnableObject)
 {
     if (spawnableObject != null)
     {
         spawnableObject.OnBeforeDespawn();
     }
 }
示例#3
0
    /// <summary>
    /// This method will despawn the Game Object of the Transform you pass in.
    /// </summary>
    /// <param name="transToDespawn"></param>
    public static void Despawn(Transform transToDespawn)
    {
        if (!_isReady)
        {
            Debug.LogError(NotInitError);
            return;
        }

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

        if (transToDespawn == null)
        {
            Debug.LogError("No Transform passed to Despawn method.");
            return;
        }

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

        var itemName = GetPrefabName(transToDespawn);

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

        ISpawnableObject despawnListener = transToDespawn.GetComponent <ISpawnableObject>();

        if (despawnListener != null)
        {
            despawnListener.OnDespawned();
        }

        var cloneList = PoolItemsByName[itemName];

        SetParent(transToDespawn, Trans);

        SetActive(transToDespawn.gameObject, false);

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

        cloneList.SpawnedClones.Remove(transToDespawn);
        cloneList.DespawnedClones.Add(transToDespawn);
    }
示例#4
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, bool callOnSpawn)
    {
        var itemSettings = PoolItemsByName[itemName];

        if (itemSettings.DespawnedClones.Count == 0)
        {
            if (!itemSettings.AllowInstantiateMore)
            {
                Debug.LogError("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).");
                return(null);
            }

            // Instantiate a new one
            var curCount = NumberOfClones(itemSettings);
            if (curCount >= itemSettings.ItemHardLimit)
            {
                Debug.LogError("The Transform '" + itemName + "' has reached its item limit in Pool Boss. Please increase your Preload Qty or Item Limit.");
                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.");
            }
        }

        var randomIndex  = Random.Range(0, itemSettings.DespawnedClones.Count);
        var cloneToSpawn = itemSettings.DespawnedClones[randomIndex];

        if (cloneToSpawn == null)
        {
            Debug.LogError("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;

        SetActive(cloneToSpawn.gameObject, true);

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

        SetParent(cloneToSpawn, parentTransform);

        if (callOnSpawn)
        {
            ISpawnableObject spawnListener = cloneToSpawn.GetComponent <ISpawnableObject>();

            if (spawnListener != null)
            {
                spawnListener.OnSpawned();
            }
        }

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

        return(cloneToSpawn);
    }