Version: 5.5
Playable API
Graph Visualizer

Creando Playables de animación personalizados

Usted puede crear Playables de una animación personalizada utilizando la clase CustomAnimationPlayable en el Unity Script Reference (API).

Cómo utilizar

En el Script Reference (API), utilice la sobrecarga en el método PrepareFrame para manejar los nodes a media que nos necesita.

En el ejemplo script de abajo, la meta es tener clips de animación reproduciéndose uno tars otro. Usted puede cambiar el peso de los nodos para que solo un clip se reproduzca a la vez, y ajustar el tiempo local de los clips para que empiecen en el momento que son activados.

Los Custom Playables (Playables personalizados) también puede utilizar los métodos OnSetPlayState y OnSetTime para especifica comportamientos personalizados cuando un estado de un Playable o tiempo local ha cambiado.

using UnityEngine;
using UnityEngine.Experimental.Director;
 
public class PlayQueuePlayable : CustomAnimationPlayable
{
    public int m_CurrentClipIndex = -1;
    public float m_TimeToNextClip;
    public AnimationMixerPlayable m_Mixer;

    public PlayQueuePlayable()
    {       
        m_Mixer = AnimationMixerPlayable.Create();
        AddInput(m_Mixer);
    }

    public void SetInputs(AnimationClip[] clipsToPlay)
    {
        foreach (AnimationClip clip in clipsToPlay)
        {
            m_Mixer.AddInput(AnimationClipPlayable.Create(clip));
        }
    }
 
    override public void PrepareFrame(FrameData info)
    {   
        // Advance to next clip if necessary
        m_TimeToNextClip -= (float)info.deltaTime;
        if (m_TimeToNextClip <= 0.0f)
        {
            m_CurrentClipIndex++;
            if (m_CurrentClipIndex < m_Mixer.inputCount)
            {
                var currentClip = m_Mixer.GetInput(m_CurrentClipIndex).CastTo<AnimationClipPlayable>();
 
                // Reset the time so that the next clip starts at the correct position
                currentClip.time = 0;
                m_TimeToNextClip = currentClip.clip.length;
            }
            else
            {
                // Pause when queue is complete
                state = PlayState.Paused;
            }
        }
 
        // Adjust the weight of the inputs
        for (int a = 0; a < m_Mixer.inputCount; a++)
        {
            if (a == m_CurrentClipIndex)
                m_Mixer.SetInputWeight(a, 1.0f);
            else
                m_Mixer.SetInputWeight(a, 0.0f);
        }
    }
}
 
 
[RequireComponent (typeof (Animator))]
public class PlayQueue : MonoBehaviour
{
    public AnimationClip[] clipsToPlay;

    void Start ()
    {
        var playQueue =  Playable.Create<PlayQueuePlayable>();
        playQueue.SetInputs(clipsToPlay);

        // Bind the queue to the player
        GetComponent<Animator>().Play(playQueue);
    }
}



Vida útil de un Playable

Cuando un Playable se crea utilizando la Unity Script Reference (API), Unity internamente le hace seguimiento a las conexiones hechas a ese Playable. Cuando una nueva escena se carga, Unity automáticamente suelta los recursos asignados a todos los Playables.

No obstante, es una buena práctica llamar Playable.Destroy() explícitamente cuando haya terminado con un Playable en particular en una escena. Esto le ayuda a Unity re-utilizar recursos internos por lo que ayuda a evitar cualquier ralentización innecesaria de su proyecto.

TENGA EN CUENTA: Usted utiliza Playable.Destroy() de una manera similar a Object.Destroy().

Playable API
Graph Visualizer