71 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			2.7 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] | ||
|  |     [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 | ||
|  |     } | ||
|  | } |