Aizu-Progressive xr Lab blog

会津大学のVR部であるA-PxLの部員が持ち回りで投稿していくブログです。部員がそれぞれVRに関する出来事やVRにちなんだことについて学んだことを書いていきます。

連絡はサークルTwitterのDMへお願いします。
「面白法人カヤックVR分室」としても活動しています。詳細はこちら

Timelineを使ってみる

こんにちは、VR部2年の森川です。私は訳あって映像を制作することになったので、Unityにある「Timeline」という機能の基本の機能を調査しました。ですので、今回はTimelineの使い方を簡単に整理していきます。
f:id:aizu-vr:20180505203316p:plain

Timelineとは

 AnimationClip、AudioClip、Camera等を配置して、これらの実行させたい処理を経過時間ごとに操作することができる機能です。
 Timelineを扱う事によって生まれるメリットは、

  • GameObject毎の処理を一々コードを書かなくて済む。
  • ウィンドウを見るだけで、どのような処理が行われてるか分かりやすい。
  • 複雑な処理を行いやすくなる。

    です。それでは早速使っていきたいと思います。

準備・主な機能

準備

まずは、空GameObjectを生成します。名前は適当にRootとしておきます。
次にTimelineエディタを開きます。Window->Timelineから開くことができます。
開いたら先ほど作った空GameObjectを選択し、Timelineエディタに"Create"と出るのでそれをクリック。
すると拡張子がplayableのファイルが生成されます。その後、空GameObjectにPlayable DirectorとAnimetorコンポーネントが追加されている事を確認しましょう。

これにより、RootというGameObjectを基準にタイムライン制御を行う事ができるようになりました。
f:id:aizu-vr:20180505203414p:plain

主な機能

Timelineには"Track"というものがあり、Timelineエディタの行に相当するものです。TrackはエディタのAddをクリックすると追加できます。また、Trackの右側に表示されるグラフのようなものをアセットと言います。ここでどのタイミングで処理を行うかをフレーム毎、または時間毎に操作する事ができます。
今回は代表的な5つのTrackの説明をします。

1. Activation Track

f:id:aizu-vr:20180505203340p:plain
指定したGameObjectのActiveを切り替えるTrackです。

2. Animation Track

f:id:aizu-vr:20180505203348p:plain
指定したGameObjectのアニメーションを操作できるTrackです。
ここでのクリップはAnimation Clipなので、GameObjectにClipが付いているならば、それを再生する事ができます。また、エディタ内でClipを作る事ができます。作成方法はAnimationウィンドウでの操作と同様です。

3. Audio Track

f:id:aizu-vr:20180505203354p:plain
指定した音楽ファイルを再生、停止する事ができるTrackです。

4. Control Track

f:id:aizu-vr:20180505203401p:plain
指定したPrefabを表示、非表示にできるTrackです。
アセットを右クリックし、クリップをAddすることにより使う事ができます。このクリップのInspectorから、親オブジェクトと生成するPrefabを指定できます。
パーティクルでの演出をするときに使えそうな感じですね。

5. Playable Track

f:id:aizu-vr:20180505203409p:plain
スクリプト制御を行う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再生時毎フレーム実行される。

    これを実装すると、ちゃんとカメラが追尾してる事が確認できますね。
    f:id:aizu-vr:20180505204038p:plain
    f:id:aizu-vr:20180505204046p:plain
    f:id:aizu-vr:20180505204052p:plain

    まとめ

    使って見て感じたことは、細かい設定(実行したいタイミングをいじる等)を容易にする事ができて便利だと感じる事ができました。また他にも調べて見て"Cinemachine"というものと組み合わせて使うと、カメラによる演出の幅が広がり躍動感のある映像が作りやすくなると思いました。今後はCinemachineを使ってTimelineで動かせるように調査を続けて行きたいと思います。


会津大学VR部の部員が持ち回りで投稿していくブログです。特にテーマに縛りを設けずに書いていきます!