TimelineWindow_PreviewPlayMode.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Playables;
  4. using UnityEngine.Timeline;
  5. namespace UnityEditor.Timeline
  6. {
  7. partial class TimelineWindow
  8. {
  9. void OnPreviewPlayModeChanged(bool isPlaying)
  10. {
  11. if (EditorApplication.isPlaying)
  12. return;
  13. if (isPlaying)
  14. {
  15. PreparePreviewPlay();
  16. EditorApplication.update += OnPreviewPlay;
  17. }
  18. else
  19. {
  20. EditorApplication.update -= OnPreviewPlay;
  21. }
  22. }
  23. void PreparePreviewPlay()
  24. {
  25. if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null)
  26. return;
  27. if (state.playRangeEnabled && !state.isJogging)
  28. {
  29. EnsurePlayRangeIsRespected();
  30. }
  31. }
  32. internal void OnPreviewPlay()
  33. {
  34. if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null)
  35. return;
  36. var director = state.masterSequence.director;
  37. if (director.timeUpdateMode == DirectorUpdateMode.Manual)
  38. {
  39. Repaint();
  40. return;
  41. }
  42. if (state.isJogging)
  43. {
  44. ApplyJog();
  45. }
  46. else if (state.playRangeEnabled)
  47. {
  48. EnsurePlayRangeIsRespected();
  49. }
  50. if (director.extrapolationMode == DirectorWrapMode.None && director.playableGraph.IsValid() && !state.playRangeEnabled && director.playableGraph.IsDone())
  51. {
  52. //reset time if we hit the end of the timeline
  53. state.masterSequence.time = 0.0;
  54. state.Pause();
  55. }
  56. Repaint();
  57. AudioMixerWindow.RepaintAudioMixerWindow();
  58. }
  59. void ApplyJog()
  60. {
  61. state.masterSequence.time = Math.Max(0.0, Math.Min(state.masterSequence.duration, state.masterSequence.time + state.playbackSpeed));
  62. }
  63. void EnsurePlayRangeIsRespected()
  64. {
  65. var playRangeTime = state.playRange;
  66. var time = state.masterSequence.time;
  67. if (Math.Abs(time - playRangeTime.y) < TimeUtility.kFrameRateEpsilon || time > playRangeTime.y || time < playRangeTime.x)
  68. {
  69. state.masterSequence.time = playRangeTime.x;
  70. // case 1215926 : Special case to make the director mode to play if the wrap mode is None.
  71. // In that mode, the engine stop the graph before we can ensure play range is respected.
  72. if (!state.playing && state.masterSequence.director.extrapolationMode == DirectorWrapMode.None)
  73. state.Play();
  74. }
  75. }
  76. }
  77. }