ControlPlayableAssetEditor.cs
2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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 || subTimeline == TimelineEditor.inspectedDirector)
continue;
if (subTimeline.playableAsset is TimelineAsset)
subTimelines.Add(subTimeline);
}
}
}
}