You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
5.6 KiB
145 lines
5.6 KiB
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; |
|
} |
|
} |
|
} |
|
}
|
|
|