70 lines
2.6 KiB
C#
70 lines
2.6 KiB
C#
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]
|
|
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
|
|
}
|
|
}
|