63 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |