You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.7 KiB
C#

1 year ago
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
namespace UnityEngine.Timeline
{
/// <summary>
/// A Track whose clips control time-related elements on a GameObject.
/// </summary>
[TrackClipType(typeof(ControlPlayableAsset), false)]
[ExcludeFromPreset]
[TimelineHelpURL(typeof(ControlTrack))]
public class ControlTrack : TrackAsset
{
#if UNITY_EDITOR
private static readonly HashSet<PlayableDirector> s_ProcessedDirectors = new HashSet<PlayableDirector>();
/// <inheritdoc/>
public override void GatherProperties(PlayableDirector director, IPropertyCollector driver)
{
if (director == null)
return;
// avoid recursion
if (s_ProcessedDirectors.Contains(director))
return;
s_ProcessedDirectors.Add(director);
var particlesToPreview = new HashSet<ParticleSystem>();
var activationToPreview = new HashSet<GameObject>();
var timeControlToPreview = new HashSet<MonoBehaviour>();
var subDirectorsToPreview = new HashSet<PlayableDirector>();
foreach (var clip in GetClips())
{
var controlPlayableAsset = clip.asset as ControlPlayableAsset;
if (controlPlayableAsset == null)
continue;
var gameObject = controlPlayableAsset.sourceGameObject.Resolve(director);
if (gameObject == null)
continue;
if (controlPlayableAsset.updateParticle)
particlesToPreview.UnionWith(gameObject.GetComponentsInChildren<ParticleSystem>(true));
if (controlPlayableAsset.active)
activationToPreview.Add(gameObject);
if (controlPlayableAsset.updateITimeControl)
timeControlToPreview.UnionWith(ControlPlayableAsset.GetControlableScripts(gameObject));
if (controlPlayableAsset.updateDirector)
subDirectorsToPreview.UnionWith(controlPlayableAsset.GetComponent<PlayableDirector>(gameObject));
}
ControlPlayableAsset.PreviewParticles(driver, particlesToPreview);
ControlPlayableAsset.PreviewActivation(driver, activationToPreview);
ControlPlayableAsset.PreviewTimeControl(driver, director, timeControlToPreview);
ControlPlayableAsset.PreviewDirectors(driver, subDirectorsToPreview);
s_ProcessedDirectors.Remove(director);
particlesToPreview.Clear();
activationToPreview.Clear();
timeControlToPreview.Clear();
subDirectorsToPreview.Clear();
}
#endif
}
}