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.
127 lines
3.7 KiB
127 lines
3.7 KiB
using System; |
|
using UnityEngine; |
|
using UnityEngine.Playables; |
|
|
|
namespace UnityEngine.Timeline |
|
{ |
|
// The RuntimeClip wraps a single clip in an instantiated sequence. |
|
// It supports the IInterval interface so that it can be stored in the interval tree |
|
// It is this class that is returned by an interval tree query. |
|
class RuntimeClip : RuntimeClipBase |
|
{ |
|
TimelineClip m_Clip; |
|
Playable m_Playable; |
|
Playable m_ParentMixer; |
|
|
|
public override double start |
|
{ |
|
get { return m_Clip.extrapolatedStart; } |
|
} |
|
|
|
public override double duration |
|
{ |
|
get { return m_Clip.extrapolatedDuration; } |
|
} |
|
|
|
public RuntimeClip(TimelineClip clip, Playable clipPlayable, Playable parentMixer) |
|
{ |
|
Create(clip, clipPlayable, parentMixer); |
|
} |
|
|
|
void Create(TimelineClip clip, Playable clipPlayable, Playable parentMixer) |
|
{ |
|
m_Clip = clip; |
|
m_Playable = clipPlayable; |
|
m_ParentMixer = parentMixer; |
|
clipPlayable.Pause(); |
|
} |
|
|
|
public TimelineClip clip |
|
{ |
|
get { return m_Clip; } |
|
} |
|
|
|
public Playable mixer |
|
{ |
|
get { return m_ParentMixer; } |
|
} |
|
|
|
public Playable playable |
|
{ |
|
get { return m_Playable; } |
|
} |
|
|
|
public override bool enable |
|
{ |
|
set |
|
{ |
|
if (value && m_Playable.GetPlayState() != PlayState.Playing) |
|
{ |
|
m_Playable.Play(); |
|
SetTime(m_Clip.clipIn); |
|
} |
|
else if (!value && m_Playable.GetPlayState() != PlayState.Paused) |
|
{ |
|
m_Playable.Pause(); |
|
if (m_ParentMixer.IsValid()) |
|
m_ParentMixer.SetInputWeight(m_Playable, 0.0f); |
|
} |
|
} |
|
} |
|
|
|
public void SetTime(double time) |
|
{ |
|
m_Playable.SetTime(time); |
|
} |
|
|
|
public void SetDuration(double duration) |
|
{ |
|
m_Playable.SetDuration(duration); |
|
} |
|
|
|
public override void EvaluateAt(double localTime, FrameData frameData) |
|
{ |
|
enable = true; |
|
if (frameData.timeLooped) |
|
{ |
|
// case 1184106 - animation playables require setTime to be called twice to 'reset' event. |
|
SetTime(clip.clipIn); |
|
SetTime(clip.clipIn); |
|
} |
|
|
|
float weight = 1.0f; |
|
if (clip.IsPreExtrapolatedTime(localTime)) |
|
weight = clip.EvaluateMixIn((float)clip.start); |
|
else if (clip.IsPostExtrapolatedTime(localTime)) |
|
weight = clip.EvaluateMixOut((float)clip.end); |
|
else |
|
weight = clip.EvaluateMixIn(localTime) * clip.EvaluateMixOut(localTime); |
|
|
|
if (mixer.IsValid()) |
|
mixer.SetInputWeight(playable, weight); |
|
|
|
// localTime of the sequence to localtime of the clip |
|
double clipTime = clip.ToLocalTime(localTime); |
|
if (clipTime >= -DiscreteTime.tickValue / 2) |
|
{ |
|
SetTime(clipTime); |
|
} |
|
|
|
SetDuration(clip.extrapolatedDuration); |
|
} |
|
|
|
public override void DisableAt(double localTime, double rootDuration, FrameData frameData) |
|
{ |
|
var time = Math.Min(localTime, (double)DiscreteTime.FromTicks(intervalEnd)); |
|
if (frameData.timeLooped) |
|
time = Math.Min(time, rootDuration); |
|
|
|
var clipTime = clip.ToLocalTime(time); |
|
if (clipTime > -DiscreteTime.tickValue / 2) |
|
{ |
|
SetTime(clipTime); |
|
} |
|
enable = false; |
|
} |
|
} |
|
}
|
|
|