【重要】 Playables API は「試験的な」機能として Unity 5.2 に搭載されています。したがって、将来的に API が変更される可能性もあります。
Playable API システムでは、どんな基本タイプからでも派生カスタム playable を作ることができます。以下の例は、AnimationMixerPlayable から派生させて、次々にクリップを再生する特殊な種類のミキサーを作成する方法を示しています。
PrepareFrame 方式をオーバーロードすると、ノードを自由に扱うことができます。この参考例では、アニメーションクリップを次々に再生することが目的です。ノードのウェイトを変えることで一度にひとつのクリップのみが再生されるようにし、クリップのローカルタイムを調整することでアクティベートと同時に開始されるようにします。
また同様にカスタム Playable は、 OnSetPlayState 方式と OnSetTime 方式の実装も可能です。これにより、Playable の状態やローカルタイムが変更されたときにカスタム挙動を実装することができます。
using UnityEngine;
using UnityEngine.Experimental.Director;
public class PlayQueuePlayable : AnimationMixerPlayable
{
public int m_CurrentClipIndex = -1;
public float m_TimeToNextClip;
public void PrepareFrame(FrameData info)
{
Playable[] inputs = GetInputs();
// Advance to next clip if necessary
m_TimeToNextClip -= (float)info.deltaTime;
if (m_TimeToNextClip <= 0.0f)
{
m_CurrentClipIndex++;
if (m_CurrentClipIndex < inputs.Length)
{
var currentClip = inputs[m_CurrentClipIndex] as AnimationClipPlayable;
// Reset the time so that the next clip starts at the correct position
inputs[m_CurrentClipIndex].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 < inputs.Length; a++)
{
if (a == m_CurrentClipIndex)
SetInputWeight(a, 1.0f);
else
SetInputWeight(a, 0.0f);
}
}
}
[RequireComponent (typeof (Animator))]
public class PlayQueue : MonoBehaviour
{
public AnimationClip[] clipsToPlay;
void Start ()
{
var playQueue = new PlayQueuePlayable();
playQueue.SetInputs(clipsToPlay);
// Bind the queue to the player
GetComponent<Animator>().Play(playQueue);
}
}
Playable が API によって作成されると Unity は、その Playable に対して行われた接続を内部的に記録します。新しいシーンが読み込まれると、すべての Playable に割り当てられたリソースが Unity によって自動的にリリースされます。
ただし、特定の Playable の使用が終わったら Playable.Dispose() を手動で呼び出すことで Unity が内部リソースを再利用できるようにするのはよいことです。Playable.Dispose は、 Object.Destroy() を使ったオブジェクト管理に近いです。