【Unity】Timelineを使ってエフェクトを作ってみた


本記事はサムザップ Advent Calendar 2017の15日目の記事です。

## やること
Unity2017で登場したTimeline機能を使って簡単なエフェクトを作ってみます。
Timeline機能は動画的なコンテンツの制作を主な用途としているかと思いますが、他にも色々なアニメーションに応用できそうなので弄りながら試していきます。
Timelineの基本的な使い方については[Unityの公式ドキュメント](https://docs.unity3d.com/jp/current/Manual/TimelineOverview.html)等ありますので割愛気味にいきます。


## 制作
### 目次
1. Timelineをつくる
2. TimelineでAnimationClipを再生する
3. TimelineでParticleSystemを制御する
4. TimelineからTimelineを再生する
6. 完成


### \#1. Timelineをつくる
1. 任意のオブジェクトにPlayableDirectorコンポーネントを追加
2. メニューの window => timeline を選択してTimelineウィンドウを出す
3. TimelineウィンドのCreateボタンでTimelineアセットを作成

Animatorのように自分の子オブジェクトしか弄れないという制約はありません。
オブジェクトを動的に差し替えたり、出し分けをしたいというときに、この制約で一手間いるケースが稀にあったりしたので割と嬉しかったりします。

### \#2. TimelineでAnimationClipを再生する
TimelineではAnimationTrackを使用してAnimationClipを再生することができます。

__【やりかた】__
1. AnimationTrackを作成
2. Trackにアニメーションの対象となるオブジェクトをアタッチ
3. Add From Animation Clip でAnimationClipをアタッチ

![01_AnimationTrack作成.gif](https://qiita-image-store.s3.amazonaws.com/0/80910/8b166652-c7be-c682-08e2-e852a5efb9f5.gif)

当然ではあるのですが、AnimationControllerが不要なのは地味に嬉しいところです。（Trackに指定するオブジェクトにはAnimatorコンポーネントが必要ですが）
これまでアニメーションを作成する度、無駄にセットで増えていっていたAnimationControllerとおさらばです。

![スクリーンショット 2017-12-13 13.51.19.png](https://qiita-image-store.s3.amazonaws.com/0/80910/1377e283-6ce1-098d-7b59-662f7a3af48b.png)


またアニメーションの規模が大きくなってくると「AnimationClipを小分けにして、親オブジェクトのアニメーションで子オブジェクトのアクティブを切り替えてタイミング調整をする」というケースがあったのですが、この方法には再生しないと一連のアニメーションの確認ができないという面倒臭さがありました。
Timelineではシークバーを動かすと、配置した複数のAnimationClipを同一タイムライン上でプレビューしてくれるので、タイミング調整が格段にやりやすくなっています。

![01_複数AnimationClip.gif](https://qiita-image-store.s3.amazonaws.com/0/80910/6b5030e9-8b86-a00e-acfe-ea0ba7750d38.gif)
赤・黄色・青のCubeにはそれぞれ別のAnimationClipがついています


### \#3. TimelineでParticleSystemを制御する
ContorolTrackを使ってParticleSystemを再生タイミングを制御してみます。

__【やりかた】__
1. ControlTrackを追加
2. Add Control Playable Asset Clip する
3. Control Playable Asset ClipのSource Game ObjectにParticleSystemのオブジェクトをアタッチ

![02_ControlTrack作成.gif](https://qiita-image-store.s3.amazonaws.com/0/80910/114e51cb-f38f-50c2-48a4-e3d97aaf4788.gif)

今までParticleSystemを複数使ったり、Animatorと組み合わせたりしてエフェクトを作る場合、タイミングを調整するには「StartDelayで生成タイミングを調整する」「AnimationClipでアクティブのON/OFF切り替えで再生させる」のような方法をとっていました。
この方法では再生しないと確認できなかったのですが、ContorolTrackを使うとシークバーに合わせてParticleSystemを再生してくれるので、細かいタイミングの調整は格段にやりやすくなります。
またAnimationTrack等と組み合わせた場合にも、同一タイムライン上でプレビューしてくれます。
![04_particle.gif](https://qiita-image-store.s3.amazonaws.com/0/80910/dcf8f27a-a94d-4d6a-4c67-189318e47abb.gif)


### \#4. TimelineからTimelineを再生する
ちなみにTimelineからTimelineを再生することもできます。
シークバーを動かすと中のTimelineもちゃんとプレビューしてくれます。
さすがに中のTimelineに飛ぶというAfterEffectsのコンポジションのような挙動はしてくれませんが。
![04_particle_2.gif](https://qiita-image-store.s3.amazonaws.com/0/80910/89a66439-ae7e-477e-10c6-de55483a2ce2.gif)





### \#6. 完成
というわけで完成品はこちらです。
![06_fix_2.gif](https://qiita-image-store.s3.amazonaws.com/0/80910/e72dc9df-2d27-69f2-0bc6-d99f80550c56.gif)


## まとめ
使ってみた所感としては、FlashやAfterEffectsなどの操作感にかなり近いツールとして扱うことができるなという印象でした。
TimelineとAnimationClipの使い分けですが、個々のアイテムのアニメーションはAnimationClipで作成し、複数のパーティクルの制御や全体のシーケンスはTimelineで管理するのが良さそうです。
今までAnimatorで親子階層を作ってアニメーションのタイミング管理をしていたのですが、Timelineを使えば再生しないでもプレビューできるというのが最大のメリットではないかなと思います。

### 参考
[Unity - マニュアル: タイムライン](https://docs.unity3d.com/jp/current/Manual/TimelineSection.html)
[【Unity】パーティクルのタイミングをTimelineで制御する](http://tsubakit1.hateblo.jp/entry/2017/10/22/001708)