128 lines
3.7 KiB
C#
128 lines
3.7 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|