F3DPool.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class F3DPool : MonoBehaviour {
  5. public static F3DPool instance; // Singleton instance
  6. [Header("VFX Pool")]
  7. public Transform[] poolItems; // Effect pool prefabs
  8. public int[] poolLength; // Effect pool items count
  9. [Header("Audio Pool")]
  10. public Transform audioSourcePrefab; // Audio source prefab
  11. public AudioClip[] audioPoolItems; // Audio pool prefabs
  12. public int[] audioPoolLength; // Audio pool items count
  13. // Pooled items collections
  14. private Dictionary<Transform, Transform[]> pool;
  15. private Dictionary<AudioClip, AudioSource[]> audioPool;
  16. // Use this for initialization
  17. void Start ()
  18. {
  19. // Singleton instance
  20. instance = this;
  21. // Initialize effects pool
  22. if (poolItems.Length > 0)
  23. {
  24. pool = new Dictionary<Transform, Transform[]>();
  25. for (int i = 0; i < poolItems.Length; i++)
  26. {
  27. Transform[] itemArray = new Transform[poolLength[i]];
  28. for (int x = 0; x < poolLength[i]; x++)
  29. {
  30. Transform newItem = (Transform)Instantiate(poolItems[i], Vector3.zero, Quaternion.identity);
  31. newItem.gameObject.SetActive(false);
  32. newItem.parent = transform;
  33. itemArray[x] = newItem;
  34. }
  35. pool.Add(poolItems[i], itemArray);
  36. }
  37. }
  38. // Initialize audio pool
  39. if (audioPoolItems.Length > 0)
  40. {
  41. audioPool = new Dictionary<AudioClip, AudioSource[]>();
  42. for (int i = 0; i < audioPoolItems.Length; i++)
  43. {
  44. AudioSource[] audioArray = new AudioSource[audioPoolLength[i]];
  45. for (int x = 0; x < audioPoolLength[i]; x++)
  46. {
  47. AudioSource newAudio = ((Transform)Instantiate(audioSourcePrefab, Vector3.zero, Quaternion.identity)).GetComponent<AudioSource>();
  48. newAudio.clip = audioPoolItems[i];
  49. newAudio.gameObject.SetActive(false);
  50. newAudio.transform.parent = transform;
  51. audioArray[x] = newAudio;
  52. }
  53. audioPool.Add(audioPoolItems[i], audioArray);
  54. }
  55. }
  56. }
  57. // Spawn effect prefab and send OnSpawned message
  58. public Transform Spawn(Transform obj, Vector3 pos, Quaternion rot, Transform parent)
  59. {
  60. for (int i = 0; i < pool[obj].Length; i++)
  61. {
  62. if(!pool[obj][i].gameObject.activeSelf)
  63. {
  64. Transform spawnItem = pool[obj][i];
  65. spawnItem.parent = parent;
  66. spawnItem.position = pos;
  67. spawnItem.rotation = rot;
  68. spawnItem.gameObject.SetActive(true);
  69. spawnItem.BroadcastMessage("OnSpawned", SendMessageOptions.DontRequireReceiver);
  70. return spawnItem;
  71. }
  72. }
  73. return null;
  74. }
  75. // Spawn audio prefab and send OnSpawned message
  76. public AudioSource SpawnAudio(AudioClip clip, Vector3 pos, Transform parent)
  77. {
  78. for (int i = 0; i < audioPool[clip].Length; i++)
  79. {
  80. if (!audioPool[clip][i].gameObject.activeSelf)
  81. {
  82. AudioSource spawnItem = audioPool[clip][i];
  83. spawnItem.transform.parent = parent;
  84. spawnItem.transform.position = pos;
  85. spawnItem.gameObject.SetActive(true);
  86. spawnItem.BroadcastMessage("OnSpawned", SendMessageOptions.DontRequireReceiver);
  87. return spawnItem;
  88. }
  89. }
  90. return null;
  91. }
  92. // Despawn effect or audio and send OnDespawned message
  93. public void Despawn(Transform obj)
  94. {
  95. obj.BroadcastMessage("OnDespawned", SendMessageOptions.DontRequireReceiver);
  96. obj.gameObject.SetActive(false);
  97. }
  98. }