123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- 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;
- }
- }
- }
|