Unreal Engine 5 · Senior Capstone

Monkey Mondays: The Game

A physics-driven third-person puzzle adventure built around expressive ragdoll movement, environmental interaction, atmospheric spaces, and aggressive banana enemies.

The Goal

Our team set out to create a comedic horror game where unstable physics were not simply a visual effect, but a central part of movement, combat, puzzles, and enemy interactions.

  • Make physics-driven movement expressive without making it frustrating.
  • Turn collisions, falls, and enemy attacks into memorable gameplay moments.
  • Build enemies capable of physically interacting with the player's ragdoll.
  • Use lighting and environmental effects to guide players through the facility.
  • Maintain playable performance despite heavy physics, AI, VFX, and animation costs.

Active Ragdoll Character Controller

I helped develop the game's physics-driven character controller, using forces and torque to control a simulated body rather than relying entirely on a traditional animated character capsule.

  • Calculated movement relative to the player's camera.
  • Applied movement forces and target velocity through the character's pelvis.
  • Used rotational torque to turn the body toward the intended direction.
  • Projected movement across slopes to prevent unnatural uphill and downhill behavior.
  • Tuned jumping, vertical velocity, acceleration, and force limits.
  • Balanced player responsiveness against the instability that gave the game its personality.
An early controller prototype using the monkey character in a test environment. This stage focused on force-based movement, body orientation, swinging, and maintaining control while the full skeleton remained physically simulated.

Balancing Control and Chaos

The largest challenge was making a physically simulated character feel responsive. Too much force caused overshooting, sliding, and unstable movement, while too little force made the character feel slow and unresponsive.

  • Replaced simple impulse-driven movement with target-velocity control.
  • Normalized diagonal input to prevent faster diagonal movement.
  • Limited excessive vertical velocity and repeated jump forces.
  • Adjusted torque independently from translation for more reliable turning.
  • Preserved physical reactions when enemies or environmental objects disrupted the player.

Physics-Aware Enemy AI

I developed the behavior systems for enemies that detect the player, investigate sounds, chase, attack, latch onto the ragdoll, and recover after being repelled.

  • Built state-based logic with Unreal Engine Behavior Trees and Blackboard data.
  • Created custom tasks, decorators, services, and perception behavior.
  • Supported visual detection and sound-based investigation.
  • Coordinated enemy attacks with physics constraints and attachment logic.
  • Handled interruption, detachment, recovery, and return-to-patrol states.
  • Prevented conflicting behaviors such as attacking while already attached.
Full Monkey Mondays enemy behavior tree in Unreal Engine
The complete enemy behavior tree, divided into branches for patrolling, sound investigation, chasing, attacking, attaching, and recovery.

Sight, Sound, and State Changes

Enemies used player-sighting information and sound locations stored in the Blackboard to choose their next action. When an enemy heard a sound without seeing the player, it could interrupt its patrol, investigate the location, play an alert response, and then return to patrolling if the player was not found.

Sound alert branch of the enemy behavior tree
The sound-alert branch handles investigation, animation, Blackboard updates, and returning the enemy to patrol.
Enemy chase branch in the Unreal Engine behavior tree
The chase branch manages confusion effects, movement toward the player, interruptions, and attack preparation.

Attacking and Latching

Enemies did more than damage the player. They could physically leap toward the ragdoll, attach themselves to the body, and interfere with movement. This meant the AI logic had to coordinate with the game's physics constraints and track whether the enemy was attacking, attached, detached, or being repelled.

Attack and attachment branches of the Monkey Mondays behavior tree
Separate attack and attachment branches prevent the enemy from repeatedly attacking while already connected to the player's body.

Custom detach and repel behaviors allowed the enemy to release the player cleanly, recover from the interaction, and transition back into its normal behavior cycle.

Repelled branch of the Monkey Mondays enemy behavior tree
The repelled state coordinates detachment, recovery behavior, and the transition back into the wider decision system.

Lighting and Player Guidance

I created and refined environment lighting throughout the game, focusing on atmosphere, readability, and guiding the player through otherwise visually similar laboratory spaces.

Lighting was used to separate transitional hallways from important gameplay rooms. Neutral overhead lighting established the facility's cold, clinical foundation, while stronger color, fog, contrast, and directional light identified major destinations and created a sense of unease.

Dim laboratory hallway from Monkey Mondays
Repeating overhead fixtures and atmospheric fog create depth while keeping the hallway's destination visible.
Laboratory hallway leading into a green-lit room
The saturated doorway contrasts against the neutral corridor, drawing the player's attention toward the next gameplay space.

The Pizza Room

The pizza room needed to feel different from the surrounding facility while remaining part of the same environment. I used green lighting, volumetric atmosphere, shadow, and a concentrated overhead focal light to make the room feel contaminated and threatening.

The central lighting composition directs the player toward the table and pizza piles, while the darker edges of the room obscure threats and support the game's horror tone.

Green-lit pizza room from Monkey Mondays
The final room uses a bright central focal area surrounded by darker walls and corners.
Close-up of pizza boxes and an enemy in the pizza room
Close-range lighting preserves the silhouettes of gameplay objects while maintaining the room's sickly green atmosphere.

VFX and Environmental Detail

I developed Niagara effects and reactive environmental details that helped communicate gameplay events and made the facility feel more dynamic.

  • Created Niagara systems triggered by gameplay and physical collisions.
  • Passed color, scale, and other parameters into reusable effects.
  • Developed collision-driven decals that accumulated across surfaces.
  • Integrated effects with gameplay actors instead of treating them as isolated visuals.
  • Limited collision checks and accumulated effects to reduce runtime cost.
A gameplay-driven Fabricator effect created in Niagara. The system combines animated particles, lighting, and timed visual feedback to communicate the machine's operation to the player.

Optimization

Physics simulation and enemy actors were among the project's largest runtime costs. I used Unreal's profiling tools to identify systems that continued updating even when their owning Actors appeared inactive.

  • Profiled physics, Blueprint, animation, AI, and World Tick costs.
  • Identified enemy actors as a major source of frame-time instability.
  • Disabled ticking at both the Actor and individual component levels.
  • Deactivated rendering, animation, collision, and physics for inactive enemies.
  • Moved appropriate repeated checks from Tick to timed intervals.
  • Reduced unnecessary traces and expensive Niagara collision updates.
  • Supported instancing and level-management work for dense environments.

A Key Discovery

Hiding an enemy or disabling its main Actor Tick did not remove all of its runtime cost. Individual skeletal, collision, physics, and other components could continue updating independently.

I investigated the enemy hierarchy component by component and developed a more complete activation system that disabled or restored each expensive system as needed.

  • Visibility alone was not enough.
  • Actor Tick alone was not enough.
  • Component activity had to be managed explicitly.
  • Profiling was used to verify improvements instead of relying on assumptions.

What I Learned

Monkey Mondays taught me how closely gameplay programming, technical art, AI, physics, and optimization affect one another in a system-heavy game.

  • Unpredictable gameplay still needs carefully designed boundaries.
  • Physics interactions must remain readable, even when they are intentionally chaotic.
  • AI behavior must account for both logical state and physical state.
  • Visual effects and lighting decisions can directly affect gameplay clarity and performance.
  • Actor-level settings do not always represent the full runtime cost of their components.
  • Profiling early is more reliable than attempting to optimize from intuition.
  • Cross-disciplinary communication is essential when one system affects several teams.

The project strengthened my ability to move between player experience, visual presentation, technical implementation, and runtime performance while keeping each decision focused on the final game.