ControlTrack.cs 2.6 KB

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