FSequencePlayer.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. namespace Flux
  4. {
  5. public class FSequencePlayer : MonoBehaviour {
  6. [SerializeField]
  7. private List<FSequence> _sequences = new List<FSequence>();
  8. public List<FSequence> Sequences { get { return _sequences; } }
  9. [SerializeField]
  10. [Tooltip("Init all the sequences at the start? Use this to avoid frame drops at runtime")]
  11. private bool _initAllOnStart = true;
  12. public bool InitAllOnStart { get { return _initAllOnStart; } set { _initAllOnStart = value; } }
  13. [SerializeField]
  14. private bool _playOnStart = true;
  15. public bool PlayOnStart { get { return _playOnStart; } set { _playOnStart = value; } }
  16. [SerializeField]
  17. [Tooltip("At which update rate should we update the sequences and check if they are finished")]
  18. private AnimatorUpdateMode _updateMode = AnimatorUpdateMode.Normal;
  19. public AnimatorUpdateMode UpdateMode { get { return _updateMode; } set { _updateMode = value; } }
  20. private int _currentSequence = -1;
  21. void Start()
  22. {
  23. if( InitAllOnStart )
  24. InitAll();
  25. if( PlayOnStart )
  26. Play();
  27. }
  28. /// @brief Init all sequences, to avoid bumps at play time
  29. public void InitAll()
  30. {
  31. foreach( FSequence sequence in _sequences )
  32. {
  33. if( sequence != null )
  34. sequence.Init();
  35. }
  36. }
  37. /// @override Starts playing from first sequence.
  38. public void Play()
  39. {
  40. Play( 0 );
  41. }
  42. /**
  43. * @brief Start playing from a specific sequence index.
  44. * @param sequenceIndex Index of the list
  45. */
  46. public void Play( int sequenceIndex )
  47. {
  48. if( IsPlaying )
  49. _sequences[_currentSequence].Pause();
  50. _currentSequence = sequenceIndex;
  51. _sequences[_currentSequence].UpdateMode = UpdateMode;
  52. if( !_sequences[_currentSequence].IsStopped )
  53. _sequences[_currentSequence].Stop();
  54. _sequences[_currentSequence].Play();
  55. }
  56. /**
  57. * @brief Stop playing
  58. * @param reset Reset all the sequences?
  59. */
  60. public void Stop( bool reset )
  61. {
  62. foreach( FSequence sequence in _sequences )
  63. sequence.Stop( reset );
  64. }
  65. /// @brief Only checks if we have any sequence already running
  66. public bool IsPlaying { get { return _currentSequence >= 0; } }
  67. // checks if the current sequence finished, and if so starts the next one
  68. private void CheckSequence()
  69. {
  70. if( !IsPlaying ) return;
  71. if( _sequences[_currentSequence].IsFinished )
  72. {
  73. ++_currentSequence;
  74. if( _currentSequence < _sequences.Count )
  75. {
  76. Play( _currentSequence );
  77. }
  78. else
  79. _currentSequence = -1;
  80. }
  81. }
  82. void LateUpdate()
  83. {
  84. if( UpdateMode != AnimatorUpdateMode.AnimatePhysics )
  85. CheckSequence();
  86. }
  87. void FixedUpdate()
  88. {
  89. if( UpdateMode == AnimatorUpdateMode.AnimatePhysics )
  90. CheckSequence();
  91. }
  92. }
  93. }