top of page

Up in the Air

About
High Concept
  • 13-Member Team Project in Unreal Engine 4

  • 6 Month Development Time

  • Programming Lead

Up in the Air  is an open-world, sandbox game set in a theme park overrun with children. The player plays as a balloon dog collecting tickets and coins by taking part in activities around the park.

Responsibilities
  • Task Creation, Prioritization, and Approval

  • Saving/Loading Architecture

  • User Interface

  • Universal Windows Platform and PS4 Builds

  • Embedding Icons in Text

Saving/Loading Architecture

When we started the project the first, and really only, thing we knew we needed to save was the tickets that the player had collected. The player obviously needed to retain the correct number of tickets but also should not be able to collect the same ticket twice. To do this, I made sure that tickets were never actually destroyed. Instead, they just hid themselves and disabled their collision. When the game saved, it would record the status of every ticket in the world. At load time, any tickets that had already been obtained disabled themselves.

In retrospect, this approach imposed a large number of constraints. For example, the game had to be saved in the main open world level. If it saved in any other level then the record of which tickets the player had collected would be lost. If I were to reimplement it, I would have tickets add themselves to a global list of obtained tickets that would be saved out. At load time, if a ticket was in that list it would be destroyed. This would remove any limitations about keeping tickets alive or saving in other levels.

Universal Windows Platform and PS4 Builds

At the onset of the project we felt that the game would be a good fit for consoles. However, we weren't sure exactly what console we'd like to put it on. One of the other capstone teams was already in the early stages of developing for PS4, so we decided to try developing for Xbox One using a Universal Windows Platform (UWP) version of our game to get our game on the console early.

To this end, I created a custom build of Unreal Engine 4 by merging the UWP version 4.16 branch of the engine provided by Microsoft with the main version 4.16.3 branch from Epic to match the version of the engine we were developing our game for. This allowed me to package a UE4 game for UWP. Unfortunately, the UWP packaging process did not support Wwise, which we had decided to use earlier in the project. Wwise has a UWP SDK, so I only needed to get Unreal to properly reference that SDK in the build process. This was done in the AKAudio.Build.cs file which handles adding the correct library and include paths to the build configuration for the AkAudio module. At this point Up in the Air could be packaged for UWP, but was never tested on an Xbox One due to needing approval for the contract for a Developer account.

When it became clear that that contract may be an issue, our stakeholders decided that we should pivot towards getting the game on PS4. The other team had already gotten approval to develop for it, so it was much faster for us to do the same rather than starting a whole new process. Additionally, they graciously let me use their build of UE4 which was already set up for packaging the game for PS4. To get Up in the Air running on a PS4, it was as simple as identifying a couple of areas of code that weren't compatible and fixing those issues.

Embedding Icons in Text

Late in development, we encountered an unexpected problem in the form of placing icons in text boxes. For example, "Press X to jump." should have the symbol for X rather than just the letter. The game was localized for English, Spanish, and Simplified Chinese and has rebindable controls. This made the placement of controller and keyboard icons very difficult as UE4 does not have any way to place an image directly into text. As such, where icons will be placed and what icon to use had to be determined at run-time.

 

One of the other programmers implemented the functionality for typing an action such as <Jump> or <Boost> and having that replaced with the text name of the key or button that corresponds to that action, such as Space or Shift. I piggybacked off of his code to determine what icon to place and replace the action "tag", such as <Jump>, with the corresponding text. In the case of button icons, an '@' was used and the icon was placed over it. Keyboard keys had the name of the key placed over a standard key icon that stretched to fit the key name. However, I still needed to calculate exactly where the icon will be placed. 

I calculated the position for an individual icon by creating a temporary copy of the text with all of the "tags" already replaced, split the text into lines on newlines and carriage returns, and used Unreal's Font Measurer to calculate the horizontal position of the icon. The vertical position was calculated using the line height and number of lines into the text the icon is. These positions are then returned to the Blueprint controlling whatever text element is having icons placed into it. Using the position, alignment, and text alignment of the text box along with the calculated relative positions the final locations for the icons are calculated and Image objects are constructed and added the panel that owns the text box at the calculated positions.

bottom of page