FPlayParticleEvent.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace Flux
  4. {
  5. //[FEvent( "Particle System/Play Particle", typeof(FParticleTrack) )]
  6. public class FPlayParticleEvent : FEvent {
  7. [SerializeField]
  8. [Tooltip("True: ParticleSystem playback speed will be adjusted to match event length"
  9. +"\nFalse: ParticleSystem plays at normal speed, i.e. doesn't scale based on event length")]
  10. private bool _normalizeToEventLength = false;
  11. [SerializeField]
  12. [HideInInspector]
  13. [Tooltip("Seed to randomize the particle system, 0 = always randomize")]
  14. private uint _randomSeed = 1;
  15. private ParticleSystem _particleSystem = null;
  16. private float _previousTimeSinceTrigger = 0;
  17. private float _previousSpeed = 0;
  18. protected override void OnInit ()
  19. {
  20. _particleSystem = ((FParticleTrack)Track).ParticleSystem;
  21. if( _particleSystem != null )
  22. {
  23. _particleSystem.randomSeed = _randomSeed;
  24. ParticleSystem.MainModule mainModule = _particleSystem.main;
  25. mainModule.simulationSpeed = Sequence.Speed;
  26. }
  27. else
  28. {
  29. #if UNITY_EDITOR
  30. Debug.LogError("FParticleEvent is attached to an object that doesn't have a ParticleSystem");
  31. #endif
  32. }
  33. _previousTimeSinceTrigger = 0;
  34. _previousSpeed = Sequence.Speed;
  35. }
  36. protected override void OnTrigger( float timeSinceTrigger )
  37. {
  38. if (_particleSystem != null && Sequence.IsPlaying && Sequence.IsPlayingForward)
  39. _particleSystem.Play( true );
  40. }
  41. protected override void OnFinish()
  42. {
  43. if( _particleSystem != null )
  44. _particleSystem.Stop( true );
  45. }
  46. protected override void OnStop()
  47. {
  48. if( _particleSystem != null )
  49. {
  50. _particleSystem.Stop(true);
  51. _particleSystem.Clear( true );
  52. }
  53. }
  54. protected override void OnPause ()
  55. {
  56. if( _particleSystem != null )
  57. _particleSystem.Pause();
  58. }
  59. protected override void OnResume ()
  60. {
  61. if( _particleSystem != null && Sequence.IsPlayingForward )
  62. _particleSystem.Play(true);
  63. }
  64. protected override void OnUpdateEvent( float timeSinceTrigger )
  65. {
  66. if( _particleSystem == null )
  67. return;
  68. if( !Sequence.IsPlaying || !Sequence.IsPlayingForward )
  69. {
  70. _previousSpeed = 1;
  71. ParticleSystem.MainModule mainModule = _particleSystem.main;
  72. mainModule.simulationSpeed = _previousSpeed;
  73. float delta = timeSinceTrigger - _previousTimeSinceTrigger;
  74. _previousTimeSinceTrigger = timeSinceTrigger;
  75. if( Sequence.IsPlayingForward && delta > 0 )
  76. {
  77. _particleSystem.Simulate( delta, true, false );
  78. }
  79. else
  80. {
  81. float t = _normalizeToEventLength ? (timeSinceTrigger / LengthTime) * _particleSystem.main.duration : Mathf.Clamp(timeSinceTrigger, 0, _particleSystem.main.duration);
  82. _particleSystem.Simulate( t, true, true );
  83. }
  84. }
  85. else if( _previousSpeed != Sequence.Speed )
  86. {
  87. _previousSpeed = Sequence.Speed;
  88. ParticleSystem.MainModule mainModule = _particleSystem.main;
  89. mainModule.simulationSpeed = Mathf.Abs(_previousSpeed);
  90. }
  91. }
  92. }
  93. }