85 lines
2.8 KiB
C#
85 lines
2.8 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.Playables;
|
|
using UnityEngine.Timeline;
|
|
|
|
namespace UnityEditor.Timeline
|
|
{
|
|
partial class TimelineWindow
|
|
{
|
|
void OnPreviewPlayModeChanged(bool isPlaying)
|
|
{
|
|
if (state != null && !state.ignorePreview && isPlaying)
|
|
{
|
|
PreparePreviewPlay();
|
|
EditorApplication.update += OnPreviewPlay;
|
|
}
|
|
else
|
|
{
|
|
EditorApplication.update -= OnPreviewPlay;
|
|
}
|
|
}
|
|
|
|
void PreparePreviewPlay()
|
|
{
|
|
if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null)
|
|
return;
|
|
if (state.playRangeEnabled && !state.isJogging)
|
|
{
|
|
EnsurePlayRangeIsRespected();
|
|
}
|
|
}
|
|
|
|
internal void OnPreviewPlay()
|
|
{
|
|
if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null)
|
|
return;
|
|
|
|
var director = state.masterSequence.director;
|
|
if (director.timeUpdateMode == DirectorUpdateMode.Manual)
|
|
{
|
|
Repaint();
|
|
return;
|
|
}
|
|
|
|
if (state.isJogging)
|
|
{
|
|
ApplyJog();
|
|
}
|
|
else if (state.playRangeEnabled)
|
|
{
|
|
EnsurePlayRangeIsRespected();
|
|
}
|
|
|
|
if (director.extrapolationMode == DirectorWrapMode.None && director.playableGraph.IsValid() && !state.playRangeEnabled && director.playableGraph.IsDone())
|
|
{
|
|
//reset time if we hit the end of the timeline
|
|
state.masterSequence.time = 0.0;
|
|
state.Pause();
|
|
}
|
|
|
|
Repaint();
|
|
AudioMixerWindow.RepaintAudioMixerWindow();
|
|
}
|
|
|
|
void ApplyJog()
|
|
{
|
|
state.masterSequence.time = Math.Max(0.0, Math.Min(state.masterSequence.duration, state.masterSequence.time + state.playbackSpeed));
|
|
}
|
|
|
|
void EnsurePlayRangeIsRespected()
|
|
{
|
|
var playRangeTime = state.playRange;
|
|
var time = state.masterSequence.time;
|
|
if (Math.Abs(time - playRangeTime.end) < TimeUtility.kFrameRateEpsilon || time > playRangeTime.end || time < playRangeTime.start)
|
|
{
|
|
state.masterSequence.time = playRangeTime.start;
|
|
// case 1215926 : Special case to make the director mode to play if the wrap mode is None.
|
|
// In that mode, the engine stop the graph before we can ensure play range is respected.
|
|
if (!state.playing && state.masterSequence.director.extrapolationMode == DirectorWrapMode.None)
|
|
state.Play();
|
|
}
|
|
}
|
|
}
|
|
}
|