Timelineを使ってみる
こんにちは、VR部2年の森川です。私は訳あって映像を制作することになったので、Unityにある「Timeline」という機能の基本の機能を調査しました。ですので、今回はTimelineの使い方を簡単に整理していきます。
Timelineとは
AnimationClip、AudioClip、Camera等を配置して、これらの実行させたい処理を経過時間ごとに操作することができる機能です。
Timelineを扱う事によって生まれるメリットは、
- GameObject毎の処理を一々コードを書かなくて済む。
- ウィンドウを見るだけで、どのような処理が行われてるか分かりやすい。
- 複雑な処理を行いやすくなる。
です。それでは早速使っていきたいと思います。
準備・主な機能
準備
まずは、空GameObjectを生成します。名前は適当にRootとしておきます。
次にTimelineエディタを開きます。Window->Timelineから開くことができます。
開いたら先ほど作った空GameObjectを選択し、Timelineエディタに"Create"と出るのでそれをクリック。
すると拡張子がplayableのファイルが生成されます。その後、空GameObjectにPlayable DirectorとAnimetorコンポーネントが追加されている事を確認しましょう。
これにより、RootというGameObjectを基準にタイムライン制御を行う事ができるようになりました。
主な機能
Timelineには"Track"というものがあり、Timelineエディタの行に相当するものです。TrackはエディタのAddをクリックすると追加できます。また、Trackの右側に表示されるグラフのようなものをアセットと言います。ここでどのタイミングで処理を行うかをフレーム毎、または時間毎に操作する事ができます。
今回は代表的な5つのTrackの説明をします。
1. Activation Track
指定したGameObjectのActiveを切り替えるTrackです。
2. Animation Track
指定したGameObjectのアニメーションを操作できるTrackです。
ここでのクリップはAnimation Clipなので、GameObjectにClipが付いているならば、それを再生する事ができます。また、エディタ内でClipを作る事ができます。作成方法はAnimationウィンドウでの操作と同様です。
3. Audio Track
指定した音楽ファイルを再生、停止する事ができるTrackです。
4. Control Track
指定したPrefabを表示、非表示にできるTrackです。
アセットを右クリックし、クリップをAddすることにより使う事ができます。このクリップのInspectorから、親オブジェクトと生成するPrefabを指定できます。
パーティクルでの演出をするときに使えそうな感じですね。
5. Playable Track
スクリプト制御を行うTrackです。私が今回調べていて行き詰まったのはここのTrackです。
ここではPlayableBehaviorクラスとPlayableAssetクラスのサブクラスを用いて実装します。
簡単にこの2つの関係を説明すると、PlayableAssetクラスは処理を行うGameObjectの参照を保持させておくもの、PlayableBehaviorクラスは参照したオブジェクトにどのような処理を行うのか命令をするものです。
これらのスクリプトのデフォルトはAssets->Create->Playablesより生成できます。
ここにサンプルコードを載せておきます。カメラがLookAt関数で対象物を見続けるものです。
コードは主に他サイトを模倣して書いたものなので、私の理解した範囲のみ説明します。その以外に関しては、後ほど参考サイトのリンクを貼るのでそちらで確認してください。
TimelinePlayableAsset.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable]
public class TimelinePlayableAsset : PlayableAsset
{
public ExposedReference<GameObject> charaObj;
public ExposedReference<GameObject> target;
public override Playable CreatePlayable(PlayableGraph graph, GameObject go) {
var behaviour = new TimelinePlayableBehaviour();
behaviour.charaObject = charaObj.Resolve(graph.GetResolver());
behaviour.target = target.Resolve(graph.GetResolver());
return ScriptPlayable<TimelinePlayableBehaviour>.Create(graph, behaviour);
}
}
- public ExposedReference<GameObject> charaObj;
ここではシーン上にある参照するオブジェクトを格納してます。また、Project内に存在するオブジェクトを参照する場合は通常通り以下のように書けます。
public GameObject charaObj;
- public override Playable CreatePlayable(PlayableGraph graph, GameObject go){ }
私はここに関してはおまじないと思って書いてます(笑)。
TimelinePlayableBehavior.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
public class TimelinePlayableBehaviour : PlayableBehaviour
{
public GameObject charaObject;
public GameObject target;
public override void OnGraphStart(Playable playable) {
}
public override void OnGraphStop(Playable playable) {
}
public override void OnBehaviourPlay(Playable playable, FrameData info) {
}
public override void OnBehaviourPause(Playable playable, FrameData info) {
}
public override void PrepareFrame(Playable playable, FrameData info) {
charaObject.transform.LookAt (target.transform);
}
}
- OnGraphStartクラス
タイムライン開始時実行される。 - OnGraphStopクラス
タイムライン停止時実行される。 - OnBehaviourPlayクラス
PlayableTrack再生時実行される。 - OnBehaviourPauseクラス
PlayableTrack停止時実行される。 - PrepareFrameクラス
PlayableTrack再生時毎フレーム実行される。
これを実装すると、ちゃんとカメラが追尾してる事が確認できますね。
まとめ
使って見て感じたことは、細かい設定(実行したいタイミングをいじる等)を容易にする事ができて便利だと感じる事ができました。また他にも調べて見て"Cinemachine"というものと組み合わせて使うと、カメラによる演出の幅が広がり躍動感のある映像が作りやすくなると思いました。今後はCinemachineを使ってTimelineで動かせるように調査を続けて行きたいと思います。
- 参考サイト
Timelimeの使い方
そろそろUnity2017のTimelineの基礎を押さえておこう - 渋谷ほととぎす通信
【Unity2017.2.0f3版】Unityタイムラインの5つの基本機能の使い方と、Cinema Directorとの違いを整理しました - Cross Road
Timeline×Clinechineについて
【Unity】Timelineに動的に生成したオブジェクトをバインドする - テラシュールブログ