Search Unity

タイムラインは、カットシーンや短編動画を作成するための強力なツールですが、それだけではありません!タイムラインを利用してゲームプレイとストーリーテリングを融合させ、ゲームのクオリティを一段階向上させる方法をご紹介します。

バージョン 2017.1 の公開をもって、Unity に新しく強力なツール「タイムライン」が搭載されました。すでに皆様も、タイムラインを活用した素晴らしい短編映像作品『Adam』 Episode 2・3(ニール・ブロムカンプ監督制作)や『Book of the Dead』(Unity 制作)、あるいはストーリーテリングにタイムラインを活用したゲームをご覧になったことがあるかもしれません。

ワクワクするような話ですが、ゲーム開発者としてタイムラインを見た時に私が抱いた問いは、「これは本当に単なるリニアシーケンシングツールに過ぎないのか?」というものでした。タイムラインはカットシーンの作成にしか使用できないのでしょうか?ゲームプレイを中断し、ストーリーを進めるための非インタラクティブなシーケンスを再生し、またゲームプレイに戻る ― ただそれだけなのでしょうか?

私はこの問いを持ちながら、タイムラインをクリエイティブな形で使用するための小さなデモを作成しました。ちょっとしたリアルタイムストラテジーゲームです。このゲームには、カスタムのタイムライントラックで作成した面白いエフェクトをいくつか含めました。そして、このデモの作成を通じて、上述の「問い」に対する答えを得ることができました ― つまりタイムラインは、少しのスクリプティングさえ行えば、カットシーンの作成だけにとどまらず、非常に多様な使い方ができるということです。

アセットについて

私の作成したデモを確認しながら本記事をお読みになりたい場合は、こちらからデモをダウンロードしてください。デモの名前は、Vision Summit 2017 の基調講演で使用されたデモ『A Mighty Kingdom』のアセットを使用していることから『A Terrible Kingdom』としました。(ただし、アセットはデモの目的に合わせて若干調整されています。)

活用案 1 ― タイムラインを停止する

簡単なケースから始めてみましょう。タイムラインにダイアログ UI の表示を組み込み、画面上のテキストをプレイヤーが読めるように自動的に停止させたいとしましょう。スペースキーが押されると、タイムラインが引き続き再生されます。

この機能は画面上のテキストと密接に関連しているので、Dialogue Track というカスタムトラックを作成しました。このトラックは、このゲームの UI マネージャーに接続します。各クリップが、表示するテキストと、それを停止するか否かを決定する単純なブール値を 1 つ、プロパティとして持っています。以下はクリップのインスペクターの画像です。

このトラックの各クリップが、ダイアログ UI と使用するテキストとそのサイズを UI マネージャーに指示します。さらに、GameManager に対してタイムラインを停止する指示と特定の参照を渡す指示を与え、(スペースキーが押された時に)どのタイムラインを復元再開するべきかを GameManager に把握させることができます。クリップが終了すると、そのクリップから UI マネージャーに対してダイアログボックス表示終了の指示が与えられます。

このように簡単なステップで、ダイアログの構築と、停止させる(あるいは停止させない)箇所の決定を、素早く行うことができるのです!(例えば、Andy が「Oi!」と叫ぶ箇所では、重要なテキストではないのでダイアログが停止されていません。)タイムラインは以下のように表示されます。

活用案 2 ― 非リニア・タイムライン

タイムラインを巻き戻したい時はどうすれば良いでしょうか。終了時点からの巻き戻しは、単純にループに設定すれば良いので簡単なことですが、それ以外の任意の時点から、特定の条件が満たされた時にのみ巻き戻したい場合はどうでしょうか。この場合には、非リニア・タイムライン(巻き戻しを時には行い、時には行わない)を使用できます。これはちょうど、if-else 命令文を含んでいるようなものであると考えてください。

この例では、嵐のアニメーション化を行うタイムラインを 1 つ作成しています。日の光が薄暗くなり、空に閃光が現れ、稲妻が地面に落ちて雨が降り始めます。

嵐は、単純に 1 つの連続したシーケンスとして作成されたものではなく、3 つの部分から構成されたものとして捉えてください。冒頭部には通常の天気からの「移行(transition in)」、終わりの部分には通常の天気への「移行(transition out)」があります。タイムラインの中間部には、ゲームプレイ中に再生される部分が残っています。Cinemachine クリップはないので、タイムラインから通常のゲームプレイカメラに制御が戻されることにご注目ください。

2 体のモンスターが生きている間はずっと嵐が続くようにします。タイムラインにイントロを再生させ、次にゲームプレイ部分を再生させ、アウトロに到達する直前で、特定の条件(モンスターが 2 体とも倒された)が満たされているかどうかを判定させます。モンスターが生き残っている場合はゲームプレイ部分が巻き戻されて引き続き再生されます。モンスターが 2 体とも倒された場合はアウトロのみが再生されます。

Time Machine トラック を開いてください。ここにあるクリップには 2 つの機能を持たせることができます。ひとつは名前付きのマーカ―としての機能(最初のクリップ参照)、もうひとつはタイムラインを特定のマーカーまたは時点に巻き戻し・早送りする機能です。これを、クリップの「アクション」と呼ぶことにしましょう。

クリップのプロパティでこの他に重要なのが「condition(条件)」です。これは、「always(常に)」、「never(クリップを実質的に無効にする)」、あるいは「if a group of units is dead(ユニットのグループが倒された)」に設定できます。モンスターが生き残っている場合にはタイムラインが巻き戻されます。

モンスターが 2 体とも倒された場合は進行が中断されることなくアウトロが再生されます。

(注)この「is-dead(倒された)」条件はこのゲーム固有の条件ですが、それぞれのゲームに合わせて、必要に応じてゲームプレイのロジックに組み込んで新しい条件を設定できます。「プレイヤーが特定の地点に到達しているか?」「プレイヤーが特定のリソースを十分な数収集したか?」など、可能性は無限です!

それでは、結果を見てみましょう。

嵐が始まり、ゲームプレイが再開され、嵐が続き、数回巻き戻されます。ご覧の通り、シームレスな巻き戻しです。その後モンスターが倒されると、数秒後に嵐が終わってゲームプレイが再び再開されます。

活用案 3 ― タイムラインをゲームシステムに接続する

面白くなるのはここからです。ここまでは、アニメーションをタイムライン上に載せていました。しかし、このアニメーションをゲーム中の他のシステムに従わせることができるとしたらどうでしょう?この RTS デモでは、常にアクティブになっている非常に重要なシステムがあります。それはゲーム AI です。このシステムは、ユニットを(ナビメッシュエージェントによって)移動させたり、Animator コンポーネントを制御してユニットが正しいアニメーション(歩き・待機・攻撃・死亡)を正しいタイミングで再生するようにするものです。

例えば、大きな戦闘の動きの演出を行いたいとしましょう。これは 2 つの方法で行えます。ひとつは、何十ものトラックを(ユニット毎に 1 つ)作成して、何百もの小さなアニメーションクリップ(攻撃・移動・攻撃・再移動・再攻撃・死亡)を追加する方法です。これら一つひとつを時間内に調整しなければならず、また空間内で適合させたい場合はオフセットを適用する必要があります。概して言えば、これは大変な作業です。

このデモでは、もうひとつの方法を使用しています。「AI Command」トラックがこれに当たります。このスクリプトされたトラックは、「Platoon」と名付けられた特殊なタイプをバインディング内に 1 つ取ります。Platoon は、ユニットの配列を 1 つ持った 1 つの小さなスクリプトに過ぎません。Platoon スクリプトにコマンドを送ると、そのコマンドが配列内の全てのユニットに「送信」されます。このデモでは実際にこれをゲーム内でのユニット選択に使用しており、選択されたユニットに応じて編隊を作成し、その編隊に対してマウスのコマンドを発行しています。

タイムラインの話に戻しましょう。特定の Platoon を AI Command トラックにリンクさせることで、特定のコマンド(特定の地点に移動して停止、特定の地点に移動して攻撃、特定の地点に移動して防御、特定のユニットを攻撃、あるいはその場で死亡など)のクリップを作成することができます。タイムラインが再生されると、その Platoon に所属するユニットがこれらのコマンドを受け、その時点で行っているアクションよりもそのコマンドを優先します。このようにして、タイムライン上で AI のコマンドの順序付けを行うことができるのです。

カメラショットをいくつか追加(もちろん Cinemachine を使用して!)すれば、数十ユニットによる大戦闘が 3 ~ 4 つの AI Command トラックのみで実現可能です。

それでは、結果の映像を見てみましょう。

まとめ

本記事が皆様の好奇心と創造力に火をつけることができたなら幸いです。次にタイムラインを開いた時には、「これを使ってどんな事ができるだろう?」と是非考えてみてください。クイックタイムイベントのシステムを作成してみますか?戦闘を丸ごとデザインしてみますか?弾幕シューティングゲームの弾丸のパターンを作成してみますか?(これは、私も試してみようと考えています。)

タイムラインを使ってできることは実に沢山あります。それは、少しの創造力と、ある程度のスクリプティングによって実現できます。皆様の創造力に富んだタイムライン活用案を、本記事のコメントや Twitter に是非お寄せください。楽しみにお待ちしています!

22 コメント

コメントの配信登録

返信する

これらの HTML タグや属性を使用できます: <a href=""> <b> <code> <pre>

  1. Careful guys with the timeline or you could open the gate of hell and recreate a Flash like workflow (which is absolutely the worst. Having code spread to several frames rather than organised in class is just an abomination).
    Just don’t try to push too far this “creative” approaches. Very often creative stand for not being able to use the tool correctly.

    Cheers

    1. Ciro Continisio

      4月 17, 2018 11:43 pm 返信

      “The gate of hell”, haha :) Actually, I’m an ex-Flash developer myself so I know what you mean. But don’t worry, Diego: the code is still organised into classes, it’s not sitting on the frames themselves. So while the result is creative, the code underneath it is pretty solid and easy to maintain.

  2. Permisi boss, numpang info ya..
    Ayo ikuti Kontes SEO KiosCasino dengan Keyword “Judi Sbobet Livecasino 338a Agen Bola Piala Dunia Online KiosCasino”
    Total Hadiah : Rp. 30.000.000 untuk 20 orang pemenang

    Untuk informasi lebih lengkapnya silahkan kunjungi website http://www.kioscasino.info/kontes/

  3. And again? Do comments with links need approval or something? Long story short I’ve written an extension that allows arbitrary code execution from timrline. Find it on GitHub unitytimelineevents georgejecook.

    1. it’s because of spammers I’d say – which is a good thing then – but little help _before_ posting would certainly be welcome to avoid confusion afterwards

  4. Nice post.

    I’m also doing what I call timeline oriented design. I wrote a comment just now but it dissappeared.

    I’ve written a track that allows timeline execution of arbitrary code.

    Source is here. https://github.com/georgejecook/UnityTimelineEvents

    Blog post here https://www.codementor.io/georgejecook/how-i-learned-unity3d-timelienes-hucjgw52v

    I used timeline oriented design extensively in http://store.steampowered.com/app/626730/The_Incredible_VR_Game_Show/

  5. Huh!? Where’d my comment go?

  6. Great post. I’m actually focusing very heavily on what I call timeline orientrd design.

    I’ve made a solution for timeline that allows arbitrary execution of code with parameters. It exapnds on one or two of the ideas in this post.

    Code here.

    https://github.com/georgejecook/UnityTimelineEvents

    Introductory blog post here. https://www.codementor.io/georgejecook/how-i-learned-unity3d-timelienes-hucjgw52v

    I have a series on timeline oriented programming too. The next blog post is just waiting approval from codementor.

    I’ve used this technique extensively in my VR game
    http://store.steampowered.com/app/626730/The_Incredible_VR_Game_Show/

    What exciting times for unity developers !!

  7. I wanted to use it in a recent project. but the timeline editor would run out of memory, will try to reproduce and file a bug report

    1. Ciro Continisio

      4月 6, 2018 12:21 pm 返信

      That would be great, Matthias. Reproduction projects in bug reports are a huge help in getting the bug fixed!

      1. But there’s 4 posts here with links which are utter spam. Great. Glad I spent 5 minutes of my valuable time to craft a usefuk response for the benefit of the community only to get marked as spam only to see multiple genuine spam comments in this thread.

        Slow clap

        1. Ciro Continisio

          4月 8, 2018 4:41 pm

          I’ll ask the social team to look into it. If you’re comment has been marked as spam, it should be still there and can be re-enabled. Hold on over the weekend! :)

        2. Ciro Continisio

          4月 9, 2018 12:42 pm

          Legit comments are back! Spam has been eradicated :)

  8. Nice, back years i made this project woth this technology in beta https://www.youtube.com/watch?v=ZpoNrvqkI98&t=8s

  9. Really interesting. I’m wondering, can timeline be used with instanced game objects? For example I want to create a cutscene with the player character and spawn an NPC by script and control all the dialogue, sound and animation for both characters.

    1. Ciro Continisio

      4月 5, 2018 5:56 pm 返信

      Yes you can! I’ve used a Control track (which is in-built) in this very demo to spawn the lightning bolts you see in the second example. They are all pre-instantiated as soon as the Timeline starts and kept hidden, and used when the playhead hits the clips.

      Also, you can dynamically reassign the binding objects in each track, so you can have a Timeline that is authored on a “dummy” object, and then this is swapped for the real character (instantiated by Timeline, or not) at runtime.

  10. after 16 years industry got to the point where it’s ‘easy enough’ ™ for anybody to create blizzard’s warcraft 3 cinematics
    not sure what does it mean

    1. Not sure you actually read the post or looked at the code?

      1. I looked at the result
        I didn’t mean the comment as negative btw

        1. Ciro Continisio

          4月 5, 2018 6:02 pm

          It actually made me laugh, I got the irony.
          The reason why I went for these low-poly characters is because I had this very specific idea of using Timeline to piggyback on the logic of an RTS game… and it so happened that we had these assets lying around that we could distribute freely!
          I hate to make demos that I can’t share because of the content! :)

        2. glad you’re not offended by it )
          poly is one thing but animation activation and slightly robotic movement changes are _exactly_ like in those cinematics – that’s what reminded me of them ;-) but probably genre setting too yeah

    2. not sure why you think anyone owes you a magic tool that somehow lets you make warcraft 3 cinematics by yourself without requiring any work