10using System.Collections.Generic;
17 [RequireComponent(typeof(PlayableDirector))]
20 private PlayableDirector _director;
21 private TimelineAsset _timeline;
22 private Dictionary<string, TimelineClip> _markers =
new Dictionary<string, TimelineClip>();
23 private Dictionary<string, Action> _actions =
new Dictionary<string, Action>();
25 private void Awake() {
26 _director = GetComponent<PlayableDirector>();
31 if (_markers.TryGetValue(markerName, out clip)) {
34 return _director.time < clip.start;
36 return _director.time > clip.start;
38 return _director.time < clip.end;
40 return _director.time > clip.end;
42 return _director.time > clip.start && _director.time < clip.end;
44 return _director.time < clip.start || _director.time > clip.end;
46 throw new ArgumentException();
54 _actions[markerName] = Action.Loop;
58 _actions[markerName] = Action.Pause;
62 _actions[markerName] = Action.Skip;
66 if (_actions.ContainsKey(markerName) &&
67 _actions[markerName] == Action.Pause &&
72 _actions[markerName] = Action.None;
75 private void Update() {
78 foreach (var action
in _actions) {
80 if (!_markers.TryGetValue(action.Key, out clip)) {
84 switch (action.Value) {
86 if (_director.time >= clip.start) {
91 if (_director.time >= clip.end) {
92 _director.time = clip.start;
96 if (_director.time >= clip.start && _director.time < clip.end) {
97 _director.time = clip.end;
105 if (_timeline == _director.playableAsset) {
109 _timeline = _director.playableAsset as TimelineAsset;
112 var timeline = _director.playableAsset as TimelineAsset;
113 for (
int i = 0; i < timeline.outputTrackCount; i++) {
114 var track = timeline.GetOutputTrack(i);
116 foreach (var clip
in track.GetClips()) {
118 _markers[marker.markerName] = clip;
124 private enum Action {
void LoopAtMarker(string markerName)
void updateMarkersIfNeeded()
bool TestMarker(string markerName, MarkerTest test)
void SkipMarker(string markerName)
void PauseAtMarker(string markerName)
void ClearMarker(string markerName)