A game about forced loneliness, made by TACStudios
at master 69 lines 2.7 kB view raw
1using System.Collections.Generic; 2using UnityEngine; 3using UnityEngine.Timeline; 4using UnityEngine.Playables; 5 6namespace UnityEditor.Timeline 7{ 8 [CustomTimelineEditor(typeof(ControlPlayableAsset))] 9 class ControlPlayableAssetEditor : ClipEditor 10 { 11 static readonly Texture2D[] s_ParticleSystemIcon = { AssetPreview.GetMiniTypeThumbnail(typeof(ParticleSystem)) }; 12 13 public override ClipDrawOptions GetClipOptions(TimelineClip clip) 14 { 15 var asset = (ControlPlayableAsset)clip.asset; 16 var options = base.GetClipOptions(clip); 17 if (asset.updateParticle && TimelineEditor.inspectedDirector != null && asset.controllingParticles) 18 options.icons = s_ParticleSystemIcon; 19 return options; 20 } 21 22 public override void OnCreate(TimelineClip clip, TrackAsset track, TimelineClip clonedFrom) 23 { 24 var asset = (ControlPlayableAsset)clip.asset; 25 GameObject sourceObject = null; 26 27 // go by sourceObject first, then by prefab 28 if (TimelineEditor.inspectedDirector != null) 29 sourceObject = asset.sourceGameObject.Resolve(TimelineEditor.inspectedDirector); 30 31 if (sourceObject == null && asset.prefabGameObject != null) 32 sourceObject = asset.prefabGameObject; 33 34 if (sourceObject) 35 { 36 var directors = asset.GetComponent<PlayableDirector>(sourceObject); 37 var particleSystems = asset.GetComponent<ParticleSystem>(sourceObject); 38 39 // update the duration and loop values (used for UI purposes) here 40 // so they are tied to the latest gameObject bound 41 asset.UpdateDurationAndLoopFlag(directors, particleSystems); 42 43 clip.displayName = sourceObject.name; 44 } 45 } 46 47 public override void GetSubTimelines(TimelineClip clip, PlayableDirector director, List<PlayableDirector> subTimelines) 48 { 49 var asset = (ControlPlayableAsset)clip.asset; 50 51 // If there is a prefab, it will override the source GameObject 52 if (!asset.updateDirector || asset.prefabGameObject != null || director == null) 53 return; 54 55 var go = asset.sourceGameObject.Resolve(director); 56 if (go == null) 57 return; 58 59 foreach (var subTimeline in asset.GetComponent<PlayableDirector>(go)) 60 { 61 if (subTimeline == director || subTimeline == TimelineEditor.masterDirector) 62 continue; 63 64 if (subTimeline.playableAsset is TimelineAsset) 65 subTimelines.Add(subTimeline); 66 } 67 } 68 } 69}