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