# PlayableBehaviour

> PlayableBehaviour is the base class from which every custom playable script derives.

## Definition

* **Type:** Class
* **Namespace:** [UnityEngine.Playables](/engine/6000.0/script-reference/unityengine/playables.md)
* **Assembly:** UnityEngine.CoreModule
* **Implements:** [IPlayableBehaviour](/engine/6000.0/script-reference/unityengine/playables/iplayablebehaviour.md), [ICloneable](https://learn.microsoft.com/dotnet/api/system.icloneable)

```csharp
public abstract class PlayableBehaviour : IPlayableBehaviour, ICloneable
```

## Remarks

A PlayableBehaviour can be used to add user-defined behaviour to a [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md).

A PlayableBehaviour must be part of a branch of a [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md) that is connected to an output to be active.

In the following example, two [AnimationClip](/engine/6000.0/script-reference/unityengine/animationclip.md) are controlled by two [AnimationClipPlayable](/engine/6000.0/script-reference/unityengine/animations/animationclipplayable.md), which are blended by a [AnimationMixerPlayable](/engine/6000.0/script-reference/unityengine/animations/animationmixerplayable.md).  A custom BlenderPlayableBehaviour is modifying the inputs weigth of the [AnimationMixerPlayable](/engine/6000.0/script-reference/unityengine/animations/animationmixerplayable.md) every frame.

## Examples

```csharp
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.Playables;

public class BlenderPlayableBehaviour : PlayableBehaviour
{
    public AnimationMixerPlayable mixerPlayable;

    public override void PrepareFrame(Playable playable, FrameData info)
    {
        float blend = Mathf.PingPong((float)playable.GetTime(), 1.0f);

        mixerPlayable.SetInputWeight(0, blend);
        mixerPlayable.SetInputWeight(1, 1.0f - blend);

        base.PrepareFrame(playable, info);
    }
}

public class PlayableBehaviourSample : MonoBehaviour
{
    PlayableGraph m_Graph;
    public AnimationClip clipA;
    public AnimationClip clipB;

    // Use this for initialization
    void Start()
    {
        // Create the PlayableGraph.
        m_Graph = PlayableGraph.Create();

        // Add an AnimationPlayableOutput to the graph.
        var animOutput = AnimationPlayableOutput.Create(m_Graph, "AnimationOutput", GetComponent<Animator>());

        // Add an AnimationMixerPlayable to the graph.
        var mixerPlayable = AnimationMixerPlayable.Create(m_Graph, 2);

        // Add two AnimationClipPlayable to the graph.
        var clipPlayableA = AnimationClipPlayable.Create(m_Graph, clipA);
        var clipPlayableB = AnimationClipPlayable.Create(m_Graph, clipB);

        // Add a custom PlayableBehaviour to the graph.
        // This behavior will change the weights of the mixer dynamically.
        var blenderPlayable = ScriptPlayable<BlenderPlayableBehaviour>.Create(m_Graph, 1);
        blenderPlayable.GetBehaviour().mixerPlayable = mixerPlayable;

        // Create the topology, connect the AnimationClipPlayable to the
        // AnimationMixerPlayable.  Also add the BlenderPlayableBehaviour.
        m_Graph.Connect(clipPlayableA, 0, mixerPlayable, 0);
        m_Graph.Connect(clipPlayableB, 0, mixerPlayable, 1);
        m_Graph.Connect(mixerPlayable, 0, blenderPlayable, 0);

        // Use the ScriptPlayable as the source for the AnimationPlayableOutput.
        // Since it's a ScriptPlayable, also set the source input port to make the
        // passthrough to the AnimationMixerPlayable.
        animOutput.SetSourcePlayable(blenderPlayable);
        animOutput.SetSourceInputPort(0);

        // Play the graph.
        m_Graph.Play();
    }

    private void OnDestroy()
    {
        // Destroy the graph once done with it.
        m_Graph.Destroy();
    }
}
```

## Methods

| Method                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ----------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [OnBehaviourPause](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/onbehaviourpause.md)   | This method is invoked when one of the following situations occurs:   The effective play state during traversal is changed to [PlayState.Paused](/engine/6000.0/script-reference/unityengine/playables/playstate/paused.md). This state is indicated by [FrameData.effectivePlayState](/engine/6000.0/script-reference/unityengine/playables/framedata/effectiveplaystate.md).  The [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md) is stopped while the playable play state is Playing. This state is indicated by [PlayableGraph.IsPlaying](/engine/6000.0/script-reference/unityengine/playables/playablegraph/isplaying.md) returning true. |
| [OnBehaviourPlay](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/onbehaviourplay.md)     | This function is called when the [Playable](/engine/6000.0/script-reference/unityengine/playables/playable.md) play state is changed to [PlayState.Playing](/engine/6000.0/script-reference/unityengine/playables/playstate/playing.md).                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| [OnGraphStart](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/ongraphstart.md)           | This function is called when the [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md) that owns this PlayableBehaviour starts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| [OnGraphStop](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/ongraphstop.md)             | This function is called when the [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md) that owns this PlayableBehaviour stops.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| [OnPlayableCreate](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/onplayablecreate.md)   | This function is called when the [Playable](/engine/6000.0/script-reference/unityengine/playables/playable.md) that owns the PlayableBehaviour is created.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| [OnPlayableDestroy](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/onplayabledestroy.md) | This function is called when the [Playable](/engine/6000.0/script-reference/unityengine/playables/playable.md) that owns the PlayableBehaviour is destroyed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| [PrepareData](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/preparedata.md)             | This function is called during the PrepareData phase of the [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| [PrepareFrame](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/prepareframe.md)           | This function is called during the PrepareFrame phase of the [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [ProcessFrame](/engine/6000.0/script-reference/unityengine/playables/playablebehaviour/processframe.md)           | This function is called during the ProcessFrame phase of the [PlayableGraph](/engine/6000.0/script-reference/unityengine/playables/playablegraph.md).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
