Search Unity

Timeline is a powerful tool for creating cutscenes and short movies. But there’s more to it! Let’s see how we can leverage Timeline to blend gameplay and storytelling, bringing our game to the next level.

With the release of 2017.1, Unity added a new and powerful tool to its arsenal: Timeline. You have probably seen at this point how creators have leveraged Timeline to create incredible short movies, like Neil Blomkamp’s Adam Episode 2 and 3 or Unity’s own Book of the Dead, or to add storytelling to their games.

This all sounds very exciting, but as a game developer, the question that I asked myself when I saw Timeline was: is it really just a linear sequencing tool? Can I only create cutscenes with it? Interrupt the gameplay, play a non-interactive sequence that advances the story, and resume gameplay?

With this question in mind, I created a small demo to use Timeline in a creative way. I made a little Real-Time Strategy game, in which I used some custom Timeline tracks to achieve a couple of interesting effects. And I found the answer to my question (spoiler): with a little bit of scripting, Timeline can do so much more.

Assets alert!

If you want to look into the demo that I created while you read, it can be downloaded here. I called it “A Terrible Kingdom” since it uses the graphic assets of “A Mighty Kingdom”, the demo used in the keynote for Vision Summit 2017. But I remixed them a little bit for the purpose of this demo.

Idea 1 – Stopping the Timeline

Let’s start with a simple scenario. Let’s say I want the Timeline to incorporate a dialogue, and I want it to stop automatically to allow the viewer to read the text on screen. When the Spacebar is pressed, the Timeline resumes.

Since this functionality goes hand in hand with the text on the screen, I created a custom track called Dialogue Track that hooks into the UI Manager of my game. Each clip has as properties the text to display, and a simple boolean to decide whether to stop or not. This is the Inspector of the clip:

Each clip on this track tells the UI Manager to display the dialogue UI, what text, and what size to use. Additionally, it can tell the GameManager to stop the Timeline and passes a reference to which one, so the GameManager – once Spacebar is pressed – knows which Timeline to resume. When the clip ends, it tells the UI Manager to hide the dialogue box.

Pretty simple stuff, but it allows me to quickly build dialogues and decide when to stop, or not! (notice that the dialogue where Andy screams “Oi!” doesn’t stop, because it’s non-important text). Here’s how the Timeline looks like:

Idea 2 – Non-linear Timelines

What if I want to rewind the Timeline? Not at the end (that would be easy: just set it to loop!) but at any arbitrary point, and only when a specific condition is verified. This basically allows for non-linear Timelines: sometimes they go back, sometimes they don’t. You can almost imagine them as if they contained an if-else statement.

In this example, I have created a Timeline that animates a storm: the sunlight dims, flashes appear in the sky, lightning strikes hit the ground, and rain start falling down.

I didn’t just create the storm as one continuous sequence, but I envisioned it as three parts. At the beginning, there’s the “transition in”, while the end has a “transition out” to normal weather. In the middle, I left a section of the Timeline which will play during gameplay. Notice there are no Cinemachine clips, so Timeline gives control back to the regular gameplay camera.

I want the storm to go on as long as those two little monsters are alive. I want Timeline to play the intro, play the gameplay part, and just before hitting the outro, I want it to evaluate a condition: are those two little monster dead? If no, rewind the gameplay part and keep playing. If yes, just play the outro.

Enter the Time Machine Track. Clips here can have two functions. One is to act as named markers (see the first clip), the other is to rewind or fast-forward the Timeline to a specific Marker or time. Let’s call this the “action” of the clip.

The other important property of the clips is the “condition”. It can be always, never (basically muting the clip), or if a group of units is dead. Notice how if the two monster are alive, the Timeline rewinds:

While if they are dead, it just goes on without interruption, playing the outro:

A note: This “is-dead” condition is very specific to my game, but you can come up with something new for your own specific needs, by plugging into the gameplay logic. Has the player reached a certain point? Has the player collected enough of a specific resource? The possibilities are endless!

Now for the result:

The storm starts, then gameplay resumes and the storm goes on, rewinding a couple of times. As you can see, it’s a seamless rewind. Then, once the monsters are defeated – after a couple of seconds – the storm ends and gameplay resumes again.

Idea 3 – Plugging Timeline into the game systems

This is where things get exciting. Until now, we have put our animation on the Timeline. But what if we could defer this animation to some other system in our game? In my little RTS Demo, I have one very important system that’s active all the time: the game AI. This system is responsible of moving units around (by virtue of the NavMesh Agent), of controlling their Animator components and having the the units play the right animations at the right time: walking, idle, attack, or die.

So, say now I want to choreograph a big battle. I have two ways to do it: one is to create dozens of tracks, one for each unit, and then add hundreds of little animation clips: attack, move, attack, move again, attack again, and then die. All of these need to be adjusted in time, and some offset needs to be applied if I want them to match in space. All in all, it’s a lot of work.

The other way is what I did with my AI Command track: this scripted track takes a special type in the binding, that I called “Platoon”. The Platoon is nothing else than a small script with an array of units. When you send a command to the Platoon script, it “broadcasts” the command to all of the units in its array. I actually use it for the selection in the game, creating a Platoon with the selected units to issue mouse commands.

Back to the Timeline. By binding a Platoon to the AI Command track, I’m able to create clips that represent one command: move there and stand still, move there and guard, attack this specific unit, or even… die on the spot! When the Timeline is played, the units belonging to that Platoon will listen to these commands which will take precedence over whatever they were doing before, resulting in the ability to sequence commands on the AI on the Timeline.

Add in a few camera shots (using Cinemachine, of course!), and you have a big battle with dozens of units using just 3-4 AI Command tracks:

Let’s see the result:

Summing it up

I hope to have sparked your curiosity and creativity with this post. Next time you look at Timeline, think: what could I do with it? Create a Quick-Time-Event system? Orchestrate entire battles? Plan the bullet patterns in a Bullet Hell shooter? (I’m seriously thinking of doing it)

There’s so much you can do with Timeline, a little creativity, and some scripting. I would personally love to hear what you come up with here in the comments or on Twitter. Get creating!

22 Comments

Subscribe to comments

Comments are closed.

  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

      April 17, 2018 at 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

      April 6, 2018 at 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

          April 8, 2018 at 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

          April 9, 2018 at 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

      April 5, 2018 at 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. Isaac Surfraz

      April 5, 2018 at 5:04 pm

      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

          April 5, 2018 at 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