FrostRunner is a 3D speedrunning game with 36 levels where players run through them as fast as they can, break records on the global leaderboard and unlock bonus challenges with hidden collectibles. The game was shipped on Steam on Jan 1st, 2019.


  • Role: Programmer
  • Team Size: 14 (3 programmers)
  • Engine: Unreal Engine 4
  • Language/Tool: C++, UE4 Blueprints
  • Platform: PC
  • Dev Time: 6 months


  • Implemented the state machine
  • Implemented all animations
  • Implemented the options menu and its functions
  • Implemented the restart interface with event dispatchers and level blueprints
  • Prototyped gameplays mechanics like ice, spikes and air control and iterated on them
  • Committed the Agile Development and SCRUM

Game State Logics

State Machine

  • The state machine defines game states like
    Stasis, Death and Play and their transition logic
  • It provides state info to other modules. The UI system, for instance, decides what HUD layout to use based on current state.

Restart Module

  • The Restart Module provides a special way to communicate between game logic and level blueprints with event dispatcher. See the Level BP on the right.

  • In the Restart component, the dispatcher is called to restart level streams, and the state machine is reset


The Menu

  • The option menu configures game settings for controls, graphics, audios and game modes, allowing players to restore to defaults

Data-driven Restore

  • Each setting is binded with an event to restore its default value

  • When players choose to restore, the event visits the Game Instance and extracts default values from there


Animation Zoo

  • I set up the pipeline of testing animations in the animation zoo before integrating them into the game

Animation Graph

  • The animation graph works like a state machine used by the blueprints to update animations
  • Each individual state is provided, together with transition conditions among them

From Game Layer to Anim Layer

  • The animation layer visits game player data to alter states

  • For example, to distinct between ascending and descending animations, I use the character data IsFall to update animation data
  • One can also use events to inform things have happened directly from game layer to animation layer, like what I did for Fling and Jump above
  • The ultimate purpose is to sync animation states with game info.


Feature Zoos

  • I set up the pipeline of prototyping features with zoos, testing them with various setups and integrating them after that


Post Mortem

What went well

  • The game was successfully shipped on Steam and got excellent feedback. It has already become Guildhall’s most downloaded title after 10 days of release.
  • Having a programmer as the Game Designer helped tremendously on communications between level designers and programmers
  • Had a chance to learn new UE4 modules, especially the Animation and UI system

What went wrong

  • Art tasks overloaded, especially after the quit of an artist
  • Did not have a well-defined UI pipeline, causing responsibility confusions between artists and programmers
  • Did not have an effective pipeline to digest feedbacks from playtests

Action Plan

  • Maintain a healthy pipeline for UI where artists define layouts and resolutions while programmers integrate functionalities
  • Have a plan in extracting information from playtests and use the analysis to its advantage