70 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Timeline; | ||
|  | using UnityEngine.Playables; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     [CustomTimelineEditor(typeof(ControlPlayableAsset))] | ||
|  |     class ControlPlayableAssetEditor : ClipEditor | ||
|  |     { | ||
|  |         static readonly Texture2D[] s_ParticleSystemIcon = { AssetPreview.GetMiniTypeThumbnail(typeof(ParticleSystem)) }; | ||
|  | 
 | ||
|  |         public override ClipDrawOptions GetClipOptions(TimelineClip clip) | ||
|  |         { | ||
|  |             var asset = (ControlPlayableAsset)clip.asset; | ||
|  |             var options = base.GetClipOptions(clip); | ||
|  |             if (asset.updateParticle && TimelineEditor.inspectedDirector != null && asset.controllingParticles) | ||
|  |                 options.icons = s_ParticleSystemIcon; | ||
|  |             return options; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnCreate(TimelineClip clip, TrackAsset track, TimelineClip clonedFrom) | ||
|  |         { | ||
|  |             var asset = (ControlPlayableAsset)clip.asset; | ||
|  |             GameObject sourceObject = null; | ||
|  | 
 | ||
|  |             // go by sourceObject first, then by prefab | ||
|  |             if (TimelineEditor.inspectedDirector != null) | ||
|  |                 sourceObject = asset.sourceGameObject.Resolve(TimelineEditor.inspectedDirector); | ||
|  | 
 | ||
|  |             if (sourceObject == null && asset.prefabGameObject != null) | ||
|  |                 sourceObject = asset.prefabGameObject; | ||
|  | 
 | ||
|  |             if (sourceObject) | ||
|  |             { | ||
|  |                 var directors = asset.GetComponent<PlayableDirector>(sourceObject); | ||
|  |                 var particleSystems = asset.GetComponent<ParticleSystem>(sourceObject); | ||
|  | 
 | ||
|  |                 // update the duration and loop values (used for UI purposes) here | ||
|  |                 // so they are tied to the latest gameObject bound | ||
|  |                 asset.UpdateDurationAndLoopFlag(directors, particleSystems); | ||
|  | 
 | ||
|  |                 clip.displayName = sourceObject.name; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void GetSubTimelines(TimelineClip clip, PlayableDirector director, List<PlayableDirector> subTimelines) | ||
|  |         { | ||
|  |             var asset = (ControlPlayableAsset)clip.asset; | ||
|  | 
 | ||
|  |             // If there is a prefab, it will override the source GameObject | ||
|  |             if (!asset.updateDirector || asset.prefabGameObject != null || director == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             var go = asset.sourceGameObject.Resolve(director); | ||
|  |             if (go == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             foreach (var subTimeline in asset.GetComponent<PlayableDirector>(go)) | ||
|  |             { | ||
|  |                 if (subTimeline == director || subTimeline == TimelineEditor.masterDirector) | ||
|  |                     continue; | ||
|  | 
 | ||
|  |                 if (subTimeline.playableAsset is TimelineAsset) | ||
|  |                     subTimelines.Add(subTimeline); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |