A game about forced loneliness, made by TACStudios
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}