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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|