渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

そろそろUnity2017のTimelineの基礎を押さえておこう


f:id:esakun:20150730215258g:plain

Unity2017.1.0で正式リリースを迎えたTimelineをそろそろちゃんと理解しようと思います。

最初に大雑把な概念図を作ってみました。

◆Timeline全体
f:id:esakun:20170726171521p:plain
◆各種Trackの中 f:id:esakun:20170726193715p:plain

  • TimelineはPlayableDirectorコンポーネントPlayableオブジェクト各種Trackで構成されている
  • PlayableDirectorコンポーネントPlayableオブジェクトの再生処理をコントロールする
  • Playableオブジェクトにタイムライン自体のデータが格納されている
  • 単一、複数のTrackPlayableオブジェクトに格納され、タイムラインを構成している
  • スクリプトからPlayableDirectorコンポーネントにアクセスして再生処理命令を行う

f:id:esakun:20170726194933p:plain

  • 各種Track内のアセットがタイムラインを構成している

まずは手っ取り早く始める方法から。

目次

手っ取り早くTimelineを始める

メニュー Window > Timeline EditorでTimelineエディタを開きます。
ヒエラルキーの任意のGameObject (ここではTimelineRoot) を選択します。

f:id:esakun:20170726151710p:plain

するとCreateボタンが表示されるのでクリックします。 ダイアログが開き、Playableオブジェクトの命名を求められるので命名します (ここではTl.playable)。

f:id:esakun:20170726152112p:plain

ヒエラルキー上で選択済みのGameObject : TimelineRootにPlayableDirectorコンポーネントAnimatorコンポーネントがアタッチされ、PlayableDirectorのPlayable変数にPlayableオブジェクトがアタッチされます。

これは先の概念説明時に紹介した、各種Trackの中の1つAnimationTrackをPlayableオブジェクトに追加したことになります。

f:id:esakun:20170726172704p:plain

TimelineRootの子階層に球を追加します。 f:id:esakun:20170726173013p:plain

再度TimelineRootを選択し、AnimationTrackのRecordボタンをクリックしてアニメーションを追加してみます。

f:id:esakun:20170726173229p:plain:w320

f:id:esakun:20170726173604g:plain

時間をシークして、球の位置を変更し、タイムラインを作っていきます。

f:id:esakun:20170726180606g:plain

Timelineの再生ボタンでアニメーションを確認できます。

また、AnimationTrackには別途AnimationClipをドラッグアンドドロップすることも可能です。

以上が私なりの手っ取り早くTimelineを使う方法です。


残り4種のTrack

AnimationTrack以外のTrackを使うことで表現の幅を増やしていきます。

f:id:esakun:20170726181309p:plain

TrackはAddボタンで追加できます。

ActivationTrack

f:id:esakun:20170726181754p:plain

指定のGameObjectのActiveを切り替えるTrackです。
Activeの時にアクティブになります。

AudioTrack

f:id:esakun:20170726181631p:plain

名前の通りAudioClipをタイムラインに乗せて再生します。
再生確認するためには再生モードにする必要があります。エディットモード中Timelineの再生では鳴りません。

ControllTrack

PrefabをInstantiateしてくれるTrackです。

f:id:esakun:20170726182027p:plain

f:id:esakun:20170726182121p:plain

ControllPlayableAssetを選択肢し、ParentObjectとPrefabを設定すると、タイムラインの実行タイミングで生成され、ControllTrackが実行されたタイミングでオブジェクトはアクティブになり、ControllTrackが終了したタイミングで非アクティブになります。
Trackの再生タイミングでインスタンシエイトされるわけではありません。

PlayableTrack

PlayableTrackはスクリプトを実行させるTrackです。

f:id:esakun:20170726190904p:plain

PlayableBehaviourクラスPlayableAssetクラスのサブクラスを使って実装します。
PlayableBehaviourクラスはPlayableTrackの特定タイミングにおけるイベント関数が以下のように定義されています。

  • OnGraphStart・・・タイムライン開始時実行
  • OnGraphStop・・・タイムライン停止時実行
  • OnBehaviourPlay・・・PlayableTrack再生時実行
  • OnBehaviourPause・・・PlayableTrack停止時実行
  • PrepareFrame・・・PlayableTrack再生時毎フレーム実行

この関数内に任意の処理を書くことが出来ます。
特定のタイミングにおけるオブジェクトの操作、挙動を処理させるクラスです。

f:id:esakun:20170726195735g:plain

PlayableAssetクラスが、PlayableTrackのアセットになるため、PlayableAssetクラスのサブクラスをPlayableTrackにドラッグアンドドロップすることでアセットが生成されます。

スクリプト制御するオブジェクト参照を渡す

事前準備としてPlayableAssetにPlayableTrackで扱うオブジェクト参照を保持させておきます。

Timeline再生開始時にPlayableAssetが生成され、そのタイミングでPlayableAssetクラスのCreatePlayable関数が1度呼ばれます。
その関数内で、PlayableBehaviourをnewで生成し、オブジェクトの参照を渡すというフローになります。

渡すオブジェクトが、シーン上のオブジェクトなのか、Project内のオブジェクトなのかで処理が分岐します。
Project内のオブジェクトの場合は以下のようなシリアライズ可能な状態変数を定義で実装可能です。

public GameObject projectObj;
[SerializeField]
GameObject projectObj2;

シーン上のオブジェクトの場合は、Project内に存在するPlayableAssetに参照をもたせることが出来ません。 Unity5.6から追加されたExposedReference<T>クラスを使って解決します。

public ExposedReference<GameObject> sceneObj;

このように定義することでシーン上のオブジェクト参照を保持させることが出来ます。

Unity - Scripting API: ExposedReference<T0>

var behaviour = new TestPlayableBehaviour ();
behaviour.sceneObj = sceneObj.Resolve (graph.GetResolver ());

また参照をPlayableBehaviourに渡す際はこのような書式で解決します。

f:id:esakun:20170726202354g:plain

このようにシーン上のオブジェクト参照をアセットに渡すことが出来るようになりました。

PlayableTrackのサンプルコードを残しておきます。

以上の5種類のTrackがUnity2017.1.0では提供されています。

まとめ

一通り触ってみて基本機能は把握できました。
実際どう表現につなげていくか、試行錯誤シていく必要がありそうですが、今までより断然アニメーションが作りやすくなったと思います。

Unite2017で見たUltimate Bowl 2017のデータが公開されたら、それを見て勉強したいです。

↑Unite2017 Timelineを使って制作したUltimate Bowlのスライドです。

こちらもどうぞ
Unite 2017 Tokyoの後から見ておきたいスライドまとめ - 渋谷ほととぎす通信