Blender と Rigify の使用
カスタムアニメーションの Playable の作成

Playable API

Unity スクリプトリファレンス (API) は、ツリー構造にデータソースを体系付けや評価することによって、ツール、効果、その他のゲームメカニズムを作成する方法を提供しています。ツリー構造のおかげで、複数のデータソースを混合、ブレンド、修正し、それらを単一の出力から再生することが可能になります。例えば現時点では、Playable API はアニメーショングラフに対応してるので、アニメーションをスクリプトで扱うことも可能です。

注意 Playable API は「実験的な」名前空間の一部で、この機能を使って作成したスクリプトは Unity の将来的なバージョンとは互換性が無くなる可能性があります。

5.4 より前の Playable API を使用している場合は、Upgrade Guide ページの 5.4 へのマイグレーションの詳細を参照してください。

使用方法

ゲームオブジェクトで 1 つのクリップを再生する

下記の MonoBehaviour は、 1 つのノードを持つ簡単なツリーを生成します。このノードが1つのクリップを再生します。

AnimationClipPlayableアニメーションクリップ をラップし、Playable API と互換性を構築します。

Play() 演算は Playable を Animator に接続し、それで、グラフのルート (この場合は AnimationClipPlayable) が再生できます。

using UnityEngine;
using UnityEngine.Experimental.Director;
 
[RequireComponent (typeof (Animator))]
public class PlayAnimation : MonoBehaviour
{
    public AnimationClip clip;
 
    void Start () 
    {
        // Wrap the clip in a playable
        var clipPlayable = AnimationClipPlayable.Create(clip);
 
        // Bind the playable to the player
        GetComponent<Animator>().Play(clipPlayable);
    }

}

アニメーションブレンドツリーをプログラムで作成する

AnimationMixerPlayable は2つ以上の AnimationClipPlayable をブレンドしたり、他の(それ自体が他のクリップをブレンドする)ミキサーをブレンドしたりすることができます。SetInputs() メソッドは、下層の AnimationClipPlayable ノードを暗黙的に作成します (この方式は、AnimationPlayable の配列を直接取得できます)。 \nAnimationMixerPlayable は、2つあるいはそれ以上の AnimationClipPlayable をブレンドしたり、他の(それ自体が他のクリップをブレンドする)ミキサーをブレンドしたりすることができます。 SetInputs() の方式は、下層の AnimationClipPlayable ノードを暗黙的に作成します。(この方式は、AnimationPlayable の配列を直接取得することもあります。)

ブレンドする各クリップのウェイトは、SetInputWeight() で動的に調節され、ひとつのアニメーションから別のアニメーションへ、徐々にスムーズに変化するブレンドツリーを生成します。

using UnityEngine;
using UnityEngine.Experimental.Director;
 
[RequireComponent (typeof (Animator))]
public class MixAnimation : MonoBehaviour
{
    public AnimationClip clip1;
    public AnimationClip clip2;
 
    private AnimationMixerPlayable m_Mixer;
 
    void Start () 
    {
        // Create the mixer and connect it to clips
        // (AnimationClipPlayables are created implicitly)
        m_Mixer = AnimationMixerPlayable.Create();
        m_Mixer.SetInputs(new[] {clip1, clip2});
 
        // Bind the playable graph to the player
        GetComponent<Animator>().Play(m_Mixer);
    }
 
    void Update()
    {
        // Adjust the weight of each clip in the blend tree based on time
        float weight = (Time.time % 10) / 10;
        m_Mixer.SetInputWeight(0, weight);
        m_Mixer.SetInputWeight(1, 1 - weight);
    }
}

AnimatorController をブレンドする

AnimationClipPlayable が AnimationClip をラップするのと同じように、AnimatorControllerPlayableアニメーターコントローラー をラップできます。これによって、別の AnimationPlayable とブレンドさせることが可能になります。

using UnityEngine;
using UnityEngine.Experimental.Director;
 
[RequireComponent (typeof (Animator))]
public class BlendAnimatorController : MonoBehaviour
{
    public AnimationClip clip;
    public RuntimeAnimatorController animController;
 
    void Start () 
    {
        // Wrap the clip and the controller in playables
        var clipPlayable = AnimationClipPlayable.Create(clip);
        var controllerPlayable = AnimatorControllerPlayable.Create(animController);
        var mixer = AnimationMixerPlayable.Create();
        mixer.SetInputs(new Playable[] {clipPlayable, controllerPlayable});
        
        // Bind the playable graph to the player
        GetComponent<Animator>().Play(mixer);
    }
}

ツリーのタイミングを手動で制御する

デフォルトでは、ツリーの再生のすべてのタイミングは PlayableControllerPlay() メソッドによって制御されています。ただし、より詳細に制御したい場合は、Playable のローカルタイムを具体的に設定することも可能です。ローカルタイムは子ノードに渡されます。

この例ではキーボードの方向ボタンを使って、手動でアニメーションの再生を一時停止し、進め、巻き戻すことができます。

using UnityEngine;
using UnityEngine.Experimental.Director;
 
[RequireComponent (typeof (Animator))]
public class PlayWithTimeControl : MonoBehaviour
{
    public AnimationClip clip;
 
    private Playable m_Root;
    private const float k_SpeedFactor = 1f;
 
    void Start () 
    {
        m_Root = AnimationClipPlayable.Create(clip);
        
        // Bind the playable to the player
        GetComponent<Animator>().Play(m_Root);
 
        m_Root.state = PlayState.Paused;
    }

    void Update () 
    {
        // Control the time manually based on the input
        float horizontalInput = Input.GetAxis("Horizontal");
        m_Root.time += horizontalInput * k_SpeedFactor * Time.deltaTime;
    }
}

ツリーの再生状態を制御する

ツリーの状態や枝も、Playable.state のパラメーターを変更して設定できます。状態はノードのすべての子に(子のそれ以前の状態がどうであったかに関わらず)渡されます。子ノードが明示的に手動で一時停止している場合は、親を Playing 状態にすると、子も Playing 状態になります。

Blender と Rigify の使用
カスタムアニメーションの Playable の作成