88 lines
3.0 KiB
C#
88 lines
3.0 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Playables;
|
|
using UnityEngine.Timeline;
|
|
|
|
namespace UnityEditor.Timeline
|
|
{
|
|
partial class TimelineWindow
|
|
{
|
|
private TimelineAsset m_PreviousMasterSequence;
|
|
|
|
public override void ClearTimeline()
|
|
{
|
|
SetCurrentTimeline(null, null, null, true);
|
|
}
|
|
|
|
public override void SetTimeline(TimelineAsset seq)
|
|
{
|
|
SetCurrentTimeline(seq, null, null);
|
|
}
|
|
|
|
public override void SetTimeline(PlayableDirector director)
|
|
{
|
|
SetCurrentTimeline(director, null);
|
|
}
|
|
|
|
public void SetCurrentTimeline(PlayableDirector director, TimelineClip hostClip)
|
|
{
|
|
var asset = director != null ? director.playableAsset as TimelineAsset : null;
|
|
SetCurrentTimeline(asset, director, hostClip);
|
|
}
|
|
|
|
void SetCurrentTimeline(TimelineAsset seq, PlayableDirector instanceOfDirector, TimelineClip hostClip, bool force = false)
|
|
{
|
|
if (state == null)
|
|
return;
|
|
|
|
if (!force &&
|
|
state.editSequence.hostClip == hostClip &&
|
|
state.editSequence.director == instanceOfDirector &&
|
|
state.editSequence.asset == seq)
|
|
return;
|
|
|
|
state.SetCurrentSequence(seq, instanceOfDirector, hostClip);
|
|
}
|
|
|
|
void OnBeforeSequenceChange()
|
|
{
|
|
treeView = null;
|
|
m_MarkerHeaderGUI = null;
|
|
m_TimeAreaDirty = true;
|
|
|
|
state.Reset();
|
|
m_PlayableLookup.ClearPlayableLookup();
|
|
|
|
// clear old editors to caches, like audio previews, get flushed
|
|
CustomTimelineEditorCache.ClearCache<ClipEditor>();
|
|
CustomTimelineEditorCache.ClearCache<MarkerEditor>();
|
|
CustomTimelineEditorCache.ClearCache<TrackEditor>();
|
|
|
|
m_PreviousMasterSequence = state.masterSequence.asset;
|
|
}
|
|
|
|
void OnAfterSequenceChange()
|
|
{
|
|
Repaint();
|
|
|
|
m_SequencePath = state.GetCurrentSequencePath();
|
|
|
|
m_LastFrameHadSequence = state.editSequence.asset != null;
|
|
TimelineWindowViewPrefs.SaveAll();
|
|
|
|
// this prevent clearing the animation window when going in/out of playmode, but
|
|
// clears it when we switch master timelines
|
|
// the cast to a object will handle the case where the sequence has been deleted.
|
|
object previousMasterSequence = m_PreviousMasterSequence;
|
|
bool isDeleted = previousMasterSequence != null && m_PreviousMasterSequence == null;
|
|
bool hasChanged = m_PreviousMasterSequence != null && m_PreviousMasterSequence != state.masterSequence.asset;
|
|
if (isDeleted || hasChanged)
|
|
{
|
|
AnimationClipCurveCache.Instance.Clear();
|
|
TimelineAnimationUtilities.UnlinkAnimationWindow();
|
|
|
|
state.analytics.SendAfterSequenceChangeEvent(); // Changing timelines resets analytics that are aggregated in the Timeline Window
|
|
}
|
|
}
|
|
}
|
|
}
|