123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- using UnityEngine.Playables;
- namespace UnityEngine.Timeline
- {
- /// <summary>
- /// Playable that controls the active state of a GameObject.
- /// </summary>
- public class ActivationControlPlayable : PlayableBehaviour
- {
- /// <summary>
- /// The state of a GameObject's activeness when a PlayableGraph stops.
- /// </summary>
- public enum PostPlaybackState
- {
- /// <summary>
- /// Set the GameObject to active when the PlayableGraph stops.
- /// </summary>
- Active,
- /// <summary>
- /// Set the GameObject to inactive when the [[PlayableGraph]] stops.
- /// </summary>
- Inactive,
- /// <summary>
- /// Revert the GameObject to the active state it was before the [[PlayableGraph]] started.
- /// </summary>
- Revert
- }
- enum InitialState
- {
- Unset,
- Active,
- Inactive
- }
- public GameObject gameObject = null;
- public PostPlaybackState postPlayback = PostPlaybackState.Revert;
- InitialState m_InitialState;
- /// <summary>
- /// Creates a ScriptPlayable with an ActivationControlPlayable behaviour attached
- /// </summary>
- /// <param name="graph">PlayableGraph that will own the playable</param>
- /// <param name="gameObject">The GameObject that triggered the graph build</param>
- /// <param name="postPlaybackState">The state to leave the gameObject after the graph is stopped</param>
- /// <returns>Returns a playable that controls activation of a game object</returns>
- public static ScriptPlayable<ActivationControlPlayable> Create(PlayableGraph graph, GameObject gameObject, ActivationControlPlayable.PostPlaybackState postPlaybackState)
- {
- if (gameObject == null)
- return ScriptPlayable<ActivationControlPlayable>.Null;
- var handle = ScriptPlayable<ActivationControlPlayable>.Create(graph);
- var playable = handle.GetBehaviour();
- playable.gameObject = gameObject;
- playable.postPlayback = postPlaybackState;
- return handle;
- }
- /// <summary>
- /// This function is called when the Playable play state is changed to Playables.PlayState.Playing.
- /// </summary>
- /// <param name="playable">The playable this behaviour is attached to.</param>
- /// <param name="info">The information about this frame</param>
- public override void OnBehaviourPlay(Playable playable, FrameData info)
- {
- if (gameObject == null)
- return;
- gameObject.SetActive(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">The information about this frame</param>
- public override void OnBehaviourPause(Playable playable, FrameData info)
- {
- // OnBehaviourPause can be called if the graph is stopped for a variety of reasons
- // the effectivePlayState will test if the pause is due to the clip being out of bounds
- if (gameObject != null && info.effectivePlayState == PlayState.Paused)
- {
- gameObject.SetActive(false);
- }
- }
- /// <summary>
- /// This function is called during the ProcessFrame phase of the PlayableGraph.
- /// </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>
- /// <param name="userData">unused</param>
- public override void ProcessFrame(Playable playable, FrameData info, object userData)
- {
- if (gameObject != null)// && !gameObject.activeSelf)
- gameObject.SetActive(true);
- }
- /// <summary>
- /// This function is called when the PlayableGraph that owns this PlayableBehaviour starts.
- /// </summary>
- /// <param name="playable">The playable this behaviour is attached to.</param>
- public override void OnGraphStart(Playable playable)
- {
- if (gameObject != null)
- {
- if (m_InitialState == InitialState.Unset)
- m_InitialState = gameObject.activeSelf ? InitialState.Active : InitialState.Inactive;
- }
- }
- /// <summary>
- /// This function is called when the Playable that owns the PlayableBehaviour is destroyed.
- /// </summary>
- /// <param name="playable">The playable this behaviour is attached to.</param>
- public override void OnPlayableDestroy(Playable playable)
- {
- if (gameObject == null || m_InitialState == InitialState.Unset)
- return;
- switch (postPlayback)
- {
- case PostPlaybackState.Active:
- gameObject.SetActive(true);
- break;
- case PostPlaybackState.Inactive:
- gameObject.SetActive(false);
- break;
- case PostPlaybackState.Revert:
- gameObject.SetActive(m_InitialState == InitialState.Active);
- break;
- }
- }
- }
- }
|