You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.7 KiB
69 lines
2.7 KiB
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); |
|
} |
|
} |
|
} |
|
}
|
|
|