最近 Unity の Timeline 機能について触れる機会が多く、基礎的な部分について社内 Wiki に情報を書いたりしていたので、コピペ的に再利用してまとめておきます。
試行環境:Unity 2017.4.10f1
参考リンク
そろそろUnity2017のTimelineの基礎を押さえておこう – 渋谷ほととぎす通信
Playable Track の使い方についても、詳しく解説されています。
身もふたもない話ですが、だいたいこのページを見ておけば、最初の一歩はわかると思います。
Track の種類
- Activation Track (対象オブジェクトの アクティブ化/非アクティブ化)
- Animation Track (対象オブジェクトの モーション制御/移動/回転など)
- Audio Track (オーディオ制御)
- Control Track (オブジェクトの生成)
- Playable Track (スクリプト処理)
グラフィック方面の人が扱うような、配置したオブジェクトに対する直感的な操作に関しては、主に上3つを使用することになるかと思います。
プログラマが書いたコードを使用するのは、主に『Playable Track』です。
『Playable Track』で使用できるスクリプトを記述するためには、『PlayableAsset』と『PlayableBehaviour』というクラスを継承したクラスを作成するのが良いです。
PlayableAsset
PlayableAsset – Unity スクリプトリファレンス
『PlayableAsset』を継承したクラスの cs ファイルを、Timeline ウインドウに ドラッグ&ドロップ することで、このクリップを持った『Playable Track』を作成することができます。
(既に存在する『PlayableTrack』内に持っていった場合は、トラック内にクリップが追加されます)。
クリップをクリックすることで、『Inspector ビュー』 にはこのクラスの情報が表示され、[SerializeFIeld] 指定の変数の設定などが可能です。
注意しなければいけない点として、 シーン内(Hierarchy 上)に存在する『GameObject』を変数に格納したい場合は、入れ物となる変数を『GameObject』ではなく『ExposedReference<GameObject>』として定義しなければなりません。
PlayableBehaviour
Unity – Scripting API: PlayableBehaviour
クリップに関する、時間経過に応じた挙動を制御するクラスで、様々な既定の関数を持ちます。
- OnGraphStart(タイムライン全体の開始時に走る処理)
- OnGraphStop(タイムライン全体の終了時に走る処理)
- OnBehaviourPlay (クリップに入った時に走る処理)
- OnBehaviour (クリップを抜ける時に走る処理)
- ProcessFrame (クリップ内で毎フレーム走る処理)
継承先クラスでこれらの中身を埋めることで、適切なタイミングで処理を走らせてくれます。
このクラスに『Inspector ビュー』で指定した[SerializeField]変数を持っていきたい場合、 『PlayableAsset』継承クラスを経由して受け渡しする形になります。
具体的には、このような形で『PlayableAsset』『PlayableBehaviour』それぞれの継承クラスを作成することで、受け渡しが可能です。
using UnityEngine;
using UnityEngine.Playables; // 宣言しておくと便利.
public class PlayableAssetSample : PlayableAsset
{
[SerializeField]
public int mIntSample; // クリップをクリックした際に, Inspector ビューで指定可能.
[SerializeField]
public ExposedReference mGameObjectSample; // シーン中のオブジェクトを指定する際は, この形.
// PlayableAsset を継承した場合, この関数を定義する.
public override Playable CreatePlayable(PlayableGraph graph, GameObject game_object)
{
// PlayableBehaviour に, 入力値を引き渡す.
PlayableBehaviourSample behaviour = new PlayableBehaviourSample();
behaviour.IntSample = mIntSample;
behaviour.GameObjectSample = mGameObjectSample.Resolve(graph.GetResolver());
return ScriptPlayable.Create(graph, behaviour);
}
}
using UnityEngine;
using UnityEngine.Playables; // 宣言しておくと便利.
public class PlayableBehaviourSample : PlayableBehaviour
{
// PlayableAsset から引き渡す.
private int mIntSample;
public int IntSample { set { mIntSample = value; } }
private GameObject mGameObjectSample;
public GameObject GameObjectSample { set { mGameObjectSample = value; } }
public override void OnGraphStart(Playable playable)
{
// Timeline 全体の開始時に走らせる処理.
}
public override void OnGraphStop(Playable playable)
{
// Timeline 全体の終了時に走らせる処理.
}
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
// クリップに入った時に走らせる処理.
}
public override void OnBehaviourPause(Playable playable, FrameData info)
{
// クリップを抜ける際に走らせる処理.
}
public override void PrepareFrame(Playable playable, FrameData info)
{
// クリップ内で毎フレーム走らせる処理.
}
}
© Unity Technologies Japan/UCL