| using System; |
| using UnityEngine; |
| using UnityEngine.Audio; |
| using UnityEngine.Playables; |
|
|
| namespace UnityEngine.Timeline |
| { |
| |
| |
| internal class ScheduleRuntimeClip : RuntimeClipBase |
| { |
| private TimelineClip m_Clip; |
| private Playable m_Playable; |
| private Playable m_ParentMixer; |
| private double m_StartDelay; |
| private double m_FinishTail; |
| private bool m_Started = false; |
|
|
| |
| public override double start |
| { |
| get { return Math.Max(0, m_Clip.start - m_StartDelay); } |
| } |
|
|
| public override double duration |
| { |
| get { return m_Clip.duration + m_FinishTail + m_Clip.start - start; } |
| } |
|
|
| public void SetTime(double time) |
| { |
| m_Playable.SetTime(time); |
| } |
|
|
| public TimelineClip clip { get { return m_Clip; } } |
| public Playable mixer { get { return m_ParentMixer; } } |
| public Playable playable { get { return m_Playable; } } |
|
|
| public ScheduleRuntimeClip(TimelineClip clip, Playable clipPlayable, |
| Playable parentMixer, double startDelay = 0.2, double finishTail = 0.1) |
| { |
| Create(clip, clipPlayable, parentMixer, startDelay, finishTail); |
| } |
|
|
| private void Create(TimelineClip clip, Playable clipPlayable, Playable parentMixer, |
| double startDelay, double finishTail) |
| { |
| m_Clip = clip; |
| m_Playable = clipPlayable; |
| m_ParentMixer = parentMixer; |
| m_StartDelay = startDelay; |
| m_FinishTail = finishTail; |
| clipPlayable.Pause(); |
| } |
|
|
| public override bool enable |
| { |
| set |
| { |
| if (value && m_Playable.GetPlayState() != PlayState.Playing) |
| { |
| m_Playable.Play(); |
| } |
| else if (!value && m_Playable.GetPlayState() != PlayState.Paused) |
| { |
| m_Playable.Pause(); |
| if (m_ParentMixer.IsValid()) |
| m_ParentMixer.SetInputWeight(m_Playable, 0.0f); |
| } |
|
|
| m_Started &= value; |
| } |
| } |
|
|
| public override void EvaluateAt(double localTime, FrameData frameData) |
| { |
| if (frameData.timeHeld) |
| { |
| enable = false; |
| return; |
| } |
|
|
|
|
| bool forceSeek = frameData.seekOccurred || frameData.timeLooped || frameData.evaluationType == FrameData.EvaluationType.Evaluate; |
|
|
| |
| if (localTime > start + duration - m_FinishTail) |
| return; |
|
|
| |
| float weight = clip.EvaluateMixIn(localTime) * clip.EvaluateMixOut(localTime); |
| if (mixer.IsValid()) |
| mixer.SetInputWeight(playable, weight); |
|
|
| |
| if (!m_Started || forceSeek) |
| { |
| |
| double clipTime = clip.ToLocalTime(Math.Max(localTime, clip.start)); |
| |
| |
| double startDelay = Math.Max(clip.start - localTime, 0) * clip.timeScale; |
| double durationLocal = m_Clip.duration * clip.timeScale; |
| if (m_Playable.IsPlayableOfType<AudioClipPlayable>()) |
| ((AudioClipPlayable)m_Playable).Seek(clipTime, startDelay, durationLocal); |
|
|
| m_Started = true; |
| } |
| } |
|
|
| public override void DisableAt(double localTime, double rootDuration, FrameData frameData) |
| { |
| enable = false; |
| } |
| } |
| } |
|
|