/// <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); }
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); }
/// <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); }