Project Overview
Overgrown is a 2.5D RPG created through a collaboration between SCAD's GAME and ANIM departments and has had over 100 total contribution from students over a 3 quarter project. 
As systems lead on Overgrown, I defined our core gameplay architecture, facilitated seamless collaboration between game designers and animators, and built a versatile enemy base class that handles a wide variety of behaviors and state-switching logic. I programmed or supervised every enemy showcased, ensuring consistency and flexibility. 
Early in development I led the creation of our 2.5D animation pipeline, integrating hand-drawn 2D sprite animations into Unreal Engine’s 3D environment. This pipeline delivered responsive player controls, dynamic enemy reactions, and immersive environmental feedback, all while preserving the artistic quality of our animations and meeting the precise demands of real-time gameplay.
2.5D Animation Pipeline Overview
In week one we made the critical decision to adopt the PaperZD plugin as the foundation of our 2.5D pipeline. This choice addressed Unreal’s limited native 2D support and leveraged our team’s existing Unreal Engine expertise. PaperZD builds on Unreal’s standard character base and provides familiar tools such as state machines, montage slots, and animation blueprints. By committing to PaperZD so early we enabled rapid iteration and seamless integration of hand-drawn 2D sprites into our 3D world, keeping us on track to hit our tight production timeline.

8 Directional Animation Setup for Lily.  

Sprite flipping is handled through the character blueprint itself.

State Machine for Lily

All other animations are handled through "Animation Overrides" which are PaperZD's version of an Animation Montage.

Creating a Pipeline with Animators
Collaborating closely with our animation team, I established a strict iterative pipeline to handle constant gameplay changes without wasted effort. 
Collaborating closely with our animation team, I established a strict iterative pipeline: first, we required an in-engine rough pass before any animation entered Unreal, preventing wasted polishing; second, we standardized sprite frame dimensions across all character animations, eliminating manual resizing and speeding up imports; and finally, we defined a single pivot point per character to ensure consistent floor alignment. These guidelines cut hundreds of hours from our workflow and kept systems and animation teams perfectly synced.
I found Mariel Cartwright’s GDC 2014 talk “Making Fluid and Powerful Animations for Skullgirls” during my early research to bridge our systems and animation teams. Its guidance on achieving clear, fluid 2D animation in a fast-paced game using strong key frames, precise anticipation and tight timing even with only six frames for a punch directly shaped our rough-pass workflow. 
After rewatching the talk multiple times I partnered with our animation producer to make it a mandatory viewing for every new animator. That single session cut onboarding time in half, eliminated miscommunication and ensured our team shared a unified approach to delivering responsive and impactful animations from day one.

https://www.youtube.com/watch?v=Mw0h9WmBlsw

Putting Animations in Engine
Each animation begins as a sprite sheet that I extract into individual sprites before converting into a PaperZD flipbook in Unreal Engine. At this stage I fine-tune parameters such as pixels per unit, pivot location, frame rate, and can add extra frames as needed. 
Drawing on the Skullgirls talk, I routinely insert additional frames on large impacts to emphasize weight and clarity. This setup gives precise control over timing and alignment and ensures every animation feels responsive and polished in game.
For each character we set up an Animation Source to group and manage all of its animations. This approach replaces a traditional skeleton setup by tying sequences directly to a specific character or asset. 
Once a flipbook is imported, we convert it into an animation sequence inside its source. In this stage we add anim notifies for footsteps, attack traces, and other gameplay events. This structure keeps our project organized at scale and ensures every animation is correctly linked and easily maintainable.
Animation Logic Setup
With animation sources in place we connect animations to character logic using simple state machines. Our 2D hand-drawn art keeps setups basic, but PaperZD lets us insert transitional animations that play during state changes. This feature eliminates extra states and keeps our state machines concise. For all other animations we use the PlayAnimationOverrideWithCallbacks node. It mirrors the functionality of montages in 3D, letting us specify slots, play rates, start positions, and receive callback events. This combination delivers smooth transitions and precise control over gameplay timing.
Impact & Feedback Effects
After wiring up core animations, I focused on timing and feedback systems that amplify player actions. I developed a custom sprite shader to flash characters green when healed or red when damaged, and implemented a time-dilation function to slow game speed momentarily on heavy impacts. 
I also added simple screen shake cues tied to animation events. These combined effects give each slash and reaction real weight and ensure gameplay feels responsive and polished.

Once the ostrich is hit it goes back into the ground to reposition and attack you again.

The ram charges at the player, and you can use it to break destructible barriers.

Flipbook-Driven VFX 

The "Moshroom" is the first brute you meet which relies on its jump attack to attack a large AOE.

Most of our in-game VFX run on flipbooks, which I manage through a combined Material and Niagara setup. I feed each sprite sheet into a Material using the Flipbook node, generating animated UVs for the full frame sequence. 
In Niagara, I apply that Material to particle emitters and tweak parameters like playback speed, looping, and particle lifetime to create effects. This approach centralizes animation logic, lets me swap or adjust entire VFX sequences with a single texture update, and ensures consistent timing and polish across all our effects.
Lastly, I utilize Decals in order to project certain attacks so that the player has full clarity of what is going on at all times.

Players can lead the ram to charge at rock formations to clear new paths for them to explore.

The mortar enemy lobs high-arc projectiles that land on the player to create strategic threat zones.

The Bombagranite can be hit toward enemies do damage them in an AOE, or used to solve certain puzzles by breaking barriers!