public static void SafeOnSpawned(this ISpawnableObject spawnableObject) { if (spawnableObject != null) { spawnableObject.OnAfterSpawn(); } }
public static void SafeBeforeDespawned(this ISpawnableObject spawnableObject) { if (spawnableObject != null) { spawnableObject.OnBeforeDespawn(); } }
/// <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); }
/// <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); }