Unity スクリプトリファレンス (API) は、ツリー構造にデータソースを体系付けや評価することによって、ツール、効果、その他のゲームメカニズムを作成する方法を提供しています。ツリー構造のおかげで、複数のデータソースを混合、ブレンド、修正し、それらを単一の出力から再生することが可能になります。例えば現時点では、Playable API はアニメーショングラフに対応してるので、アニメーションをスクリプトで扱うことも可能です。
注意 Playable API は「実験的な」名前空間の一部で、この機能を使って作成したスクリプトは Unity の将来的なバージョンとは互換性が無くなる可能性があります。
5.4 より前の Playable API を使用している場合は、Upgrade Guide ページの 5.4 へのマイグレーションの詳細を参照してください。
下記の 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
の配列を直接取得できます)。
AnimationMixerPlayable は、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);
}
}
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);
}
}
デフォルトでは、ツリーの再生のすべてのタイミングは PlayableController
の Play()
メソッドによって制御されています。ただし、より詳細に制御したい場合は、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 状態になります。