top of page
Screenshot 2026-02-12 135035.png

Ricochet Rivals

<

>

Details

Role: Lead Programmer
Programmer Team Size: 4
Duration: 4 weeks
Engine & Language: Unity with C#
Link: 

Game

Ricochet Rivals is an exhilarating couch PvP game that combines simplicity with depth. Enter a fast-paced duel where only one can claim the title of the ultimate Ricochet Rival. Equipped with a cannon, a sword, and an alarming lack of self-care, you’ll plunge into chaotic arenas where every shot, hit, and bounce brings you and your opponent closer to certain doom.

Contribution

As Lead Programmer, I owned the technical foundation of the project and implemented most of the core gameplay systems. I defined the architecture, structured the codebase for scalability, and guided key technical decisions throughout development. In addition to my own implementation work, I coordinated the programming effort by assigning tasks and providing technical oversight to the other programmers. My work played a major role in shaping the technical stability and overall feel of the final game.

Core Gameplay Systems

Multiplayer Systems

Game Management

Player Systems

User Interface

Technical Infrastructure

Core Gameplay Systems

Shooting and Deflecting

The shooting mechanic is charge-based: holding the button increases bullet speed, and releasing fires the shot. Deflecting evolved during development, it initially required holding to aim and releasing to activate, but was later redesigned as a quick single-press action.

When deflecting, a temporary collider activates around the player. Any bullets detected within a short window are redirected and have their ownership reassigned to the deflecting player.

Bullet Mechanics

The bullet system was one of the most challenging parts, since the entire game revolves around shooting and deflecting. Each bullet tracks stats like speed, size, ricochet count, and ownership, updating dynamically as it bounces. To increase intensity over time, bullets grow slightly in speed and size with every ricochet, preventing overly defensive play.

A major challenge was correctly transferring ownership on deflection, as players cannot be damaged by their own bullets. I also implemented ricochet limits to prevent map clutter and fixed edge cases like multiple collision registrations within a single frame.

After extensive playtesting and iteration, the system became reliable and satisfying, allowing skillful deflections and aggressive plays without feeling unfair or unpredictable.

Player Systems

Player controller framework

The Player Controller acts as the central hub for the player prefab, coordinating all attached systems and exposing key variables for designers. It drives a lightweight state machine (Alive/Dead) and ensures consistent updates across movement, shooting, and other components.

When a player dies, the controller handles visibility changes, calls the spawn system to retrieve the next best spawn point, and reactivates the player after a delay. This structure keeps player logic organized, scalable, and easy to expand with additional states in the future.

Player movement system

The movement system is built for responsive 2D control while maintaining clear visual feedback. I separated aiming and movement by using dedicated child transforms, one rotates toward input direction for aiming, while another rotates the player model toward movement direction. This keeps gameplay readability high in a fast-paced PvP environment.
​
We briefly implemented a dash mechanic using time-based velocity interpolation. During development, I encountered a complex execution-order bug where the dash only worked correctly under specific inspector conditions. After investigating, I traced the issue to state machine update order and resolved it by restructuring function execution.

Respawn & spawn optimization logic

The respawn system was designed to minimize unfair deaths and immediate re-engagement. Instead of selecting a random spawn point, I implemented a distance-based evaluation system. For each respawn, the script iterates through all spawn points, calculates the closest player to each one, and selects the spawn whose nearest player is the farthest away.

This ensures that respawning players are placed as safely as possible relative to opponents, reducing frustration and maintaining competitive flow in fast-paced matches.

under_construction.png
bottom of page