Unity2017になってタイムライン機能が追加されました。
通常のUnityの処理ではソースコードベースでシーンを制御するのに対して、タイムラインを使うとシーケンスベースでシーンを制御できます。
便利なのですが、ざっと試した感じではタイムラインには色々癖があります。また、Unityのバージョン変化に伴う仕様変更が多く、公開されている情報と異なっている場合もありました。
そこで、今回はUnity2017.2.0f3時点でのタイムラインの概要と、類似機能で有名なアセット「Cinema Director」との違いを整理してみました。
目次
1. タイムラインの概要
2. 楽にできること、できるけど少し面倒なこと、できないこと
3. 準備
4. 代表的な5つの機能と使い方
5. Cinema Directorとの違い
6. 参考にさせていただいたサイト
7. 終わりに
1. タイムラインの概要
公式ページにはこのように書かれています。
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を選択します。
Timelineのタブが表示されます。これをタイムラインエディタと呼びます。
先ほど作った"Timeline"という空のGameobjectを選択した状態で(①)Createをクリックします(②)。
すると、playableという拡張子のファイルが新規生成されます。保存場所を聞かれるので、ファイルの名前と保存場所を指定します。
ここでは、TimelineTimeline.playableというファイルを、Assets/MyWork/Timelineというフォルダに保存しました。
ここまで進めると、先ほど作った空の"Timeline" GameobjectにPlayable DirectorとAnimator コンポーネントが追加されます。
今回調べた範囲ではこれらを変更することはありませんでした。
また、このようにタイムラインエディタが表示されます。赤枠のTimelineオブジェクトは右クリックで削除します。
以上の準備により、"Timeline"という名前のGameobjectを起点としてタイムライン制御ができる状態になりました。以後、タイムラインエディタウインドウは、Hierarchy Viewで"Timeline"Objectを選択したときだけ表示されます。
4. 代表的な5つの機能と使い方
タイムラインエディタを表示させると、5種類のトラックを選択できるようになります。
トラックとは、タイムラインエディタの行に相当するものです。どこまでを機能と呼ぶかは定義が分かれますが、今回、この5つのトラックを代表的な機能と位置づけ、使い方を解説します。
4-1. Activation Track
オブジェクトの表示、非表示に関するものです。タイムラインに表示すると、このようになります。
ここの「Active」をクリップといいます。このクリップはマウス操作で長さや位置を変更できます。
トラック部分に任意のGameobjectをアタッチすると、Activeクリップの範囲だけ表示させることができます。
こうなります。ちょうどメタセコイアの練習をしていたので、そこで作ったドーナツを使っています。
クリップを2つにするには、タイムライン上で右クリックし、「Add Activation Clip」を選択します。
4-2. Animation Track
オブジェクトのAnimationに関するものです。タイムラインに表示すると、このようになります。
ここでのクリップは、UnityのAnimationClipです。そのため、Animation Clip付きのキャラクターモデルであれば任意のAnimation Clipを簡単に再生できます。
クリップ同士をくっつけるようにドラッグすると、クリップの切り替わりにtransitionを入れることができます。
(動画ではtransitionを入れています)
Animation Clipがないモデル、たとえば今回のドーナツの場合ではPosition、Rotation、Scaleを制御できます。その方法を説明します。
まず、No (Animator)という部分にGameobjectをドラッグします。
"Create Animator on donut(オブジェクト名)"という表示が出るのでクリックし、Animator コンポーネントを追加します。
この後、自分でAnimation Clipを作ります。まず、トラックにある赤いボタンを押します。
すると、クリップ部分でRecordingという表示が出ます。
表示が出ている間にdonutオブジェクトを動かすと、その動きが記録されます。
のはずなのですが、うまくやり方がわからず記録できませんでした。そこで、Curve Editorのようなもので作る方法を解説します。
まず、先ほどのRecording...の状態のときに、オブジェクトを少しだけ動かしてから、トラックにある赤いボタンを押してRecording..を止めます。
すると、このようにPositionという表示が増えます。
Position.yを例に説明します。 Position.yを選択して、タイムライン上でyの点を見つけてドラッグします。
点が移動するので、その線上(下記の赤い枠)を右クリックして、Add Keyを選択します。
あとはAdd keyを繰り返すと、タイムラインにグラフができます。この点に沿ってオブジェクトを動かすことができます。
動きをつけたら、Covert To Clipでアニメーションクリップに変換します。
Animation Clipにした後はタイムライン上で、クリップの長さや位置を自由に変更できます。
また、上の赤枠のように、Animation Clipの中で先程のkeyを制御することもできます。
4-3. Audio Track
音楽の再生、停止に関するものです。タイムラインに表示すると、このようになります。
タイムラインの時間軸部分に適当なAudio Clip(音楽ファイル)をドラッグすると、4-1 Activation TrackのときのようにAudio Clipをタイムラインで並べることができます。
オーディオの再生確認ですが、Unity のPlayボタンを押すと確認できます。Timeline Editor上の再生マークを押しても再生されませんでした。
(Audio Source コンポーネントをMain Cameraにアタッチしてみましたが同様です)
ちなみに、今回のテストでは下記のサイトより音源をダウンロードさせていただきました。
4-4. Control Track
Prefabの表示、非表示に関するものです。タイムラインに表示すると、このようになります。
機能としては4-1. Activation Trackに似ています。ただ、clipの準備手順が少し異なります。
右クリックで、Control Playable Assetというクリップを生成します。
このアセットのInspectorに表示したいPrefabをドラッグします。
あとはClipの長さと位置を調整します。右クリックしてDuplicateを選択すれば、Clipを増やすことができます。
4-5. Playable Track
スクリプト制御に関するものです。タイムラインに表示すると、このようになります。
スクリプトの制御をタイムラインに伝えるには、Playable Assetという仕組みを挟む必要があります。
簡単化したイメージです。
Playable AssetとPlayable Behaviourはどちらもスクリプトです。また、どちらもテンプレートがあるのでそこから作ると手間が省けます。
まずは上記テンプレートで2つのスクリプトを作ります。ここでは、donut_Asset.csとdonut_behaviour.csを作りました。
donut_Asset.csを作ったことで、タイムライン上で右クリックでclipの形で追加できるようになります。
次にスクリプトです。donut_asset.csには、ExposedReferenceを入れて、donut_behaviour.csとのつなぎを作ります。
ExposedReferenceについては、下記のブログに説明があります。(ExposedReferenceで検索してみてください)
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); //ここはテンプレートにあるが削除する | |
} | |
} |
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) { | |
} | |
} |
gist9c95c0aab120cb0c89acffde882cc9aa
実行するとこうなります。
5. Cinema Directorとの違い
以前、Unity Asset Storeで公開されているCinema Directorの使い方をまとめたことがあります。
そのときの経験から、Cinema Directorとの違いを整理しました。
まずはCinema Directorにだけあるものです。
Add Global Trackによって、シーン全体の制御ができる
シーン全体のBGM再生、再生速度などを制御できます。
Cameraオブジェクト専用のTrackがある
Unityのタイムラインでは別のカメラワークに切り替える場合、トラックを別に作る必要があります。カメラを切り替えることが多い場合はCinema Directorの方が便利そうです。
画面全体のトランジションができる
このように、トランジションの設定ができます。
再生中のスクリーンショットを撮れる「Storyboard」という機能がある
このように、タイムライン上に「くさび」を入れるだけです。Assetsフォルダに画像が生成されます。
それ以外の機能は、タイムラインでもCinema Directorでも実現できます。手順は多少異なりますが、あとは好みの問題かと思います。
6. 参考にさせていただいたサイト
■Unity - マニュアル: TimelineSection
■【Unity】Timelineで敵の”出現タイミング”や”動き”を制御してみる - テラシュールブログ
■Unity2017のTimelineをやってみた – てっくぼっと!
■【Unity】Timelineで敵の”出現タイミング”や”動き”を制御してみる - テラシュールブログ
■そろそろUnity2017のTimelineの基礎を押さえておこう - 渋谷ほととぎす通信
■【Unity】Timelineエディタでムービーを作ってみた - おもちゃラボ
■Unity5のStandardシェーダのパラメタをスクリプトからいじろうとして丸一日潰れた話 - D.N.A.のおぼえがき
(ここのコードはmaterialsではなく、sharedmaterialsにする必要があります)
■Instantiating material due to calling renderer.material during edit mode. - Unity Answers
7. 終わりに
ちょうど動画編集をする予定があったので、少し調べてみました。タイムライン機能を使えば他にも色々なことができそうなので、変わった使い方を見つけたらまた紹介できればと思います。