A game about forced loneliness, made by TACStudios
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}