【Unity2017.2.0f3版】Unityタイムラインの5つの基本機能の使い方と、Cinema Directorとの違いを整理しました

Unity2017になってタイムライン機能が追加されました。

通常のUnityの処理ではソースコードベースでシーンを制御するのに対して、タイムラインを使うとシーケンスベースでシーンを制御できます。

便利なのですが、ざっと試した感じではタイムラインには色々癖があります。また、Unityのバージョン変化に伴う仕様変更が多く、公開されている情報と異なっている場合もありました。

そこで、今回はUnity2017.2.0f3時点でのタイムラインの概要と、類似機能で有名なアセット「Cinema Director」との違いを整理してみました。

目次

1. タイムラインの概要

2. 楽にできること、できるけど少し面倒なこと、できないこと

3. 準備

4. 代表的な5つの機能と使い方

5. Cinema Directorとの違い

6. 参考にさせていただいたサイト

7. 終わりに

1. タイムラインの概要

公式ページにはこのように書かれています。

f:id:Takyu:20180127220328j:plain

docs.unity3d.com


f:id:Takyu:20180127220515j:plain

2つめの画像のように、右方向が時間で、各Gameobjectに実行させたい処理を並べていきます。

もしスクリプトだけで作る場合、3秒経過したら敵を表示し、4.58秒後に爆発、、のようなことを全部書いてくことになります。不可能ではないですが、とても時間がかかります。

タイムラインを使えば、原則必要な処理をタイミングに合わせて並べていけばよいので、複雑な処理を作りたいときにとても効果的です。

従来のスクリプト処理も混ぜられるので、「このタイミングでこのメソッドを呼ぶ」ができます。

2. 楽にできること、できるけど少し面倒なこと、できないこと

タイムラインがどんなものかを早期把握するため、タイトルのような観点で整理しました。

楽にできること

・任意のタイミング、期間でこれらが可能

 ・Gameobjectを表示/非表示

 ・Prefabを表示/非表示

 ・既存のAnimation Clipを再生

 ・Audioを再生、停止

できるけど少し面倒なこと(慣れが必要)

・任意のタイミングで自分の作ったスクリプトのメソッドを呼ぶ

・GameobjectのPosition(x,y,z)、Rotation(x,y,z)、Scale(x,y,z)を変化させてオリジナルのAnimationClipを作る

・タイムラインの開始そのものをスクリプトから実行(例えば、キーボード入力をしたらタイムラインが開始する)

できないこと

・完成したシーンを動画出力する
(私の確認した範囲ではできませんが、もしできる場合ご指摘いただけると助かります)

できること、のやり方については後述します。

3. 準備

まずは空のGameObjectを生成し、Timeline など、あとでわかりやすい名前をつけます。

次に、Window / Timelineを選択します。

f:id:Takyu:20180127230442j:plain

Timelineのタブが表示されます。これをタイムラインエディタと呼びます。

先ほど作った"Timeline"という空のGameobjectを選択した状態で(①)Createをクリックします(②)。

f:id:Takyu:20180127230731p:plain


すると、playableという拡張子のファイルが新規生成されます。保存場所を聞かれるので、ファイルの名前と保存場所を指定します。

ここでは、TimelineTimeline.playableというファイルを、Assets/MyWork/Timelineというフォルダに保存しました。

f:id:Takyu:20180127231244j:plain

ここまで進めると、先ほど作った空の"Timeline" GameobjectにPlayable DirectorとAnimator コンポーネントが追加されます。

f:id:Takyu:20180127231355j:plain

今回調べた範囲ではこれらを変更することはありませんでした。


また、このようにタイムラインエディタが表示されます。赤枠のTimelineオブジェクトは右クリックで削除します。

f:id:Takyu:20180128083822p:plain

以上の準備により、"Timeline"という名前のGameobjectを起点としてタイムライン制御ができる状態になりました。以後、タイムラインエディタウインドウは、Hierarchy Viewで"Timeline"Objectを選択したときだけ表示されます。

4. 代表的な5つの機能と使い方

タイムラインエディタを表示させると、5種類のトラックを選択できるようになります。

f:id:Takyu:20180128084117p:plain

トラックとは、タイムラインエディタの行に相当するものです。どこまでを機能と呼ぶかは定義が分かれますが、今回、この5つのトラックを代表的な機能と位置づけ、使い方を解説します。

4-1. Activation Track

オブジェクトの表示、非表示に関するものです。タイムラインに表示すると、このようになります。

f:id:Takyu:20180128090019p:plain

ここの「Active」をクリップといいます。このクリップはマウス操作で長さや位置を変更できます。

トラック部分に任意のGameobjectをアタッチすると、Activeクリップの範囲だけ表示させることができます。

こうなります。ちょうどメタセコイアの練習をしていたので、そこで作ったドーナツを使っています。

クリップを2つにするには、タイムライン上で右クリックし、「Add Activation Clip」を選択します。

4-2. Animation Track

オブジェクトのAnimationに関するものです。タイムラインに表示すると、このようになります。

f:id:Takyu:20180128090436p:plain

ここでのクリップは、UnityのAnimationClipです。そのため、Animation Clip付きのキャラクターモデルであれば任意のAnimation Clipを簡単に再生できます。

クリップ同士をくっつけるようにドラッグすると、クリップの切り替わりにtransitionを入れることができます。
(動画ではtransitionを入れています)


Animation Clipがないモデル、たとえば今回のドーナツの場合ではPosition、Rotation、Scaleを制御できます。その方法を説明します。

まず、No (Animator)という部分にGameobjectをドラッグします。

"Create Animator on donut(オブジェクト名)"という表示が出るのでクリックし、Animator コンポーネントを追加します。

この後、自分でAnimation Clipを作ります。まず、トラックにある赤いボタンを押します。

すると、クリップ部分でRecordingという表示が出ます。

f:id:Takyu:20180128093223p:plain

表示が出ている間にdonutオブジェクトを動かすと、その動きが記録されます。

のはずなのですが、うまくやり方がわからず記録できませんでした。そこで、Curve Editorのようなもので作る方法を解説します。

まず、先ほどのRecording...の状態のときに、オブジェクトを少しだけ動かしてから、トラックにある赤いボタンを押してRecording..を止めます。

すると、このようにPositionという表示が増えます。

f:id:Takyu:20180128094030p:plain


Position.yを例に説明します。 Position.yを選択して、タイムライン上でyの点を見つけてドラッグします。

点が移動するので、その線上(下記の赤い枠)を右クリックして、Add Keyを選択します。

f:id:Takyu:20180128100148p:plain

あとはAdd keyを繰り返すと、タイムラインにグラフができます。この点に沿ってオブジェクトを動かすことができます。

動きをつけたら、Covert To Clipでアニメーションクリップに変換します。

f:id:Takyu:20180128102305p:plain

Animation Clipにした後はタイムライン上で、クリップの長さや位置を自由に変更できます。

f:id:Takyu:20180128102338p:plain

また、上の赤枠のように、Animation Clipの中で先程のkeyを制御することもできます。

4-3. Audio Track

音楽の再生、停止に関するものです。タイムラインに表示すると、このようになります。

f:id:Takyu:20180128103214p:plain

タイムラインの時間軸部分に適当なAudio Clip(音楽ファイル)をドラッグすると、4-1 Activation TrackのときのようにAudio Clipをタイムラインで並べることができます。

f:id:Takyu:20180128103439p:plain

オーディオの再生確認ですが、Unity のPlayボタンを押すと確認できます。Timeline Editor上の再生マークを押しても再生されませんでした。
(Audio Source コンポーネントをMain Cameraにアタッチしてみましたが同様です)

ちなみに、今回のテストでは下記のサイトより音源をダウンロードさせていただきました。

www.kurage-kosho.info

4-4. Control Track

Prefabの表示、非表示に関するものです。タイムラインに表示すると、このようになります。

f:id:Takyu:20180128104151p:plain

機能としては4-1. Activation Trackに似ています。ただ、clipの準備手順が少し異なります。

右クリックで、Control Playable Assetというクリップを生成します。

f:id:Takyu:20180128104229p:plain

このアセットのInspectorに表示したいPrefabをドラッグします。

f:id:Takyu:20180128104428p:plain

あとはClipの長さと位置を調整します。右クリックしてDuplicateを選択すれば、Clipを増やすことができます。

4-5. Playable Track

スクリプト制御に関するものです。タイムラインに表示すると、このようになります。

f:id:Takyu:20180128104844p:plain

スクリプトの制御をタイムラインに伝えるには、Playable Assetという仕組みを挟む必要があります。

簡単化したイメージです。

f:id:Takyu:20180128110107p:plain

Playable AssetとPlayable Behaviourはどちらもスクリプトです。また、どちらもテンプレートがあるのでそこから作ると手間が省けます。

f:id:Takyu:20180128110205p:plain


まずは上記テンプレートで2つのスクリプトを作ります。ここでは、donut_Asset.csとdonut_behaviour.csを作りました。

donut_Asset.csを作ったことで、タイムライン上で右クリックでclipの形で追加できるようになります。

f:id:Takyu:20180128110541p:plain

f:id:Takyu:20180128110609p:plain


次にスクリプトです。donut_asset.csには、ExposedReferenceを入れて、donut_behaviour.csとのつなぎを作ります。

ExposedReferenceについては、下記のブログに説明があります。(ExposedReferenceで検索してみてください)

tsubakit1.hateblo.jp


Playable Assetはこう書きました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
[System.Serializable]
public class donut_Asset : PlayableAsset
{
// Factory method that generates a playable based on this asset
public override Playable CreatePlayable(PlayableGraph graph, GameObject go) {
donut_behaviour db = new donut_behaviour();//新規追加
return ScriptPlayable<donut_behaviour>.Create (graph, db);//新規追加
//return Playable.Create(graph); //ここはテンプレートにあるが削除する
}
}
view raw donut_Asset.cs hosted with ❤ by GitHub

gista3a4b8aa016580f54ed8d6c498860770


次に、Playable Behaviourです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
// A behaviour that is attached to a playable
public class donut_behaviour : PlayableBehaviour
{
Material [] mats;
// Called when the owning graph starts playing
public override void OnGraphStart(Playable playable) {
mats = GameObject.Find("donut").GetComponent<Renderer>().sharedMaterials;
}
// Called when the owning graph stops playing
public override void OnGraphStop(Playable playable) {
}
// Called when the state of the playable is set to Play
public override void OnBehaviourPlay(Playable playable, FrameData info) {
//クリップ開始時に呼ばれる
//いちご風味に色を変更
mats[0].EnableKeyword("_EMISSION");
mats[0].SetColor("_EmissionColor", new Color(0.88f,0.31f,0.41f));
}
// Called when the state of the playable is set to Paused
public override void OnBehaviourPause(Playable playable, FrameData info) {
//クリップ終了時に呼ばれる
//チョコレート風味に色を戻す
mats[0].EnableKeyword("_EMISSION");
mats[0].SetColor("_EmissionColor", new Color(0,0,0));
}
// Called each frame while the state is set to Play
public override void PrepareFrame(Playable playable, FrameData info) {
}
}
view raw donut_behaviour.cs hosted with ❤ by GitHub

gist9c95c0aab120cb0c89acffde882cc9aa


実行するとこうなります。

5. Cinema Directorとの違い

以前、Unity Asset Storeで公開されているCinema Directorの使い方をまとめたことがあります。

www.crossroad-tech.com


そのときの経験から、Cinema Directorとの違いを整理しました。

まずはCinema Directorにだけあるものです。

Add Global Trackによって、シーン全体の制御ができる

f:id:Takyu:20180128121850p:plain

シーン全体のBGM再生、再生速度などを制御できます。

Cameraオブジェクト専用のTrackがある

f:id:Takyu:20180128120600p:plain

Unityのタイムラインでは別のカメラワークに切り替える場合、トラックを別に作る必要があります。カメラを切り替えることが多い場合はCinema Directorの方が便利そうです。

画面全体のトランジションができる

このように、トランジションの設定ができます。

f:id:Takyu:20180128121451p:plain

f:id:Takyu:20180128121540g:plain

再生中のスクリーンショットを撮れる「Storyboard」という機能がある

f:id:Takyu:20180128121627p:plain

このように、タイムライン上に「くさび」を入れるだけです。Assetsフォルダに画像が生成されます。


それ以外の機能は、タイムラインでもCinema Directorでも実現できます。手順は多少異なりますが、あとは好みの問題かと思います。


7. 終わりに

ちょうど動画編集をする予定があったので、少し調べてみました。タイムライン機能を使えば他にも色々なことができそうなので、変わった使い方を見つけたらまた紹介できればと思います。