146 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// The GameObject to control.
 | |
|         /// </summary>
 | |
|         public GameObject gameObject = null;
 | |
| 
 | |
|         /// <inheritdoc cref="ActivationControlPlayable.PostPlaybackState"/>
 | |
|         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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |