A game about forced loneliness, made by TACStudios
at master 70 lines 2.8 kB view raw
1using System.Collections.Generic; 2using UnityEngine; 3using UnityEngine.Playables; 4 5namespace UnityEngine.Timeline 6{ 7 /// <summary> 8 /// A Track whose clips control time-related elements on a GameObject. 9 /// </summary> 10 [TrackClipType(typeof(ControlPlayableAsset), false)] 11 [ExcludeFromPreset] 12 [TimelineHelpURL(typeof(ControlTrack))] 13 public class ControlTrack : TrackAsset 14 { 15#if UNITY_EDITOR 16 private static readonly HashSet<PlayableDirector> s_ProcessedDirectors = new HashSet<PlayableDirector>(); 17 18 /// <inheritdoc/> 19 public override void GatherProperties(PlayableDirector director, IPropertyCollector driver) 20 { 21 if (director == null) 22 return; 23 24 // avoid recursion 25 if (s_ProcessedDirectors.Contains(director)) 26 return; 27 28 s_ProcessedDirectors.Add(director); 29 30 var particlesToPreview = new HashSet<ParticleSystem>(); 31 var activationToPreview = new HashSet<GameObject>(); 32 var timeControlToPreview = new HashSet<MonoBehaviour>(); 33 var subDirectorsToPreview = new HashSet<PlayableDirector>(); 34 35 foreach (var clip in GetClips()) 36 { 37 var controlPlayableAsset = clip.asset as ControlPlayableAsset; 38 if (controlPlayableAsset == null) 39 continue; 40 41 var gameObject = controlPlayableAsset.sourceGameObject.Resolve(director); 42 if (gameObject == null) 43 continue; 44 45 if (controlPlayableAsset.updateParticle) 46 particlesToPreview.UnionWith(gameObject.GetComponentsInChildren<ParticleSystem>(true)); 47 if (controlPlayableAsset.active) 48 activationToPreview.Add(gameObject); 49 if (controlPlayableAsset.updateITimeControl) 50 timeControlToPreview.UnionWith(ControlPlayableAsset.GetControlableScripts(gameObject)); 51 if (controlPlayableAsset.updateDirector) 52 subDirectorsToPreview.UnionWith(controlPlayableAsset.GetComponent<PlayableDirector>(gameObject)); 53 } 54 55 ControlPlayableAsset.PreviewParticles(driver, particlesToPreview); 56 ControlPlayableAsset.PreviewActivation(driver, activationToPreview); 57 ControlPlayableAsset.PreviewTimeControl(driver, director, timeControlToPreview); 58 ControlPlayableAsset.PreviewDirectors(driver, subDirectorsToPreview); 59 60 s_ProcessedDirectors.Remove(director); 61 62 particlesToPreview.Clear(); 63 activationToPreview.Clear(); 64 timeControlToPreview.Clear(); 65 subDirectorsToPreview.Clear(); 66 } 67 68#endif 69 } 70}