渋谷ほととぎす通信

エンジニア社長によるUnityとAIのブログ & エンジニアの生存戦略

そろそろ始めないか?Playable API入門【Unity】

そろそろ始めないか?Playable API入門【Unity】

こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Playable APIのことがよくわからない
  • Playable APIを体系的に学びたい
  • Playable APIを使うとAnimatorControllerから卒業できる?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityの「Playable API」って使っていますか?オオバ的にはすごく便利なのにあまり使われていない印象です。実はPlayable APIはUnity2017に登場し執筆時点で 約8年も経過 しています。

    いざ 「Playable APIを使ってみよう」 と思っても次のような状況になりませんか?

    • 日本語情報が少なくて詰む
    • Playable APIの入門教材が見つからなくて始められない
    • ざっくりPlayable APIの全体像を掴めない

    そこで本記事はUnity歴12年のオオバが Playable API入門 ということで、Playable APIを 体系的に学べるコンテンツ として執筆しました。

    こんな方におすすめの記事

    ・Playable APIの始め方がわからない

    ・Playable APIに興味がある

    ・Playable APIはどんなことができるのか知りたい

    このような方にはピッタリの記事になると思います。

    楽しみにしててください。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    Unity公式が提供「Playable API」とは?

    Playable APIはデータを ツリー構造で構築 して動作させることのできるシステムです。有名どころでいうとUnity Timelineで使用されている技術です。 汎用性が高い ためUnity Timelineだけでなく ぼくたち開発者も利用できる便利機能 です。

    そろそろ始めないか?Playable API入門【Unity】_0

    オオバも過去に何度もPlayable APIを使った案件に携わりました。主にアニメーション制御で使われることが多かった印象です。

    例えばAnimatorControllerのステートマシンでは制御しづらいアニメーション遷移もPlayable APIを使うと 非常にシンプルに実装 できます。AnimatorControllerののステートマシンが スパゲッティ状態 になって苦労したことはありませんか?

    オオバ
    オオバ
    ステートマシンのスパゲッティはPlayable APIで解決できるかもしれません

    アニメーション制御以外にもPlayable APIは ゲーム開発に活用できるシステム です。Playable APIを知ることであなたの 開発手法の手札が増える ことでしょう。ぜひとも最後まで読んでいただければと思います。

    Playable APIを理解するために重要な大前提

    まず最初にPlayable APIを使う上で必ず理解していないといけないことが1つあります。それは、

    「Playable APIにはインプットとアウトプットが必要」

    ということです。

    • Playable APIが動かない
    • 思った通りのグラフ構成にならない

    このようなトラブルはよく起きます。そんな時は基礎に立ち返って 「インプット」「アウトプット」 が存在するかな?ということを確認してみましょう。

    Playable APIにはいくつか登場人物が出てきます。 彼らの関係性を正しく把握 することが Playable APIの学習効率を大幅にアップ してくれます。オオバも関係性を把握した前後でPlayable APIの理解度は大きく向上しました。

    このPlayable APIの大前提を踏まえた上で、主要人物の関係性、具体的な実装方法についてわかりやすく解説していきます。

    この後実際に解説していきますが、あなたにやっていただきたいことは 登場人物同士の関係性のイメージ化 です。イメージ化することで複雑なものもスッと覚えられるためとてもオススメの学習方法です。

    Playable APIに登場する3人の主要人物の関係性

    具体的なPlayable APIの解説に入る前に、Playable APIに登場する主要人物の関係性を頭の中で イメージ化 しておきましょう。

    Playable APIの主要登場人物は たったの3人 です。

    • PlayableGraph
    • Playable(インプット)
    • PlayableOutput(アウトプット)

    Playable がインプット PlayableOutput がアウトプットにあたります。この3人の関係性を図に表すと以下のようになります。

    そろそろ始めないか?Playable API入門【Unity】_1

    Playable(インプット)、PlayableOutput(アウトプット)共に PlayableGraphを通して作成 します。つまり PlayableGraphがPlayable APIの中心 。PlayableGraphが「インプット」と「アウトプット」を繋ぎ合わせる 仲人役 ということです。

    このイメージをしっかりと頭に焼き付けておきましょう。このイメージさえあれば今後複雑なグラフが登場、またはあなた自身がグラフを作成するときに混乱しづらくなります。

    この3人の登場人物をどのような手順でPlayable APIとして構築するのか解説していきます。

    初めての「Playable API」6ステップ

    本章では具体的にPlayable APIを始めます。前章で紹介した3人の登場人物は次の 6ステップ を踏むことでで Playable APIとして動作 します。

    1. PlayableGraphの作成
    2. Playable(インプット)の作成
    3. PlayableOutput(アウトプット)の作成
    4. インプットをアウトプットに接続
    5. PlayableGraphを通して再生
    6. 使い終わったらPlayableGraphを破棄

    ここではAnimationClipを再生するPlayableを例に具体的なコードで解説していきます。

    通常AnimationClipは「Animator」「AnimatorController」の2つが必要ですがPlayable APIを使う場合は 「Animator」だけで再生できます。

    そろそろ始めないか?Playable API入門【Unity】_2
    本サンプルは実行すると上図のように、AnimationClipが再生するPlayable APIです。Unityちゃんモデルを使わせてもらっています。

    非常にシンプルな作りになっているため、初めてのPlayable APIとして最適な教材にです。できるだけわかりやすく解説しているので、ぜひ手元で実行しながら試してみてください。

    ソースコードは全文こちらで公開していますので、ぜひ参考にしてみてください。

    1.PlayableGraphの作成

    Playable APIを始める上でまず最初にやるべきことは PlayableGraphの作成 です。早速ソースコードを確認していきます。

    [SerializeField] private AnimationClip _clip;  
    [SerializeField] private Animator _animator;  
    private PlayableGraph _graph;  
    
    void Awake()  
    {
        // 1.PlayableGraphの作成  
        _graph = PlayableGraph.Create("TestGraph");  
    }
    

    PlayableGraphの作成にはPlayableGraphの Create関数 を使って作成します。Create関数の引数には任意の文字列でグラフ名をつけておきましょう。

    そろそろ始めないか?Playable API入門【Unity】_3
    上図のように現状は3人の登場人物の内の1人を作成した状態です。

    2.Playable(インプット)の作成

    次にインプットを作成します。今回のインプットはAnimationClipをインプットとして扱う「AnimationClipPlayable」です。

    [SerializeField] private AnimationClip _clip;  
    [SerializeField] private Animator _animator;  
    private PlayableGraph _graph;  
    
    void Awake()  
    {
        _graph = PlayableGraph.Create("TestGraph");  
        // 2.Playable(インプット)の作成  
        var playable = AnimationClipPlayable.Create(_graph, _clip);  
    }
    

    Create関数を使って AnimationClipPlayable を作成します。インプット、アウトプット全般に言えることですが、引数にPlayableGraphを代入するということを覚えておきましょう。

    記事冒頭でお伝えした、PlayableGraph、インプット、アウトプット3者の関係性を思い出してみてください。インプット・アウトプットがそれぞれPlayableGraphを元に作成されていました。だからインプット、アウトプット生成時にPlayableGraphが必要となるのです。

    今回使用するインプット「AnimationClipPlayable」にはPlayableGraphに加えてAnimationClipを引数として代入しましょう。

    そろそろ始めないか?Playable API入門【Unity】_4
    現状、PlayableGraphとインプットの2者が作成された状態です。

    3.PlayableOutput(アウトプット)の作成

    次にアウトプットを作成します。Animation専用のアウトプットということで、AnimationPlayableOutput を使用します。

    [SerializeField] private AnimationClip _clip;  
    [SerializeField] private Animator _animator;  
    private PlayableGraph _graph;  
    
    void Awake()  
    {
        _graph = PlayableGraph.Create("TestGraph");  
        var playable = AnimationClipPlayable.Create(_graph, _clip);  
        // 3.PlayableOutput(アウトプット)の作成  
        var output = AnimationPlayableOutput.Create(_graph, "AnimationOutput", _animator);  
    }
    

    アウトプットも同様、Createメソッドを使ってAnimationPlayableOutputを作成します。AnimationPlayableOutputは最終的にAnimatorにデータを反映させるため引数にAnimatorを指定します。またアウトプットには名前を付ける必要があるため、文字列を第2引数に代入しています。

    そろそろ始めないか?Playable API入門【Unity】_5
    ↑上図のように現状インプット、アウトプット共にPlayableGraphを参照して作成しただけの状態です。

    まだPlayabale APIは動作しません。

    4.インプットをアウトプットに接続

    次に インプットをアウトプットに接続 します。冒頭でお伝えした大前提の通りPlayable APIは インプットとアウトプットが存在している状態 、つまりインプットとアウトプットが接続された状態にする必要があります。

    [SerializeField] private AnimationClip _clip;  
    [SerializeField] private Animator _animator;  
    private PlayableGraph _graph;  
    
    void Awake()  
    {
        _graph = PlayableGraph.Create("TestGraph");  
        var playable = AnimationClipPlayable.Create(_graph, _clip);  
        var output = AnimationPlayableOutput.Create(_graph, "AnimationOutput", _animator);  
        // 4.PlayableOutputにPlayableを接続  
        output.SetSourcePlayable(playable);  
    }
    

    アウトプット側で用意された SetSourcePlayable関数 を使ってインプットを接続しましょう。

    そろそろ始めないか?Playable API入門【Unity】_6
    この作業で↑上図ようにPlayable APIの準備が整いました。

    5.PlayableGraphを通して再生

    インプット、アウトプットの準備が完了したら、最後に再生処理を実行します。再生、停止はPlayableGraphを通しておこないます。

    [SerializeField] private AnimationClip _clip;  
    [SerializeField] private Animator _animator;  
    private PlayableGraph _graph;  
    
    void Awake()  
    {
        _graph = PlayableGraph.Create("TestGraph");  
        var playable = AnimationClipPlayable.Create(_graph, _clip);  
        var output = AnimationPlayableOutput.Create(_graph, "AnimationOutput", _animator);  
        output.SetSourcePlayable(playable);  
        // 5.PlayableGraphを通して再生  
        _graph.Play();  
    }
    

    PlayStop を実行することでPlayable APIの再生、停止が動作します。

    そろそろ始めないか?Playable API入門【Unity】_7

    実行するとUnityちゃんがアニメーションを始めます。

    6.使い終わったらPlayableGraphをDestroyで破棄

    最後にPlayable APIを使い終わったらやるべきことがあります。それは PlayableGraphを開発者自身が破棄すること です。具体的にはPlayableGraphの Destroyメソッド を実行します。

    [SerializeField] private AnimationClip _clip;  
    [SerializeField] private Animator _animator;  
    private PlayableGraph _graph;  
    
    void Awake()  
    {
        _graph = PlayableGraph.Create("TestGraph");  
        var playable = AnimationClipPlayable.Create(_graph, _clip);  
        var output = AnimationPlayableOutput.Create(_graph, "AnimationOutput", _animator);  
        output.SetSourcePlayable(playable);  
        _graph.Play();  
    }
    
    void OnDestroy()  
    {
        // 6.使い終わったらPlayableGraphを破棄  
        _graph.Destroy();  
    }
    

    今回の例では本コンポーネント自身がDestroyされたタイミングでPlayableGraphを破棄しました。破棄しなかった場合 メモリリーク につながるため注意してください。

    Playable API作成6ステップのまとめ

    Playable APIを作成する手順を、AnimationClipPlayableを使って6ステップで解説しました。簡単にまとめるとこんな感じです。

    Playable API作成6ステップのまとめ

    ①まず最初にPlayableGraphの作成

    ②AnimationClipPlayable(インプット)の作成

    ③AnimationPlayableOutput(アウトプット)の作成

    ④アウトプットにインプットを接続

    ⑤PlayableGraphを通して再生

    ⑥使い終わったらPlayableGraphを破棄

    最終状態を図解すると以下のような感じです。
    そろそろ始めないか?Playable API入門【Unity】_8

    AnimationClipPlayableにはAnimationClip、AnimationOutputにはAnimatorを作成時に指定することを忘れないでください。

    紹介した例はあくまで基本形のPlayable APIです。しかし基本が超大事。基本をしっかり抑えておくことで応用も効きやすくなります。

    実際に自分で独自のPlayable APIを構築するときには応用力が必要です。

    そろそろ始めないか?Playable API入門【Unity】_9
    その時のためにも頭の中で今まで紹介した図解を頭の中で イメージ化 しておきましょう。

    ここまで紹介したソースコード全文はこちらです。

    複数のインプットを使ったPlayable API

    そろそろ始めないか?Playable API入門【Unity】_10

    前章ではAnimationClipを1つを再生するシンプルなPlayable APIでした。次は複数のAnimationClipのブレンド、つまり 複数のインプットを使ったPlayable API を紹介します。

    Playable APIは複数のインプットを組み合わせることが可能です。よくある例として複数のAnimationClipをブレンドするPlayable APIを例に解説します。

    まずは図解を使って複数インプットのPlayable APIのイメージを掴みましょう。
    そろそろ始めないか?Playable API入門【Unity】_11

    変更点は左側のインプットだけ。AnimationMixerPlayableに2つのAnimationClipPlayableが接続された状態です。

    最終的にAnimationMixerPlayableがアウトプットに接続されます。

    複数のインプットを使ったPlayable APIの作成6ステップ

    基本的にインプットがいくつになっても手順は同じです。

    1. PlayableGraphの作成
    2. Playable(インプット)の作成
    3. PlayableOutput(アウトプット)の作成
    4. アウトプットにインプットを接続
    5. PlayableGraphを通して再生
    6. 使い終わったらPlayableGraphを破棄

    変更点は「2. Playable(インプット)の作成」だけで、その他は今まで紹介した手順と同じです。

    ここではインプットのの作成だけを解説しますが、後で紹介する全体コードをと見比べながら確認してみてください。

    以下のコードはインプット作成部分になります。

    // 2.Playable(インプット)の作成  
    
    // 2-1 AnimationMixerPlayableを作成  
    // 2つのPlayableが入力として接続されるので引数に「2」を指定  
    _mixerPlayable = AnimationMixerPlayable.Create(_graph, 2);  
    // ブレンドする2つのAnimationClipPlayableを作成  
    var playable1 = AnimationClipPlayable.Create(_graph, _clip1);  
    var playable2 = AnimationClipPlayable.Create(_graph, _clip2);  
    
    // 2-2.Playable同士の接続(mixerPlayableにplayable1とplayable2を接続)  
    _mixerPlayable.ConnectInput(0, playable1, 0);  
    _mixerPlayable.ConnectInput(1, playable2, 0);  
    
    // 2-3.ブレンド率を設定  
    _mixerPlayable.SetInputWeight(0, 1f);  
    _mixerPlayable.SetInputWeight(1, 0f);  
    

    一見複雑そうに見えますが、実はとてもシンプルです。以下の図解の赤枠で囲まれた部分を実装した形になります。
    そろそろ始めないか?Playable API入門【Unity】_12

    以降の章で詳しく解説していきます。

    ConnectInputでインプット同士を接続

    今回新しく登場した関数 ConnectInput でPlayable(インプット)同士を接続しています。各AnimationClipPlayableをAnimationMixierPlayableに接続しているのです。

    ↓↓ConnectInputの文法はこちら。

    そろそろ始めないか?Playable API入門【Unity】_13

    以下のコードではAnimationMixerPlayableにAnimationClipPlayableを接続しています。

    _mixerPlayable.ConnectInput(0, playable1, 0);  
    

    入力ポートとは接続元を特定するための数字。複数のAnimationClipPlayableを接続するため、それらを識別するために必要なのです。出力ポートは出力先の指定ですが、出力先は基本的に1つのため「0」を代入します。

    ウェイトを指定して複数のPlayableをブレンドする

    複数のインプットはそれぞれウェイト(重み)を変更してブレンドできます。具体的には↓次のようなアニメーションの合成処理です。

    そろそろ始めないか?Playable API入門【Unity】_14

    走る、歩くをブレンドしています。

    これを実現しているのが SetInputWeight です。

    ↓↓SetInputWeightの文法はこちら。
    そろそろ始めないか?Playable API入門【Unity】_15

    複数接続されたPlayableに対し入力ポートを指定してウェイトを設定します。ウェイトは0〜1の間で指定しましょう。

    具体的なソースコードはこちらです。

    [SerializeField, Range(0, 1f)] private float _weight = 0f;  
    
    void Update()  
    {
        // ブレンド率を更新  
        _mixerPlayable.SetInputWeight(0, _weight);  
        _mixerPlayable.SetInputWeight(1, 1f - _weight);  
    }
    

    2つのAnimationClipPlayableのウェイトをUpdate関数で更新しています。AnimatorControllerのステートマシンでも同様のブレンドは可能ですが任意のタイミングで細かく調整できるのはPlayable APIのメリットです。

    ソースコード全文はこちらから確認できます。

    Playable APIを使うとAnimatorControllerのステートマシンから解放

    先ほど紹介した AnimationMixerPlayable を使用すると、従来アニメーションの遷移で使用されていたステートマシンを使わずともAnimationClipを再生できるようになります。

    そもそもPlayable API以前はAnimationClipを1つ再生するにも次の手順が必要で手間でした。

    Playable API以前のAnimationClipを再生するまでの手順

    ・AnimationClipの用意

    ・Animatorコンポーネント

    ・AnimatorControllerの作成

    ・AnimatorController内にステートの作成

    ・AnimationClipとステートの関連付け

    AnimationClipPlayableを使うことで簡単にAnimationClipを再生できます。

    またAnimationMixerPlayableを使うと AnimationClipのブレンドも可能 です。スクリプトからアニメーション遷移を制御できるため自由度が広がります。

    Playable APIはアニメーションに特化したものではなく汎用システムですが、アニメーションへの活用だけでも非常に有用なのでぜひ試してみてください。

    独自インプット作成時にもう1人の主要人物が登場

    今までPlayable APIの主要メンバーは3人とお伝えしてきましたが、実は4人目が存在します。それは 「PlayableBehaviour」 です。

    • AnimationClipをインプットとして扱う「AnimationClipPlayable」
    • AudioClipをインプットとして扱える「AudioClipPlayable」

    上記のような Unity側が用意したインプット ではなく あなた自身の独自のインプット を作成する場合に「PlayableBehaviour」は登場します。

    PlayableBehaviourはインプット内の挙動(Behaviour)を定義するクラスです。PlayableBehaviourを加えた4人の関係性はこのようになります。

    そろそろ始めないか?Playable API入門【Unity】_16

    Playableの挙動を定義するため、Playable(インプット)内で管理されます。

    PlayableBehaviourを使うと次のようなことが可能です。

    PlayableBehaviourで出来ること

    ・Playable生成時に処理を実行

    ・Playable実行開始または停止時に処理を実行

    ・Playable実行中に都度処理を実行

    ・Playableを破棄した時に処理を実行

    さまざまなタイミングで処理を実行できることはわかりましたが、具体的にどう活用したら良いか分かりづらいですよね。

    そこでPlayableBehaviourを使った簡単なサンプルを紹介します。つまりここからは 独自のPlayable APIの活用編 ということです。

    独自Playableの作成手順7ステップ

    独自のPlayableは7つのステップで作成します。

    1. PlayableGraphの作成
    2. PlayableBehaviourの作成
    3. ScriptPlayableの作成
    4. PlayableBehaviourのセットアップ
    5. アウトプットの作成
    6. ScriptPlayableをアウトプットに接続
    7. PlayableGraphの再生

    サンプルとして作成するのはこちら。オブジェクトが画面を左右に行ったり来たりする簡単な独自Playableです。

    そろそろ始めないか?Playable API入門【Unity】_17

    一度Playable APIの作成方法は紹介しているため、今回新規で登場する「2.PlayableBehaviourの作成」から重点的に解説していきます。

    2.PlayableBehaviourの作成(「1.」は割愛)

    独自Playableを作るためにまずは、PlayableBehaviourを作成します。

    お悩みさん
    お悩みさん
    PlayableBehaviourってなんだっけ?
    オオバ
    オオバ
    PlayableBehaviourはPlayableの挙動を定義するクラスだよ

    PlayableBehaviourは独自のPlayableを作成する際に、どういう挙動にするかを定義するクラスです。

    具体的にはPlayableBehaviourを継承して作ります。親クラスである PlayableBehaviour に実行したい各タイミングの関数が定義されていて使いたい関数だけをオーバーライドして使用します。

    public class CustomPlayableBehaviour : PlayableBehaviour  
    {
        private float _direction = 1f;  
        public Transform target;  
    
        public override void ProcessFrame(Playable playable, FrameData info, object playerData)  
        {
            if (target != null)  
            {
                // 左右を行ったり来たりさせる  
                if (target.position.x >= 1f || target.position.x <= -1f)  
                {
                    _direction *= -1f;  
                }
    
                target.Translate(Vector3.right * info.deltaTime * _direction);  
            }
        }
    }
    

    今回はフレーム単位で実行する ProcessFrame をオーバーライドして実装しています。

    Transform(target変数)のX座標が-1または1を越えたタイミングで進む方向を逆転するシンプルなロジックです。

    PlayableBehavioiurに定義されている9つの関数

    PlayableBehaviourには ProcessFrame 以外にもさまざまな関数が用意されています。それぞれ実行タイミング、実行順をまとめてみました。

    独自のPlayableを作成する際に参考にしてみてください。

    実行順関数名実行タイミング複数回実行
    1OnPlayableCreatePlayable作成時
    2OnGraphStartPlayableGraph開始時
    3OnBehaviourPlayPlayableBehavioiur動作開始時
    4PrepareFrame毎フレーム実行
    5ProcessFrame毎フレーム実行
    6OnBehaviourPausePlayableGraph停止時
    7OnGraphStopPlayableGraph停止時
    8OnPlayableDestroyPlayableGraphが破棄時
    PrepareDataPlayableが遅延した時に呼ばれるらしい※未確認

    初回一度だけ実行したい場合は、OnPlayableCreateに実装しましょう。また関数はそれぞれ実行順が決まっていますので注意してください。

    3.【独自Playableに必須】ScriptPlayableの作成

    次にScriptPlayableの作成をします。独自のPlayableは ScriptPlayable を使って定義します。

    void Awake()  
    {
        _graph = PlayableGraph.Create("CustomGraph");  
        // 独自Playableの作成  
        var playable = ScriptPlayable<CustomPlayableBehaviour>.Create(_graph);  
    }
    

    ScriptPlayable<T>.Create で独自Playableを作成します。「T」には あなた自身が作成したPlayableBehaviourクラス を指定してください。

    4.PlayableBehaviourのセットアップ

    次にPlayableBehaviourのセットアップをおこないます。今回PlayableBehaviour内にはTransform型のtargetが必要でした。このtarget変数に値を渡す必要があります。

    手順はPlayableからPlayableBehaviourを取得して値を渡します。具体的には Playable.GetBehavioiur関数 で取得可能です。

    void Awake()  
    {
        _graph = PlayableGraph.Create("CustomGraph");  
        var playable = ScriptPlayable<CustomPlayableBehaviour>.Create(_graph);  
        // PlayableBehaviourを取得  
        var behaviour = playable.GetBehaviour();  
        // PlayableBehaviourのセットアップ  
        behaviour.target = transform;  
    }
    

    上記コードのように GetBehaviour を使ってPlayableBehaviourを取得しtargetに値をセットできました。

    5.アウトプットの作成

    次はアウトプットを作成します。

    お悩みさん
    お悩みさん
    アウトプットってなんだっけ?

    冒頭で解説したPlayable APIの 「インプットとアウトプットが必要」という大前提を思い出してみてください。

    ところで 「独自Playableのアウトプットは何を指定したら良いのだろう?」 って思いましたよね。

    これはあなたが作るPlayableが 最終どういう形でアウトプットされるか で決まります。

    例えば最終的にAnimatorで動かしたいのであれば AnimationPlayableOutput 、AudioClipでサウンドを再生したいなら AudioPlayableOutput と何をアウトプットするかでPlayableOutputの種類は決めましょう。

    今回は特にアウトプットするものは無いため ScriptPlayableOutput を使用します。

    void Awake()  
    {
        _graph = PlayableGraph.Create("CustomGraph");  
        var playable = ScriptPlayable<CustomPlayableBehaviour>.Create(_graph);  
        var behaviour = playable.GetBehaviour();  
        behaviour.target = transform;  
        // アウトプットの作成  
        var output = ScriptPlayableOutput.Create(_graph, "CustomOutput");  
    }
    

    アウトプットの作成は今までとやり方は全く同じです。

    「PlayableGraph」と「アウトプット名」をセットします。

    6.ScriptPlayableをアウトプットに接続

    アウトプットは作成するだけでは何も起きません。アウトプットにPlayableを接続する必要がありましたね。ScriptPlayableも同様、 SetSourcePlayable を使ってアウトプットに接続します。

    void Awake()  
    {
        _graph = PlayableGraph.Create("CustomGraph");  
        var playable = ScriptPlayable<CustomPlayableBehaviour>.Create(_graph);  
        var behaviour = playable.GetBehaviour();  
        behaviour.target = transform;  
        var output = ScriptPlayableOutput.Create(_graph, "CustomOutput");  
        // ScriptPlayableをアウトプットに接続  
        output.SetSourcePlayable(playable);  
    }
    

    以上でインプット、アウトプット共に準備は完了しました。

    7.PlayableGraphの再生

    最後にPlayableGraphのPlayを実行して再生してみましょう。

    void Awake()  
    {
        _graph = PlayableGraph.Create("CustomGraph");  
        var playable = ScriptPlayable<CustomPlayableBehaviour>.Create(_graph);  
        var behaviour = playable.GetBehaviour();  
        behaviour.target = transform;  
        var output = ScriptPlayableOutput.Create(_graph, "CustomOutput");  
        output.SetSourcePlayable(playable);  
    
        // PlayableGraphの再生  
        _graph.Play();  
    }
    

    するとこんな感じでオブジェクトが左右に動くようになったのではないでしょうか。
    そろそろ始めないか?Playable API入門【Unity】_18

    以上で独自Playableの基本的な作成方法は完了です。意外と簡単だったのではないでしょうか。

    そろそろ始めないか?Playable API入門【Unity】_19

    上図のPlayable APIに出てくる登場人物4人の関係性をイメージできていると、混乱することなく実装できると思います。

    繰り返しになりますが、 登場人物の関係性 をしっかり頭に入れておくことが Playable APIの近道 です。

    本章で紹介したサンプルコード全文はこちら

    UnityのPlayable API入門まとめ

    今回はUnityが提供している Playable API入門 ということでPlayable APIの始め方から実際の使い方までを解説してきました。

    簡単に記事の内容をまとめてみます。

    UnityのPlayable API入門まとめ

    ①Playable APIとは汎用システム

    ②Playable APIはインプットとアウトプットが必要

    ③3人の主人公PlayableGrap、Playable、Output

    ④独自Playable作成時にPlayableBehaviourを使用

    ⑤Playable APIを使うとステートマシン地獄から脱出可

    何も知らない状態からPlayable APIを使えるようになったのではないでしょうか。Playable APIを使うことでAnimatorControllerのステートマシンから解放されますし、独自で拡張することでさまざまなものをPlayable化することが可能です。

    ぜひ本記事を参考にいろんなPlayableを作ってみてください。Playable APIがあなたのゲーム開発手法の手札の1つになることでしょう。

    この記事があなたのゲーム開発に役立ったら嬉しいです。

    Unityオブジェクトの描画順の制御って難しいですよね。
    この度、Unityの描画順を体系的に学べる「Unity描画順の教科書」を執筆しました。

    Unityの描画順を基礎から学びたい方はぜひ確認してみてください!
    Unity描画順の教科書

    最後まで読んでいただきありがとうございました!
    すばらしいPlayable APIライフをお過ごしください。

    オススメ記事
    検証環境
    • Unity6000.0.32f1
    参考サイト