Role: Lead Programmer (Full-Stack & Network Engineer)
Game Engine & Tools: Unity, Photon PUN2
Language: C#
Engineering Contributions Overview
Developed and debugged randomized matchmaking using Photon PUN and C#.
Programmed player movement and interaction scripts, which include shell collection mechanics, for online multiplayer and offline practice modes.
Designed and implemented a synchronized match timer system to ensure all players start the game simultaneously.
Built camera rotation systems for Photo and Combat Mode, ensuring smooth transitions between both perspectives.
Seaside Showdown is a third-person online multiplayer game where players control hermit crabs engaging in fast-paced PvP melee combat.
Given how the core gameplay loop relies on real-time player interaction, the game required synchronization across all connected clients to ensure all players saw an accurate representation of the match.
A major factor of this challenge involved synchronizing each player's appearance. The in-game hermit crabs frequently change shells (or loadouts) to gain new abilities, making these visual changes crucial for reading an opponent's stats and abilities. When a player swaps shells, other players need immediate updates, as it signals potential changes in mobility, attack reach, or defensive strength. Player color also needed to be updated in order to allow players to differentiate one another during the chaos of a match.
Additionally, the game required a respawn system to account for "knocked out" players. This would involve updating the player's visibility; assigning a new respawn location at random; and restoring their current shell to the default state.
To synchronize player state across all game instances, the Player class integrates a series of PunRPC calls from Photon PUN 2's SDK. These RPC methods are responsible for ensuring each connected game instance receives the same updates for player appearance, loadout, and state.
Featured below are examples of Player class methods that handle updating the player's color, equipping or removing shells, and respawning.
-RPC_SendColor(): Synchronizes Player Color.
This method updates the color of the player's non-shell body across all clients. Given the hermit crab model is composed of multiple child objects, the method iterates through each MeshRenderer child component to ensure consistent coloring for the model.
-RPC_EquipShell(): Synchronizes Equipping a New Shell.
This method updates the player's current shell by using an index that references the player's list of available shells. The selected shell model is then activated across all instances of the game, ensuring an accurate loadout is visible to everyone.
The method also removes the player's "vulnerable" status, which is a state where the player has no equipped shell and is unable to defend against incoming damage, reflecting their restored defense.
-RPC_RemoveShell(): Synchronizes Shell Removal.
This method removes the player's current shell by using the shell's index and deactivating the corresponding model across all instances of the game.
To prevent null reference errors when a player interacts without an equipped shell, an invisible placeholder shell is used.
-RPC_Respawn(): Synchronizes Player Respawn State.
This method respawns a knocked-out player and updates their new state across all game instances.
The following steps occur whenever a player is set to respawn:
Sets the player GameObject to inactive.
Resets the player's current shell to the default starting shell.
Selects a new random spawn location on the map and updates the player's transform to the location.
-RPC_VisibleAgain(): Restores Player Visibility After Respawning.
This method reactivates a previously inactive player to be visible again for all game instances. It also ensures that the player resets with the default starting shell to prevent any unintended advantages when rejoining the match.