10using System.Collections.Generic;
19 [RequireComponent(typeof(PlayableDirector))]
26 [
DisableIf(
"drawGizmoOnDiscontinuity", isEqualTo:
false)]
31 private PlayableDirector _director;
32 private List<TimelineClip> _clipsToWatch =
new List<TimelineClip>();
34 private PlayableAsset _prevAsset;
35 private double _prevTime;
36 private PlayState _prevPlayState;
38 private bool _willBeDiscontinuousNextFrame =
false;
40 private float _gizmoRadius = 0;
42 private void Awake() {
43 _director = GetComponent<PlayableDirector>();
44 _prevPlayState = _director.state;
47 private void LateUpdate() {
48 bool isDiscontinuity =
false;
51 if (_willBeDiscontinuousNextFrame) {
52 isDiscontinuity =
true;
53 _willBeDiscontinuousNextFrame =
false;
57 if (_director.playableAsset != _prevAsset) {
58 isDiscontinuity =
true;
63 if (_director.time < _prevTime) {
64 isDiscontinuity =
true;
65 _willBeDiscontinuousNextFrame =
true;
69 if (_director.time - _prevTime > Time.deltaTime * 3) {
70 isDiscontinuity =
true;
74 if (_director.state != _prevPlayState) {
75 isDiscontinuity =
true;
76 _willBeDiscontinuousNextFrame =
true;
80 foreach (var clip
in _clipsToWatch) {
81 if (didEnterOrLeaveClip(clip)) {
82 isDiscontinuity =
true;
88 if (isDiscontinuity) {
91 _gizmoRadius *= 0.95f;
94 RuntimeGizmoDrawer drawer;
95 if (RuntimeGizmoManager.TryGetGizmoDrawer(out drawer)) {
96 drawer.color =
Color.red;
105 _prevTime = _director.time;
106 _prevAsset = _director.playableAsset;
107 _prevPlayState = _director.state;
110 private void recalculateClips() {
111 _clipsToWatch.Clear();
113 var timeline = _director.playableAsset as TimelineAsset;
114 if (timeline ==
null) {
118 for (
int i = 0; i < timeline.outputTrackCount; i++) {
119 var track = timeline.GetOutputTrack(i);
120 Debug.Log(track.name);
122 _clipsToWatch.AddRange(track.GetClips());
127 private bool didEnterOrLeaveClip(TimelineClip clip) {
128 bool wasInside = _prevTime > clip.start && _prevTime < clip.end;
129 bool isInside = _director.time > clip.start && _director.time < clip.end;
130 return wasInside != isInside;
bool drawGizmoOnDiscontinuity
List< string > tracksToWatch