GameObjectParicleSystem.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using ExtensionMethods;
  6. using UnityEngine;
  7. public class GameObjectParicleSystem : MonoBehaviour
  8. {
  9. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  10. public event EventHandler OnParticleCreate;
  11. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  12. public event EventHandler OnParticleDestroy;
  13. private Rect Shape
  14. {
  15. get
  16. {
  17. return new Rect(base.transform.position - this._box / 2f, this._box);
  18. }
  19. }
  20. private void Start()
  21. {
  22. base.StartCoroutine(this.Emission());
  23. }
  24. private IEnumerator Emission()
  25. {
  26. for (;;)
  27. {
  28. if (this._count < this._maxParticles)
  29. {
  30. base.StartCoroutine(this.ParticleLifetime());
  31. }
  32. yield return new WaitForSeconds(1f / (float)this._rate);
  33. }
  34. yield break;
  35. }
  36. private IEnumerator ParticleLifetime()
  37. {
  38. Vector3 position = new Vector3(UnityEngine.Random.Range(this.Shape.xMin, this.Shape.xMax), UnityEngine.Random.Range(this.Shape.yMin, this.Shape.yMax), UnityEngine.Random.Range(base.transform.position.z - this._box.z, base.transform.position.z + this._box.z));
  39. Vector3 eulerAngles = Vector3.zero.SetZ(UnityEngine.Random.Range(this._startRotation.x, this._startRotation.y));
  40. Vector3 localScale = Vector3.one * UnityEngine.Random.Range(this._startSize.x, this._startSize.y);
  41. GameObject particle;
  42. if (this._usePool && this._gameObjectStack.Count != 0)
  43. {
  44. particle = this._gameObjectStack.Pop();
  45. particle.transform.position = position;
  46. particle.transform.eulerAngles = eulerAngles;
  47. particle.transform.localScale = localScale;
  48. particle.SetActive(true);
  49. }
  50. else
  51. {
  52. particle = UnityEngine.Object.Instantiate<GameObject>(this._particleGameObject, position, Quaternion.Euler(eulerAngles));
  53. if (particle == null)
  54. {
  55. throw new NullReferenceException();
  56. }
  57. particle.transform.parent = base.transform;
  58. }
  59. this._count++;
  60. if (this.OnParticleCreate != null)
  61. {
  62. this.OnParticleCreate(particle, EventArgs.Empty);
  63. }
  64. yield return new WaitForSeconds(this._startLifetime);
  65. if (this.OnParticleDestroy != null)
  66. {
  67. this.OnParticleDestroy(particle, EventArgs.Empty);
  68. }
  69. if (!this._usePool || this._count > this._maxParticles)
  70. {
  71. UnityEngine.Object.Destroy(particle);
  72. }
  73. else
  74. {
  75. particle.SetActive(false);
  76. this._gameObjectStack.Push(particle);
  77. }
  78. this._count--;
  79. yield break;
  80. }
  81. public void OnDrawGizmosSelected()
  82. {
  83. DebugX.DrawCube(base.transform.position, Color.cyan / 2f, this._box);
  84. }
  85. [SerializeField]
  86. private GameObject _particleGameObject;
  87. [SerializeField]
  88. private bool _usePool = true;
  89. [SerializeField]
  90. private float _startLifetime = 5f;
  91. [SerializeField]
  92. private Vector2 _startSize = Vector2.one;
  93. [SerializeField]
  94. private Vector2 _startRotation = Vector2.zero;
  95. [SerializeField]
  96. private int _maxParticles = 10;
  97. [SerializeField]
  98. private int _rate = 1;
  99. [SerializeField]
  100. private Vector3 _box = Vector2.one;
  101. private Stack<GameObject> _gameObjectStack = new Stack<GameObject>();
  102. private int _count;
  103. }