using UnityEngine.Playables; namespace UnityEngine.Timeline { /// /// A PlayableBehaviour that manages a component that implements the ITimeControl interface /// public class TimeControlPlayable : PlayableBehaviour { ITimeControl m_timeControl; bool m_started; /// /// Creates a Playable with a TimeControlPlayable behaviour attached /// /// The PlayableGraph to inject the Playable into. /// /// public static ScriptPlayable Create(PlayableGraph graph, ITimeControl timeControl) { if (timeControl == null) return ScriptPlayable.Null; var handle = ScriptPlayable.Create(graph); handle.GetBehaviour().Initialize(timeControl); return handle; } /// /// Initializes the behaviour /// /// Component that implements the ITimeControl interface public void Initialize(ITimeControl timeControl) { m_timeControl = timeControl; } /// /// This function is called during the PrepareFrame phase of the PlayableGraph. /// /// The Playable that owns the current PlayableBehaviour. /// A FrameData structure that contains information about the current frame context. public override void PrepareFrame(Playable playable, FrameData info) { Debug.Assert(m_started, "PrepareFrame has been called without OnControlTimeStart being called first."); if (m_timeControl != null) m_timeControl.SetTime(playable.GetTime()); } /// /// This function is called when the Playable play state is changed to Playables.PlayState.Playing. /// /// The Playable that owns the current PlayableBehaviour. /// A FrameData structure that contains information about the current frame context. public override void OnBehaviourPlay(Playable playable, FrameData info) { if (m_timeControl == null) return; if (!m_started) { m_timeControl.OnControlTimeStart(); m_started = true; } } /// /// This function is called when the Playable play state is changed to PlayState.Paused. /// /// The playable this behaviour is attached to. /// A FrameData structure that contains information about the current frame context. public override void OnBehaviourPause(Playable playable, FrameData info) { if (m_timeControl == null) return; if (m_started) { m_timeControl.OnControlTimeStop(); m_started = false; } } } }