Cutscenes in Unreal Tournament

(or, How To Be All Like Martin Scorsese And Stuff)

Cort Stratton (Mister Programmer, Sir)

The Coyote210 project introduces support for non-interactive, scripted in-game "cutscenes" into Unreal Tournament. This capability is vital when applying UT to any sort of theater context - without cutscenes, UT is a very action-oriented engine that doesn't lend itself very well to exposition or storytelling. Cutscene support gives content creators many new abilities:

Download UMS (cutscene only version) here!!

We're using a modified version of the Unreal Movie Studio system (UMS) for our cutscene support (many thanks to Hugh Macdonald and Stephen Deaver for writing UMS in the first place, and helping me figure out what modifications would be necessary). Note that since we DID modify UMS, downloading a new version from their web site just won't cut the mustard. UMS is designed to let users create entire feature-length scripted movies within the Unreal engine (a fascinating sub-culture called "machinima" has sprung up surrounding this very pursuit -- it's worth investigating). By default, UMS movies are entirely non-interactive -- a level is either playable, or it's a movie. Our challenge was therefore to modify UMS to let you embed cutscenes into an otherwise playable UT level, and trigger them when the player accomplishes certain actions or enters certain areas.

Solving this problem involved addressing three sub-challenges:

  1. Cutting the camera away from the player's view and into the the cutscene.
  2. Immobilizing and hiding the player, so they don't interfere with the cutscene by running around in the middle of the action (and so they don't get themselves into trouble while they can't see what they're doing!)
  3. Returning the camera view to the player's viewpoint at the end of the cutscene.

All three involved only minor changes to the code. Problem #1 is addressed in UMSCamera.UMSCamera class, in the "ExecuteCutTo" function. Problem #3 is essntially the same fix as problem #1, only in reverse; it's found in UMS1_6.Director, in the BackToMyTrailer() function. Problem #2 was the most difficult conceptually, but fairly simple to implement in the end -- the player is simply put into a new state called "Gimped" and his bHidden flag is set to true for the duration of the cutscene. These changes are found in CoyotePlayer (our descendant of the PlayerPawn class).

The easiest way to trigger a cutscene is through the UMS1_6.UMSTriggers class. Add a UMSTriggers object to your world, set its TargetDirector property to the Tag of the Director you wish to trigger, and you're done. The cutscene will trigger when the player steps within the CollisionRadius of the UMSTriggers object (and it will only trigger once for each trigger).

That's all I have to say about cutscenes. You still have many many questions, I'm sure, like how to actually script the cutscenes! Picky, picky...

Truth is, the UMS website has an excellent Tutorials section that'll teach you everything you need to know about the mechanics of UMS scripting.

Any questions, let me know.

Things to be aware of/future work: