A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using UnityEngine.Playables;
3using UnityEngine.Timeline;
4
5namespace UnityEditor.Timeline
6{
7 static class ControlPlayableUtility
8 {
9 public static bool DetectCycle(
10 ControlPlayableAsset asset, PlayableDirector director, HashSet<PlayableDirector> set = null)
11 {
12 if (director == null || asset == null || !asset.updateDirector)
13 return false;
14
15 if (set == null)
16 set = new HashSet<PlayableDirector>();
17
18 if (set.Contains(director))
19 return true;
20
21 var gameObject = asset.sourceGameObject.Resolve(director);
22 if (gameObject == null)
23 return false;
24
25 set.Add(director);
26
27 foreach (var subDirector in asset.GetComponent<PlayableDirector>(gameObject))
28 {
29 foreach (var childAsset in GetPlayableAssets(subDirector))
30 {
31 if (DetectCycle(childAsset, subDirector, set))
32 return true;
33 }
34 }
35
36 set.Remove(director);
37
38 return false;
39 }
40
41 public static IEnumerable<ControlPlayableAsset> GetPlayableAssets(PlayableDirector director)
42 {
43 var timeline = director != null ? (director.playableAsset as TimelineAsset) : null;
44 if (timeline != null)
45 {
46 foreach (var t in timeline.GetOutputTracks())
47 {
48 var controlTrack = t as ControlTrack;
49 if (controlTrack != null)
50 {
51 foreach (var c in t.GetClips())
52 {
53 var asset = c.asset as ControlPlayableAsset;
54 if (asset != null)
55 yield return asset;
56 }
57 }
58 }
59 }
60 }
61 }
62}