【Unity】Playable と Timelineについて

これまで触ってなかったUnityの「TimeLine」について調べる機会がありました。 その中で「Playable」についてブログに書いていきたいと思います。

Playable API

調べるとUnityには「Playable API」と呼ばれるものがあるのがわかりました。 これは、アニメーションを処理Animator Controllerとかで使われている内部処理を行っているのがPlayable Apiです。

Animation Controller

個人的にAnimator Controllerも余り触ったことないのですが、次の画像のようにStateでAnimationを管理しています。

f:id:albatrus:20210707121036p:plain
Animator ControllerのWindow

PlayableGraph

PlayableGraph を使用すると、複数のデータソースをミックス、ブレンド、変更し、1 つの出力として再生できます。 例えばAnimator Controllerで行うことのできるAnimationの再生やブレンドなどが実装できます。Animationだけではなく、Audioや独自に定義したScriptなどを組み合わせることができます。

また、Scriptで生成ができるので、ゲーム再生中などで動的に作成することができます。ですので、AnimatorControllerのように事前にAssetを用意しておく必要はありません。

Playable API - Unity マニュアル

PlayableGraph visualizer

PlayableGraphのPlayableがノードベースで確認できるWindowです。 PackageManagerからインストールできます。

GitHub - Unity-Technologies/graph-visualizer: Visualizer for your Playable graphs

f:id:albatrus:20210707125454p:plain
PlayableGraph Visualizer

PlayableGraphの生成
var playableGraph = PlayableGraph.Create()
PlayableGraphの再生
playableGraph.Play();

Playable

playable は IPlayable インターフェースを実装する C# 構造体です。 Playableを組み合わせてPlayableGraphを作っていきます。

主なPlayable
  • AnimationClipPlayable
  • AnimationMixerPlayable
  • CameraPlayable
  • TextureMixerPlayable
PlayableGraphにPlayableを紐付ける

playableを生成するときに、PlayableGraphを紐付けます。

var animationClipPlayable = AnimationClipPlayable.Create(playableGraph, clip);

PlayableOutput

PlayableGraphはPlayableOutputを使って出力を行います。 出力形式に応じてOutputクラスが違います。

主なPlayableOutput
  • AnimationPlayableOutput
  • AudioPlayableOutput
  • ScriptPlayableOutput
  • TexturerPlayaleOutput
PlayableGraphにPlayableOutputを紐付ける

playableOutputを生成するときに、PlayableGraphを紐付けます。

var playableOutput = AnimationPlayableOutput.Create(playableGraph, "Name", animator);

簡単な例

AnimationClipを再生するPlayableGraphです。

// 生成
_playableGraph = PlayableGraph.Create();
        
// PlayableGraphに PlayableとOutputを紐付ける
var animationClipPlayable = AnimationClipPlayable.Create(_playableGraph, _clip);
var animationPlayableOutput =
AnimationPlayableOutput.Create(_playableGraph, "Animation", GetComponent<Animator>());
        
// 出力設定
animationPlayableOutput.SetSourcePlayable(animationClipPlayable);

// 再生
_playableGraph.Play();

f:id:albatrus:20210708123532p:plain
シンプルなPlayableGraph

Playable詳細

visualizerの中でノードをチェックすると詳細を見ることができます。 AnimationClipの場合、Timeが渡されています。このTimeを元にアニメーションを再生しています。

f:id:albatrus:20210708123739p:plain:w300
Timeのところが更新されている

PlayableとTimeline

最後に本来調べていた項目であるTImelineとの関係です。 まず何もないTimelineをVisualizerで見ると次のように表示されます。

f:id:albatrus:20210708130257p:plain
空のTimeline

Visualizerに表示されるということはTimeLineはPlayableGraphで構成されていそうです。

Trackを追加してみる

試しにActivation TrackをTimelineに追加をしてみると、PlayableGraphの構成が変わりました。

f:id:albatrus:20210708151808p:plain
Activation trackを追加した場合

挙動だけを見ると「ActivationMixer」と「Playable」が追加された感じです。

複数追加すると

次にもう一つActivation Trackを追加してみます。

f:id:albatrus:20210708152301p:plain:w400
Trackが2つの場合

TimelineのTrackごとにOutputが設定されます。 今回は同じTrackを追加したのでOutputはScriptOutputになっています。

TimelinePlayable

Outputする前にかならずTimelinePlayableを通っています。 TimelinePlayableでは、 TrackとそのClipを担当しているPlayableを作成してリンクする役割をしています。

docs.unity3d.com

最後に

今回調べてみて、Playableについてなんとなくその概要がわかってきました。 次はTimelineで使われているPlayableを拡張周りをどうやってやるのかや、実際にPlayableを使ったらないができるかなどが気になりましたので、その辺り調査したいと思っています。