diff options
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/ControlPlayableUtility.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/ControlPlayableUtility.cs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/ControlPlayableUtility.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/ControlPlayableUtility.cs new file mode 100644 index 0000000..d7023e4 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/ControlPlayableUtility.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using UnityEngine.Playables; +using UnityEngine.Timeline; + +namespace UnityEditor.Timeline +{ + static class ControlPlayableUtility + { + public static bool DetectCycle( + ControlPlayableAsset asset, PlayableDirector director, HashSet<PlayableDirector> set = null) + { + if (director == null || asset == null || !asset.updateDirector) + return false; + + if (set == null) + set = new HashSet<PlayableDirector>(); + + if (set.Contains(director)) + return true; + + var gameObject = asset.sourceGameObject.Resolve(director); + if (gameObject == null) + return false; + + set.Add(director); + + foreach (var subDirector in asset.GetComponent<PlayableDirector>(gameObject)) + { + foreach (var childAsset in GetPlayableAssets(subDirector)) + { + if (DetectCycle(childAsset, subDirector, set)) + return true; + } + } + + set.Remove(director); + + return false; + } + + public static IEnumerable<ControlPlayableAsset> GetPlayableAssets(PlayableDirector director) + { + var timeline = director != null ? (director.playableAsset as TimelineAsset) : null; + if (timeline != null) + { + foreach (var t in timeline.GetOutputTracks()) + { + var controlTrack = t as ControlTrack; + if (controlTrack != null) + { + foreach (var c in t.GetClips()) + { + var asset = c.asset as ControlPlayableAsset; + if (asset != null) + yield return asset; + } + } + } + } + } + } +} |
